Skip to content

Commit 8daa7ce

Browse files
mbelladebeikov
authored andcommitted
HHH-17435 Allow input param as trim character and fix single quote
1 parent bc1210e commit 8daa7ce

File tree

19 files changed

+188
-95
lines changed

19 files changed

+188
-95
lines changed

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,23 +138,23 @@ public int getDefaultStatementBatchSize() {
138138
}
139139

140140
@Override
141-
public String trimPattern(TrimSpec specification, char character) {
141+
public String trimPattern(TrimSpec specification, boolean isWhitespace) {
142142
switch ( specification ) {
143143
case BOTH:
144-
return character == ' '
144+
return isWhitespace
145145
? "trim(?1)"
146-
: "trim(?1, '" + character + "')";
146+
: "trim(?1,?2)";
147147
case LEADING:
148-
return character == ' '
148+
return isWhitespace
149149
? "ltrim(?1)"
150-
: "ltrim(?1,'" + character + "')";
150+
: "ltrim(?1,?2)";
151151
case TRAILING:
152-
return character == ' '
152+
return isWhitespace
153153
? "rtrim(?1)"
154-
: "rtrim(?1,'" + character + "')";
154+
: "rtrim(?1,?2)";
155155
}
156156

157-
return super.trimPattern( specification, character );
157+
return super.trimPattern( specification, isWhitespace );
158158
}
159159

160160
@Override

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.hibernate.dialect.function.DB2FormatEmulation;
3434
import org.hibernate.dialect.function.DB2PositionFunction;
3535
import org.hibernate.dialect.function.DB2SubstringFunction;
36+
import org.hibernate.dialect.function.TrimFunction;
3637
import org.hibernate.dialect.identity.DB2IdentityColumnSupport;
3738
import org.hibernate.dialect.identity.IdentityColumnSupport;
3839
import org.hibernate.dialect.pagination.DB2LimitHandler;
@@ -398,6 +399,13 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
398399
.setArgumentListSignature("(STRING string, STRING pattern)")
399400
.register();
400401

402+
//trim() requires trim characters to be constant literals
403+
functionContributions.getFunctionRegistry().register( "trim", new TrimFunction(
404+
this,
405+
functionContributions.getTypeConfiguration(),
406+
SqlAstNodeRenderingMode.INLINE_PARAMETERS
407+
) );
408+
401409
functionFactory.windowFunctions();
402410
if ( getDB2Version().isSameOrAfter( 9, 5 ) ) {
403411
functionFactory.listagg( null );

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.hibernate.boot.model.FunctionContributions;
1717
import org.hibernate.dialect.*;
1818
import org.hibernate.dialect.function.CommonFunctionFactory;
19+
import org.hibernate.dialect.function.TrimFunction;
1920
import org.hibernate.dialect.identity.HSQLIdentityColumnSupport;
2021
import org.hibernate.dialect.identity.IdentityColumnSupport;
2122
import org.hibernate.dialect.lock.LockingStrategy;
@@ -266,6 +267,13 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
266267
functionFactory.arrayTrim_trim_array();
267268
functionFactory.arrayFill_hsql();
268269
functionFactory.arrayToString_hsql();
270+
271+
//trim() requires parameters to be cast when used as trim character
272+
functionContributions.getFunctionRegistry().register( "trim", new TrimFunction(
273+
this,
274+
functionContributions.getTypeConfiguration(),
275+
SqlAstNodeRenderingMode.NO_PLAIN_PARAMETER
276+
) );
269277
}
270278

271279
@Override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(
203203
}
204204

205205
@Override
206-
public String trimPattern(TrimSpec specification, char character) {
207-
return AbstractTransactSQLDialect.replaceLtrimRtrim( specification, character);
206+
public String trimPattern(TrimSpec specification, boolean isWhitespace) {
207+
return AbstractTransactSQLDialect.replaceLtrimRtrim( specification, isWhitespace );
208208
}
209209

210210
@Override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ public void appendDatetimeFormat(SqlAppender appender, String format) {
431431
}
432432

433433
@Override
434-
public String trimPattern(TrimSpec specification, char character) {
435-
return AbstractTransactSQLDialect.replaceLtrimRtrim( specification, character);
434+
public String trimPattern(TrimSpec specification, boolean isWhitespace) {
435+
return AbstractTransactSQLDialect.replaceLtrimRtrim( specification, isWhitespace );
436436
}
437437
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -385,25 +385,25 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
385385
}
386386

387387
@Override
388-
public String trimPattern(TrimSpec specification, char character) {
388+
public String trimPattern(TrimSpec specification, boolean isWhitespace) {
389389
if ( getVersion().isSameOrAfter( 16 ) ) {
390390
switch ( specification ) {
391391
case BOTH:
392-
return character == ' '
392+
return isWhitespace
393393
? "trim(?1)"
394-
: "trim('" + character + "' from ?1)";
394+
: "trim(?2 from ?1)";
395395
case LEADING:
396-
return character == ' '
396+
return isWhitespace
397397
? "ltrim(?1)"
398-
: "ltrim(?1,'" + character + "')";
398+
: "ltrim(?1,?2)";
399399
case TRAILING:
400-
return character == ' '
400+
return isWhitespace
401401
? "rtrim(?1)"
402-
: "rtrim(?1,'" + character + "')";
402+
: "rtrim(?1,?2)";
403403
}
404404
throw new UnsupportedOperationException( "Unsupported specification: " + specification );
405405
}
406-
return super.trimPattern( specification, character );
406+
return super.trimPattern( specification, isWhitespace );
407407
}
408408

409409
@Override

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -353,20 +353,20 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
353353
}
354354

355355
@Override
356-
public String trimPattern(TrimSpec specification, char character) {
356+
public String trimPattern(TrimSpec specification, boolean isWhitespace) {
357357
switch ( specification ) {
358358
case BOTH:
359-
return character == ' '
359+
return isWhitespace
360360
? "trim(?1)"
361-
: "trim(?1,'" + character + "')";
361+
: "trim(?1,?2)";
362362
case LEADING:
363-
return character == ' '
363+
return isWhitespace
364364
? "ltrim(?1)"
365-
: "ltrim(?1,'" + character + "')";
365+
: "ltrim(?1,?2)";
366366
case TRAILING:
367-
return character == ' '
367+
return isWhitespace
368368
? "rtrim(?1)"
369-
: "rtrim(?1,'" + character + "')";
369+
: "rtrim(?1,?2)";
370370
}
371371
throw new UnsupportedOperationException( "Unsupported specification: " + specification );
372372
}

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -424,12 +424,6 @@ public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalT
424424
return "datediff(?1,?2,?3)";
425425
}
426426

427-
@Override
428-
public String trimPattern(TrimSpec specification, char character) {
429-
return super.trimPattern(specification, character)
430-
.replace("replace", "str_replace");
431-
}
432-
433427
@Override
434428
public void appendDatetimeFormat(SqlAppender appender, String format) {
435429
throw new UnsupportedOperationException( "format() function not supported on Sybase");

hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,7 @@ trimSpecification
13571357

13581358
trimCharacter
13591359
: STRING_LITERAL
1360+
| parameter
13601361
;
13611362

13621363
/**

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -166,28 +166,32 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
166166
}
167167

168168
@Override
169-
public String trimPattern(TrimSpec specification, char character) {
170-
return replaceLtrimRtrim(specification, character);
169+
public String trimPattern(TrimSpec specification, boolean isWhitespace) {
170+
return replaceLtrimRtrim( specification, isWhitespace );
171171
}
172172

173+
/**
174+
* @deprecated Use {@link #replaceLtrimRtrim(TrimSpec, boolean)} instead.
175+
*/
176+
@Deprecated( forRemoval = true )
173177
public static String replaceLtrimRtrim(TrimSpec specification, char character) {
174-
boolean blank = character == ' ';
178+
return replaceLtrimRtrim( specification, character == ' ' );
179+
}
180+
181+
public static String replaceLtrimRtrim(TrimSpec specification, boolean isWhitespace) {
175182
switch ( specification ) {
176183
case LEADING:
177-
return blank
184+
return isWhitespace
178185
? "ltrim(?1)"
179-
: "replace(replace(ltrim(replace(replace(?1,' ','#%#%'),'@',' ')),' ','@'),'#%#%',' ')"
180-
.replace('@', character);
186+
: "substring(?1,patindex('%[^'+?2+']%',?1),len(?1)-patindex('%[^'+?2+']%',?1)+1)";
181187
case TRAILING:
182-
return blank
188+
return isWhitespace
183189
? "rtrim(?1)"
184-
: "replace(replace(rtrim(replace(replace(?1,' ','#%#%'),'@',' ')),' ','@'),'#%#%',' ')"
185-
.replace('@', character);
190+
: "substring(?1,1,len(?1)-patindex('%[^'+?2+']%',reverse(?1))+1)";
186191
default:
187-
return blank
192+
return isWhitespace
188193
? "ltrim(rtrim(?1))"
189-
: "replace(replace(ltrim(rtrim(replace(replace(?1,' ','#%#%'),'@',' '))),' ','@'),'#%#%',' ')"
190-
.replace('@', character);
194+
: "substring(?1,patindex('%[^'+?2+']%',?1),len(?1)-patindex('%[^'+?2+']%',?1)-patindex('%[^'+?2+']%',reverse(?1))+2)";
191195
}
192196
}
193197

0 commit comments

Comments
 (0)