Skip to content

Commit 0a351ce

Browse files
committed
HHH-19718 keep track of nesting level in SQL function calls
1 parent 1af98df commit 0a351ce

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

hibernate-core/src/main/java/org/hibernate/sql/Template.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,12 @@ public static String renderWhereStringTemplate(
167167
boolean beforeTable = false;
168168
boolean inFromClause = false;
169169
boolean afterFromTable = false;
170-
boolean inExtractOrTrim = false;
171-
boolean inCast = false;
172170
boolean afterCastAs = false;
173171
boolean afterFetch = false;
174172
boolean afterCurrent = false;
173+
int inExtractOrTrim = -1;
174+
int inCast = -1;
175+
int nestingLevel = 0;
175176

176177
boolean hasMore = tokens.hasMoreTokens();
177178
String nextToken = hasMore ? tokens.nextToken() : null;
@@ -245,12 +246,16 @@ else if ( afterFromTable ) {
245246
processedToken = token;
246247
}
247248
else if ( "(".equals(lcToken) ) {
249+
nestingLevel ++;
248250
processedToken = token;
249251
}
250252
else if ( ")".equals(lcToken) ) {
251-
inExtractOrTrim = false;
252-
if ( afterCastAs ) {
253-
inCast = false;
253+
nestingLevel --;
254+
if ( nestingLevel == inExtractOrTrim ) {
255+
inExtractOrTrim = -1;
256+
}
257+
if ( nestingLevel == inCast ) {
258+
inCast = -1;
254259
afterCastAs = false;
255260
}
256261
processedToken = token;
@@ -265,7 +270,7 @@ else if ( lcToken.length()==1 && symbols.contains(lcToken) ) {
265270
processedToken = token;
266271
}
267272
else if ( BEFORE_TABLE_KEYWORDS.contains(lcToken) ) {
268-
if ( !inExtractOrTrim ) {
273+
if ( inExtractOrTrim == -1 ) {
269274
beforeTable = true;
270275
inFromClause = true;
271276
}
@@ -282,7 +287,7 @@ else if ( isNamedParameter(token) ) {
282287
}
283288
else if ( "as".equals( lcToken ) ) {
284289
processedToken = token;
285-
afterCastAs = inCast;
290+
afterCastAs = inCast>-1;
286291
}
287292
else if ( isFetch( dialect, lcToken ) ) {
288293
processedToken = token;
@@ -300,10 +305,10 @@ else if ( isBoolean( lcToken ) ) {
300305
}
301306
else if ( isFunctionCall( nextToken, sql, symbols, tokens ) ) {
302307
if ( FUNCTION_WITH_FROM_KEYWORDS.contains( lcToken ) ) {
303-
inExtractOrTrim = true;
308+
inExtractOrTrim = nestingLevel;
304309
}
305310
if ( "cast".equals( lcToken ) ) {
306-
inCast = true;
311+
inCast = nestingLevel;
307312
}
308313
processedToken = token;
309314
}

0 commit comments

Comments
 (0)