From 628522ae662285f900aed033cfe9b407bb6e82b9 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Tue, 19 Aug 2025 19:05:37 +1000 Subject: [PATCH 1/2] HHH-19718 lame solution to function call nested in cast(... as ...) --- .../src/main/java/org/hibernate/sql/Template.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/sql/Template.java b/hibernate-core/src/main/java/org/hibernate/sql/Template.java index 1d97702b483a..e869487b9829 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/Template.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/Template.java @@ -249,8 +249,10 @@ else if ( "(".equals(lcToken) ) { } else if ( ")".equals(lcToken) ) { inExtractOrTrim = false; - inCast = false; - afterCastAs = false; + if ( afterCastAs ) { + inCast = false; + afterCastAs = false; + } processedToken = token; } else if ( ",".equals(lcToken) ) { From 05f306cb9c6d38dbdb0393c0f281d1b39521276d Mon Sep 17 00:00:00 2001 From: Gavin King Date: Tue, 19 Aug 2025 19:29:02 +1000 Subject: [PATCH 2/2] HHH-19718 keep track of nesting level in SQL function calls --- .../main/java/org/hibernate/sql/Template.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/sql/Template.java b/hibernate-core/src/main/java/org/hibernate/sql/Template.java index e869487b9829..c996addf10af 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/Template.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/Template.java @@ -167,11 +167,12 @@ public static String renderWhereStringTemplate( boolean beforeTable = false; boolean inFromClause = false; boolean afterFromTable = false; - boolean inExtractOrTrim = false; - boolean inCast = false; boolean afterCastAs = false; boolean afterFetch = false; boolean afterCurrent = false; + int inExtractOrTrim = -1; + int inCast = -1; + int nestingLevel = 0; boolean hasMore = tokens.hasMoreTokens(); String nextToken = hasMore ? tokens.nextToken() : null; @@ -245,12 +246,16 @@ else if ( afterFromTable ) { processedToken = token; } else if ( "(".equals(lcToken) ) { + nestingLevel ++; processedToken = token; } else if ( ")".equals(lcToken) ) { - inExtractOrTrim = false; - if ( afterCastAs ) { - inCast = false; + nestingLevel --; + if ( nestingLevel == inExtractOrTrim ) { + inExtractOrTrim = -1; + } + if ( nestingLevel == inCast ) { + inCast = -1; afterCastAs = false; } processedToken = token; @@ -265,7 +270,7 @@ else if ( lcToken.length()==1 && symbols.contains(lcToken) ) { processedToken = token; } else if ( BEFORE_TABLE_KEYWORDS.contains(lcToken) ) { - if ( !inExtractOrTrim ) { + if ( inExtractOrTrim == -1 ) { beforeTable = true; inFromClause = true; } @@ -282,7 +287,7 @@ else if ( isNamedParameter(token) ) { } else if ( "as".equals( lcToken ) ) { processedToken = token; - afterCastAs = inCast; + afterCastAs = inCast>-1; } else if ( isFetch( dialect, lcToken ) ) { processedToken = token; @@ -300,10 +305,10 @@ else if ( isBoolean( lcToken ) ) { } else if ( isFunctionCall( nextToken, sql, symbols, tokens ) ) { if ( FUNCTION_WITH_FROM_KEYWORDS.contains( lcToken ) ) { - inExtractOrTrim = true; + inExtractOrTrim = nestingLevel; } if ( "cast".equals( lcToken ) ) { - inCast = true; + inCast = nestingLevel; } processedToken = token; }