Skip to content

Commit 15c6c91

Browse files
committed
HHH-10463 Implement function argument type inference
1 parent 9a98976 commit 15c6c91

File tree

69 files changed

+820
-213
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+820
-213
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CacheDialect.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
173173
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER ),
174174
"$find(?2,?1)",
175175
"$find(?2,?1,?3)",
176-
STRING, STRING, INTEGER
176+
STRING, STRING, INTEGER,
177+
queryEngine.getTypeConfiguration()
177178
).setArgumentListSignature("(pattern, string[, start])");
178179
functionFactory.bitLength_pattern( "($length(?1)*8)" );
179180

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/FirebirdDialect.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,8 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
284284
integerType,
285285
"position(?1 in ?2)",
286286
"position(?1,?2,?3)",
287-
STRING, STRING, INTEGER
287+
STRING, STRING, INTEGER,
288+
queryEngine.getTypeConfiguration()
288289
).setArgumentListSignature( "(pattern, string[, start])" );
289290
functionRegistry.namedDescriptorBuilder( "ascii_val" )
290291
.setExactArgumentCount( 1 )

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresDialect.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,8 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
288288
integerType,
289289
"position(?1 in ?2)",
290290
"(position(?1 in substring(?2 from ?3))+(?3)-1)",
291-
STRING, STRING, INTEGER
291+
STRING, STRING, INTEGER,
292+
queryEngine.getTypeConfiguration()
292293
).setArgumentListSignature("(pattern, string[, start])");
293294

294295
queryEngine.getSqmFunctionRegistry().registerPattern( "extract", "date_part('?1',?2)", integerType );

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MaxDBDialect.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
168168
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
169169
"locate",
170170
integerType, "index(?2,?1)", "index(?2,?1,?3)",
171-
STRING, STRING, INTEGER
171+
STRING, STRING, INTEGER,
172+
queryEngine.getTypeConfiguration()
172173
).setArgumentListSignature("(pattern, string[, start])");
173174
}
174175

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SQLiteDialect.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,21 +277,24 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
277277
integerType,
278278
"instr(?2,?1)",
279279
"instr(?2,?1,?3)",
280-
STRING, STRING, INTEGER
280+
STRING, STRING, INTEGER,
281+
queryEngine.getTypeConfiguration()
281282
).setArgumentListSignature("(pattern, string[, start])");
282283
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
283284
"lpad",
284285
stringType,
285286
"(substr(replace(hex(zeroblob(?2)),'00',' '),1,?2-length(?1))||?1)",
286287
"(substr(replace(hex(zeroblob(?2)),'00',?3),1,?2-length(?1))||?1)",
287-
STRING, INTEGER, STRING
288+
STRING, INTEGER, STRING,
289+
queryEngine.getTypeConfiguration()
288290
).setArgumentListSignature("(string, length[, padding])");
289291
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
290292
"rpad",
291293
stringType,
292294
"(?1||substr(replace(hex(zeroblob(?2)),'00',' '),1,?2-length(?1)))",
293295
"(?1||substr(replace(hex(zeroblob(?2)),'00',?3),1,?2-length(?1)))",
294-
STRING, INTEGER, STRING
296+
STRING, INTEGER, STRING,
297+
queryEngine.getTypeConfiguration()
295298
).setArgumentListSignature("(string, length[, padding])");
296299

297300
queryEngine.getSqmFunctionRegistry().namedDescriptorBuilder("format", "strftime")

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/TimesTenDialect.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
168168
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER ),
169169
"instr(?2,?1)",
170170
"instr(?2,?1,?3)",
171-
STRING, STRING, INTEGER
171+
STRING, STRING, INTEGER,
172+
queryEngine.getTypeConfiguration()
172173
).setArgumentListSignature("(pattern, string[, start])");
173174
}
174175

hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import jakarta.persistence.TemporalType;
8080

8181
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
82+
import org.hibernate.type.spi.TypeConfiguration;
8283

