2929import org .hibernate .exception .spi .SQLExceptionConversionDelegate ;
3030import org .hibernate .query .sqm .CastType ;
3131import org .hibernate .query .sqm .IntervalType ;
32+ import org .hibernate .query .sqm .function .SqmFunctionRegistry ;
33+ import org .hibernate .type .BasicType ;
3234import org .hibernate .type .descriptor .jdbc .VarcharUUIDJdbcType ;
3335import org .hibernate .dialect .function .CaseLeastGreatestEmulation ;
3436import org .hibernate .dialect .function .CommonFunctionFactory ;
6365import org .hibernate .query .sqm .mutation .internal .temptable .LocalTemporaryTableMutationStrategy ;
6466import org .hibernate .query .sqm .mutation .spi .SqmMultiTableInsertStrategy ;
6567import org .hibernate .query .sqm .mutation .spi .SqmMultiTableMutationStrategy ;
66- import org .hibernate .query .sqm .produce .function .StandardFunctionArgumentTypeResolvers ;
6768import org .hibernate .query .sqm .sql .SqmTranslator ;
6869import org .hibernate .query .sqm .sql .SqmTranslatorFactory ;
6970import org .hibernate .query .sqm .sql .StandardSqmTranslatorFactory ;
9899import static org .hibernate .exception .spi .TemplatedViolatedConstraintNameExtractor .extractUsingTemplate ;
99100import static org .hibernate .internal .util .JdbcExceptionHelper .extractErrorCode ;
100101import static org .hibernate .query .sqm .produce .function .FunctionParameterType .STRING ;
102+ import static org .hibernate .query .sqm .produce .function .StandardFunctionArgumentTypeResolvers .impliedOrInvariant ;
101103import static org .hibernate .type .SqlTypes .BIGINT ;
102104import static org .hibernate .type .SqlTypes .BINARY ;
103105import static org .hibernate .type .SqlTypes .FLOAT ;
@@ -332,7 +334,6 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
332334 functionFactory .initcap ();
333335 functionFactory .yearMonthDay ();
334336 functionFactory .ceiling_ceil ();
335- functionFactory .concat_pipeOperator ();
336337 functionFactory .ascii ();
337338 functionFactory .char_chr ();
338339 functionFactory .addMonths ();
@@ -341,29 +342,33 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
341342 functionFactory .variance ();
342343 functionFactory .bitLength_pattern ( "length(?1)*8" );
343344 functionFactory .varPop_sumCount ();
344- functionContributions .getFunctionRegistry ()
345- .registerAlternateKey ( "var_samp" , "variance" );
345+
346+ final SqmFunctionRegistry functionRegistry = functionContributions .getFunctionRegistry ();
347+ final TypeConfiguration typeConfiguration = functionContributions .getTypeConfiguration ();
348+ final BasicType <String > stringBasicType = typeConfiguration .getBasicTypeRegistry ().resolve ( StandardBasicTypes .STRING );
349+
350+ functionRegistry .registerAlternateKey ( "var_samp" , "variance" );
351+
352+ // the pipe operator or concat() function returns strings with trailing whitespace
353+ functionRegistry .patternDescriptorBuilder ( "concat" , "cast(?1||?2... as varchar(255))" )
354+ .setInvariantType ( stringBasicType )
355+ .setMinArgumentCount ( 1 )
356+ .setArgumentTypeResolver ( impliedOrInvariant ( typeConfiguration , STRING ) )
357+ .setArgumentListSignature ( "(STRING string0[, STRING string1[, ...]])" )
358+ .register ();
346359
347360 if ( getVersion ().isSameOrAfter ( 12 ) ) {
348361 functionFactory .locate_charindex ();
349362 }
350363
351364 //coalesce() and nullif() both supported since Informix 12
352365
353- functionContributions .getFunctionRegistry ().register ( "least" , new CaseLeastGreatestEmulation ( true ) );
354- functionContributions .getFunctionRegistry ().register ( "greatest" , new CaseLeastGreatestEmulation ( false ) );
355- functionContributions .getFunctionRegistry ().namedDescriptorBuilder ( "matches" )
356- .setInvariantType ( functionContributions .getTypeConfiguration ()
357- .getBasicTypeRegistry ()
358- .resolve ( StandardBasicTypes .STRING )
359- )
366+ functionRegistry .register ( "least" , new CaseLeastGreatestEmulation ( true ) );
367+ functionRegistry .register ( "greatest" , new CaseLeastGreatestEmulation ( false ) );
368+ functionRegistry .namedDescriptorBuilder ( "matches" )
369+ .setInvariantType ( stringBasicType )
360370 .setExactArgumentCount ( 2 )
361- .setArgumentTypeResolver (
362- StandardFunctionArgumentTypeResolvers .impliedOrInvariant (
363- functionContributions .getTypeConfiguration (),
364- STRING
365- )
366- )
371+ .setArgumentTypeResolver ( impliedOrInvariant ( typeConfiguration , STRING ) )
367372 .setArgumentListSignature ( "(STRING string, STRING pattern)" )
368373 .register ();
369374 if ( supportsWindowFunctions () ) {
@@ -539,6 +544,12 @@ public boolean supportsIfExistsBeforeConstraintName() {
539544 return getVersion ().isSameOrAfter ( 11 , 70 );
540545 }
541546
547+ @ Override
548+ public boolean supportsTableCheck () {
549+ // multi-column check constraints are created using 'alter table'
550+ return false ;
551+ }
552+
542553 @ Override
543554 public String getCascadeConstraintsString () {
544555 return getVersion ().isSameOrAfter ( 12 , 10 )
0 commit comments