@@ -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