8384
/**
8485
* An abstract base class for SAP HANA dialects.
@@ -274,13 +275,15 @@ public int getDefaultDecimalPrecision() {
274275
@Override
275276
public void initializeFunctionRegistry(QueryEngine queryEngine) {
276277
super.initializeFunctionRegistry( queryEngine );
278+
final TypeConfiguration typeConfiguration = queryEngine.getTypeConfiguration();
277279

278280
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
279281
"locate",
280-
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER ),
282+
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER ),
281283
"locate(?2,?1)",
282284
"locate(?2,?1,?3)",
283-
FunctionParameterType.STRING, FunctionParameterType.STRING, FunctionParameterType.INTEGER
285+
FunctionParameterType.STRING, FunctionParameterType.STRING, FunctionParameterType.INTEGER,
286+
typeConfiguration
284287
).setArgumentListSignature("(pattern, string[, start])");
285288

286289
CommonFunctionFactory functionFactory = new CommonFunctionFactory(queryEngine);
@@ -317,7 +320,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
317320
functionFactory.hypotheticalOrderedSetAggregates_windowEmulation();
318321

319322
queryEngine.getSqmFunctionRegistry().register( "timestampadd",
320-
new IntegralTimestampaddFunction( this, queryEngine.getTypeConfiguration() ) );
323+
new IntegralTimestampaddFunction( this, typeConfiguration ) );
321324
}
322325

323326
@Override

hibernate-core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
142142
functionFactory.yearMonthDay();
143143
functionFactory.ascii();
144144
functionFactory.chr_char();
145-
functionFactory.concat_plusOperator();
146145
functionFactory.trim1();
147146
functionFactory.repeat_replicate();
148147
functionFactory.characterLength_len();

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@
160160
import org.hibernate.type.descriptor.jdbc.NClobJdbcType;
161161
import org.hibernate.type.descriptor.jdbc.NVarcharJdbcType;
162162
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
163+
import org.hibernate.type.spi.TypeConfiguration;
163164

164165
import jakarta.persistence.TemporalType;
165166

@@ -769,7 +770,8 @@ else if ( isNumericType(sqlType) ) {
769770
* same names.
770771
*/
771772
public void initializeFunctionRegistry(QueryEngine queryEngine) {
772-
final BasicTypeRegistry basicTypeRegistry = queryEngine.getTypeConfiguration().getBasicTypeRegistry();
773+
final TypeConfiguration typeConfiguration = queryEngine.getTypeConfiguration();
774+
final BasicTypeRegistry basicTypeRegistry = typeConfiguration.getBasicTypeRegistry();
773775
final BasicType<Date> timestampType = basicTypeRegistry.resolve( StandardBasicTypes.TIMESTAMP );
774776
final BasicType<Date> dateType = basicTypeRegistry.resolve( StandardBasicTypes.DATE );
775777
final BasicType<Date> timeType = basicTypeRegistry.resolve( StandardBasicTypes.TIME );
@@ -842,20 +844,20 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
842844
//define it here as an alias for locate()
843845

844846
queryEngine.getSqmFunctionRegistry().register( "position",
845-
new LocatePositionEmulation( queryEngine.getTypeConfiguration() ) );
847+
new LocatePositionEmulation( typeConfiguration ) );
846848

847849
//very few databases support ANSI-style overlay() function, so emulate
848850
//it here in terms of either insert() or concat()/substring()
849851

850852
queryEngine.getSqmFunctionRegistry().register( "overlay",
851-
new InsertSubstringOverlayEmulation( queryEngine.getTypeConfiguration(), false ) );
853+
new InsertSubstringOverlayEmulation( typeConfiguration, false ) );
852854

853855
//ANSI SQL trim() function is supported on almost all of the databases
854856
//we care about, but on some it must be emulated using ltrim(), rtrim(),
855857
//and replace()
856858

857859
queryEngine.getSqmFunctionRegistry().register( "trim",
858-
new TrimFunction( this, queryEngine.getTypeConfiguration() ) );
860+
new TrimFunction( this, typeConfiguration ) );
859861

860862
//ANSI SQL cast() function is supported on the databases we care most
861863
//about but in certain cases it doesn't allow some useful typecasts,
@@ -883,7 +885,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
883885
//a very dialect-specific way
884886

885887
queryEngine.getSqmFunctionRegistry().register( "extract",
886-
new ExtractFunction( this ) );
888+
new ExtractFunction( this, typeConfiguration ) );
887889

888890
//comparison functions supported on most databases, emulated on others
889891
//using a case expression
@@ -905,13 +907,13 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
905907
//pad() is a function we've designed to look like ANSI trim()
906908

907909
queryEngine.getSqmFunctionRegistry().register( "pad",
908-
new LpadRpadPadEmulation( queryEngine.getTypeConfiguration() ) );
910+
new LpadRpadPadEmulation( typeConfiguration ) );
909911

910912
//legacy Hibernate convenience function for casting to string, defined
911913
//here as an alias for cast(arg as String)
912914

913915
queryEngine.getSqmFunctionRegistry().register( "str",
914-
new CastStrEmulation( queryEngine.getTypeConfiguration() ) );
916+
new CastStrEmulation( typeConfiguration ) );
915917

916918
//format() function for datetimes, emulated on many databases using the
917919
//Oracle-style to_char() function, and on others using their native
@@ -923,9 +925,9 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
923925
//since there is a great variety of different ways to emulate them
924926

