Skip to content

Commit b76de51

Browse files
committed
format 'for update', 'for read only', etc, correctly, and simplify rules
1 parent ba1da93 commit b76de51

File tree

1 file changed

+40
-24
lines changed

1 file changed

+40
-24
lines changed

hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/BasicFormatterImpl.java

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import java.util.Set;
1010
import 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

Comments
 (0)