1616import org .hibernate .metamodel .mapping .BasicValuedMapping ;
1717import org .hibernate .metamodel .mapping .JdbcMapping ;
1818import org .hibernate .metamodel .mapping .JdbcMappingContainer ;
19+ import org .hibernate .metamodel .mapping .MappingModelExpressible ;
1920import org .hibernate .metamodel .model .domain .EntityDomainType ;
2021import org .hibernate .query .ReturnableType ;
2122import org .hibernate .query .sqm .SqmExpressible ;
@@ -53,12 +54,22 @@ public ReturnableType<?> resolveFunctionReturnType(
5354 ReturnableType <?> impliedType ,
5455 List <? extends SqmTypedNode <?>> arguments ,
5556 TypeConfiguration typeConfiguration ) {
56- return isAssignableTo ( invariantType , impliedType )
57- ? impliedType : invariantType ;
57+ return resolveFunctionReturnType ( impliedType , null , arguments , typeConfiguration );
5858 }
5959
6060 @ Override
61- public BasicValuedMapping resolveFunctionReturnType (Supplier <BasicValuedMapping > impliedTypeAccess , List <? extends SqlAstNode > arguments ) {
61+ public ReturnableType <?> resolveFunctionReturnType (
62+ ReturnableType <?> impliedType ,
63+ Supplier <MappingModelExpressible <?>> inferredTypeSupplier ,
64+ List <? extends SqmTypedNode <?>> arguments ,
65+ TypeConfiguration typeConfiguration ) {
66+ return isAssignableTo ( invariantType , impliedType ) ? impliedType : invariantType ;
67+ }
68+
69+ @ Override
70+ public BasicValuedMapping resolveFunctionReturnType (
71+ Supplier <BasicValuedMapping > impliedTypeAccess ,
72+ List <? extends SqlAstNode > arguments ) {
6273 return useImpliedTypeIfPossible ( invariantType , impliedTypeAccess .get () );
6374 }
6475
@@ -72,13 +83,27 @@ public String getReturnType() {
7283 public static FunctionReturnTypeResolver useArgType (int argPosition ) {
7384 return new FunctionReturnTypeResolver () {
7485 @ Override
75- public ReturnableType <?> resolveFunctionReturnType (ReturnableType <?> impliedType , List <? extends SqmTypedNode <?>> arguments , TypeConfiguration typeConfiguration ) {
86+ public ReturnableType <?> resolveFunctionReturnType (
87+ ReturnableType <?> impliedType ,
88+ List <? extends SqmTypedNode <?>> arguments ,
89+ TypeConfiguration typeConfiguration ) {
90+ return resolveFunctionReturnType ( impliedType , null , arguments , typeConfiguration );
91+ }
92+
93+ @ Override
94+ public ReturnableType <?> resolveFunctionReturnType (
95+ ReturnableType <?> impliedType ,
96+ Supplier <MappingModelExpressible <?>> inferredTypeSupplier ,
97+ List <? extends SqmTypedNode <?>> arguments ,
98+ TypeConfiguration typeConfiguration ) {
7699 ReturnableType <?> argType = extractArgumentType ( arguments , argPosition );
77100 return isAssignableTo ( argType , impliedType ) ? impliedType : argType ;
78101 }
79102
80103 @ Override
81- public BasicValuedMapping resolveFunctionReturnType (Supplier <BasicValuedMapping > impliedTypeAccess , List <? extends SqlAstNode > arguments ) {
104+ public BasicValuedMapping resolveFunctionReturnType (
105+ Supplier <BasicValuedMapping > impliedTypeAccess ,
106+ List <? extends SqlAstNode > arguments ) {
82107 final BasicValuedMapping specifiedArgType = extractArgumentValuedMapping ( arguments , argPosition );
83108 return useImpliedTypeIfPossible ( specifiedArgType , impliedTypeAccess .get () );
84109 }
@@ -88,7 +113,9 @@ public BasicValuedMapping resolveFunctionReturnType(Supplier<BasicValuedMapping>
88113 public static FunctionReturnTypeResolver useFirstNonNull () {
89114 return new FunctionReturnTypeResolver () {
90115 @ Override
91- public BasicValuedMapping resolveFunctionReturnType (Supplier <BasicValuedMapping > impliedTypeAccess , List <? extends SqlAstNode > arguments ) {
116+ public BasicValuedMapping resolveFunctionReturnType (
117+ Supplier <BasicValuedMapping > impliedTypeAccess ,
118+ List <? extends SqlAstNode > arguments ) {
92119 for ( SqlAstNode arg : arguments ) {
93120 if ( ! ( arg instanceof Expression ) ) {
94121 continue ;
@@ -109,10 +136,21 @@ public ReturnableType<?> resolveFunctionReturnType(
109136 ReturnableType <?> impliedType ,
110137 List <? extends SqmTypedNode <?>> arguments ,
111138 TypeConfiguration typeConfiguration ) {
139+ return resolveFunctionReturnType ( impliedType , null , arguments , typeConfiguration );
140+ }
141+
142+ @ Override
143+ public ReturnableType <?> resolveFunctionReturnType (
144+ ReturnableType <?> impliedType ,
145+ Supplier <MappingModelExpressible <?>> inferredTypeSupplier ,
146+ List <? extends SqmTypedNode <?>> arguments ,
147+ TypeConfiguration typeConfiguration ) {
112148 for ( int i = 0 ; i < arguments .size (); i ++ ) {
113149 if ( arguments .get ( i ) != null ) {
114150 final ReturnableType <?> argType = extractArgumentType ( arguments , i + 1 );
115- return isAssignableTo ( argType , impliedType ) ? impliedType : argType ;
151+ if ( argType != null ) {
152+ return isAssignableTo ( argType , impliedType ) ? impliedType : argType ;
153+ }
116154 }
117155 }
118156 return impliedType ;
0 commit comments