99import java .util .Set ;
1010import java .util .StringTokenizer ;
1111
12- import org .hibernate .internal .util .StringHelper ;
12+ import static java .lang .Character .isJavaIdentifierStart ;
13+ import static org .hibernate .internal .util .StringHelper .WHITESPACE ;
1314
1415/**
1516 * Performs formatting of basic SQL statements (DML + query).
@@ -37,7 +38,6 @@ private static class FormatProcess {
3738 boolean afterByOrSetOrFromOrSelect ;
3839 int afterOn ;
3940 boolean afterBetween ;
40- boolean afterExtract ;
4141 boolean afterInsert ;
4242 int inFunction ;
4343 int parensSinceSelect ;
@@ -58,7 +58,7 @@ public FormatProcess(String sql) {
5858
5959 tokens = new StringTokenizer (
6060 sql ,
61- "()+*/-=<>'`\" []," + StringHelper . WHITESPACE ,
61+ "()+*/-=<>'`\" []," + WHITESPACE ,
6262 true
6363 );
6464 }
@@ -105,13 +105,22 @@ public String perform() {
105105 closeParen ();
106106 break ;
107107
108+ case "for" :
109+ forUpdate ();
110+ break ;
111+
108112 case "select" :
109113 select ();
110114 break ;
111- case "merge" :
112- case "insert" :
113115 case "update" :
116+ if ( "for" .equals ( lastToken ) ) {
117+ out ();
118+ break ;
119+ }
120+ // else fall through
121+ case "insert" :
114122 case "delete" :
123+ case "merge" :
115124 updateOrInsertOrDelete ();
116125 break ;
117126
@@ -127,11 +136,6 @@ public String perform() {
127136 afterBetween = true ;
128137 misc ();
129138 break ;
130- case "trim" :
131- case "extract" :
132- afterExtract = true ;
133- misc ();
134- break ;
135139
136140 //TODO: detect when 'left', 'right' are function names
137141 case "left" :
@@ -201,6 +205,18 @@ public String perform() {
201205 return result .toString ();
202206 }
203207
208+ private void forUpdate () {
209+ if ( inFunction ==0 ) {
210+ decrementIndent ();
211+ newline ();
212+ out ();
213+ beginLine = false ;
214+ }
215+ else {
216+ misc ();
217+ }
218+ }
219+
204220 private void or () {
205221 logical ();
206222 }
@@ -216,12 +232,11 @@ private void and() {
216232 }
217233
218234 private void from () {
219- if ( afterExtract ) {
220- misc ();
221- afterExtract = false ;
235+ if ( inFunction == 0 ) {
236+ endNewClause ();
222237 }
223238 else {
224- endNewClause ();
239+ misc ();
225240 }
226241 }
227242
@@ -480,17 +495,18 @@ private void decrementIndent() {
480495 }
481496
482497 private static boolean isFunctionName (String tok ) {
483- if ( tok == null || tok .length () == 0 ) {
498+ if ( tok == null || tok .isEmpty () ) {
484499 return false ;
485500 }
486-
487- final char begin = tok .charAt ( 0 );
488- final boolean isIdentifier = Character .isJavaIdentifierStart ( begin ) || '"' == begin ;
489- return isIdentifier && !NON_FUNCTION_NAMES .contains ( tok );
501+ else {
502+ final char begin = tok .charAt ( 0 );
503+ final boolean isIdentifier = isJavaIdentifierStart ( begin ) || '"' == begin ;
504+ return isIdentifier && !NON_FUNCTION_NAMES .contains ( tok );
505+ }
490506 }
491507
492508 private static boolean isWhitespace (String token ) {
493- return StringHelper . WHITESPACE .contains ( token );
509+ return WHITESPACE .contains ( token );
494510 }
495511
496512 private void newline () {
@@ -500,15 +516,15 @@ private void newline() {
500516 }
501517
502518 private void appendUntilToken (String stopToken ) {
503- final StringBuilder sb = new StringBuilder ( this .token );
519+ final StringBuilder quoted = new StringBuilder ( this .token );
504520 String t ;
505521 do {
506522 t = tokens .nextToken ();
507- sb .append ( t );
523+ quoted .append ( t );
508524 }
509525 while ( !stopToken .equals ( t ) && tokens .hasMoreTokens () );
510- this .token = sb .toString ();
511- lcToken = token ;
526+ this .token = quoted .toString ();
527+ lcToken = this . token ;
512528 }
513529 }
514530
0 commit comments