925927
queryEngine.getSqmFunctionRegistry().register( "timestampadd",
926-
new TimestampaddFunction( this ) );
928+
new TimestampaddFunction( this, typeConfiguration ) );
927929
queryEngine.getSqmFunctionRegistry().register( "timestampdiff",
928-
new TimestampdiffFunction( this, queryEngine.getTypeConfiguration() ) );
930+
new TimestampdiffFunction( this, typeConfiguration ) );
929931
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "dateadd", "timestampadd" );
930932
queryEngine.getSqmFunctionRegistry().registerAlternateKey( "datediff", "timestampdiff" );
931933

hibernate-core/src/main/java/org/hibernate/dialect/HANAColumnStoreDialect.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
2020
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
2121
import org.hibernate.type.StandardBasicTypes;
22+
import org.hibernate.type.spi.TypeConfiguration;
2223

2324
import static org.hibernate.query.sqm.produce.function.FunctionParameterType.ANY;
2425

@@ -102,20 +103,22 @@ private void registerHanaCloudKeywords() {
102103
@Override
103104
public void initializeFunctionRegistry(QueryEngine queryEngine) {
104105
super.initializeFunctionRegistry( queryEngine );
106+
final TypeConfiguration typeConfiguration = queryEngine.getTypeConfiguration();
105107

106108
// full-text search functions
107109
queryEngine.getSqmFunctionRegistry().registerNamed(
108110
"score",
109-
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.DOUBLE )
111+
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.DOUBLE )
110112
);
111113
queryEngine.getSqmFunctionRegistry().registerNamed( "snippets" );
112114
queryEngine.getSqmFunctionRegistry().registerNamed( "highlighted" );
113115
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
114116
"contains",
115-
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.BOOLEAN ),
117+
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.BOOLEAN ),
116118
"contains(?1,?2)",
117119
"contains(?1,?2,?3)",
118-
ANY, ANY, ANY
120+
ANY, ANY, ANY,
121+
typeConfiguration
119122
);
120123
}
121124

hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@
9393
import static org.hibernate.query.sqm.TemporalUnit.YEAR;
9494

9595
import org.hibernate.query.sqm.produce.function.FunctionParameterType;
96+
import org.hibernate.type.spi.TypeConfiguration;
97+
9698
import static org.hibernate.type.SqlTypes.*;
9799

98100
/**
@@ -136,6 +138,7 @@ public int getPreferredSqlTypeCodeForBoolean() {
136138
@Override
137139
public void initializeFunctionRegistry(QueryEngine queryEngine) {
138140
super.initializeFunctionRegistry( queryEngine );
141+
final TypeConfiguration typeConfiguration = queryEngine.getTypeConfiguration();
139142

140143
CommonFunctionFactory functionFactory = new CommonFunctionFactory(queryEngine);
141144
functionFactory.cosh();
@@ -185,10 +188,11 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
185188

186189
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
187190
"locate",
188-
queryEngine.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER ),
191+
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.INTEGER ),
189192
"instr(?2,?1)",
190193
"instr(?2,?1,?3)",
191-
FunctionParameterType.STRING, FunctionParameterType.STRING, FunctionParameterType.INTEGER
194+
FunctionParameterType.STRING, FunctionParameterType.STRING, FunctionParameterType.INTEGER,
195+
typeConfiguration
192196
).setArgumentListSignature("(pattern, string[, start])");
193197
// The within group clause became optional in 18
194198
if ( getVersion().isSameOrAfter( 18 ) ) {
@@ -203,7 +207,7 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
203207
// Oracle has a regular aggregate function named stats_mode
204208
queryEngine.getSqmFunctionRegistry().register(
205209
"mode",
206-
new ModeStatsModeEmulation( queryEngine.getTypeConfiguration() )
210+
new ModeStatsModeEmulation( typeConfiguration )
207211
);
208212
}
209213

hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
import org.hibernate.query.sqm.function.FunctionKind;
1616
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
1717
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
18+
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
1819
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
20+
import org.hibernate.sql.ast.Clause;
1921
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
2022
import org.hibernate.sql.ast.SqlAstTranslator;
2123
import org.hibernate.sql.ast.spi.SqlAppender;
@@ -49,7 +51,8 @@ public AvgFunction(
4951
new ArgumentTypesValidator( StandardArgumentsValidators.exactly( 1 ), NUMERIC ),
5052
StandardFunctionReturnTypeResolvers.invariant(
5153
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.DOUBLE )
52-
)
54+
),
55+
StandardFunctionArgumentTypeResolvers.invariant( typeConfiguration, NUMERIC )
5356
);
5457
this.defaultArgumentRenderingMode = defaultArgumentRenderingMode;
5558
doubleType = typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.DOUBLE );
@@ -80,8 +83,10 @@ public void render(
8083
arg = (Expression) sqlAstArguments.get( 0 );
8184
}
8285
if ( caseWrapper ) {
86+
translator.getCurrentClauseStack().push( Clause.WHERE );
8387
sqlAppender.appendSql( "case when " );
8488
filter.accept( translator );
89+
translator.getCurrentClauseStack().pop();
8590
sqlAppender.appendSql( " then " );
8691
renderArgument( sqlAppender, translator, arg );
8792
sqlAppender.appendSql( " else null end)" );
@@ -90,9 +95,11 @@ public void render(
9095
renderArgument( sqlAppender, translator, arg );
9196
sqlAppender.appendSql( ')' );
9297
if ( filter != null ) {
98+
translator.getCurrentClauseStack().push( Clause.WHERE );
9399
sqlAppender.appendSql( " filter (where " );
94100
filter.accept( translator );
95101
sqlAppender.appendSql( ')' );
102+
translator.getCurrentClauseStack().pop();
96103
}
97104
}
98105
}

hibernate-core/src/main/java/org/hibernate/dialect/function/CaseLeastGreatestEmulation.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
1212
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
1313
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
14+
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
1415
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
1516
import org.hibernate.sql.ast.SqlAstTranslator;
1617
import org.hibernate.sql.ast.spi.SqlAppender;
@@ -33,7 +34,8 @@ public CaseLeastGreatestEmulation(boolean least) {
3334
super(
3435
least ? "least" : "greatest",
3536
new ArgumentTypesValidator( StandardArgumentsValidators.min( 2 ), COMPARABLE, COMPARABLE ),
36-
StandardFunctionReturnTypeResolvers.useFirstNonNull()
37+
StandardFunctionReturnTypeResolvers.useFirstNonNull(),
38+
StandardFunctionArgumentTypeResolvers.ARGUMENT_OR_IMPLIED_RESULT_TYPE
3739
);
3840
this.operator = least ? "<=" : ">=";
3941
}

hibernate-core/src/main/java/org/hibernate/dialect/function/CastFunction.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.query.sqm.CastType;
1515
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
1616
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
17+
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
1718
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
1819
import org.hibernate.query.sqm.produce.function.internal.PatternRenderer;
1920
import org.hibernate.sql.ast.SqlAstTranslator;
@@ -38,7 +39,8 @@ public CastFunction(Dialect dialect, int preferredSqlTypeCodeForBoolean) {
3839
super(
3940
"cast",
4041
StandardArgumentsValidators.exactly( 2 ),
41-
StandardFunctionReturnTypeResolvers.useArgType( 2 )
42+
StandardFunctionReturnTypeResolvers.useArgType( 2 ),
43+
StandardFunctionArgumentTypeResolvers.IMPLIED_RESULT_TYPE
4244
);
4345
this.dialect = dialect;
4446
this.booleanCastType = getBooleanCastType( preferredSqlTypeCodeForBoolean );

hibernate-core/src/main/java/org/hibernate/dialect/function/CastStrEmulation.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,16 @@ public CastStrEmulation(TypeConfiguration typeConfiguration) {
3737
StandardArgumentsValidators.exactly( 1 ),
3838
StandardFunctionReturnTypeResolvers.invariant(
3939
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING )
40-
)
40+
),
41+
null
4142
);
4243
}
4344

4445
protected CastStrEmulation(
4546
String name,
4647
ArgumentsValidator argumentsValidator,
4748
FunctionReturnTypeResolver returnTypeResolver) {
48-
super( name, argumentsValidator, returnTypeResolver );
49+
super( name, argumentsValidator, returnTypeResolver, null );
4950
}
5051

5152
@Override

hibernate-core/src/main/java/org/hibernate/dialect/function/CastingConcatFunction.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor;
1616
import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator;
1717
import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators;
18+
import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers;
1819
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
1920
import org.hibernate.query.sqm.produce.function.internal.PatternRenderer;
2021
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
@@ -42,10 +43,11 @@ public CastingConcatFunction(
4243
TypeConfiguration typeConfiguration) {
4344
super(
4445
"concat",
45-
new ArgumentTypesValidator( StandardArgumentsValidators.min( 1 ), STRING ),
46+
StandardArgumentsValidators.min( 1 ),
4647
StandardFunctionReturnTypeResolvers.invariant(
4748
typeConfiguration.getBasicTypeRegistry().resolve( StandardBasicTypes.STRING )
48-
)
49+
),
50+
StandardFunctionArgumentTypeResolvers.impliedOrInvariant( typeConfiguration, STRING )
4951
);
5052
this.dialect = dialect;
5153
this.concatOperator = concatOperator;

0 commit comments

Comments
 (0)