diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/BasicFormatterImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/BasicFormatterImpl.java index 586d7de0cdda..735e7e9fbb68 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/BasicFormatterImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/BasicFormatterImpl.java @@ -9,7 +9,8 @@ import java.util.Set; import java.util.StringTokenizer; -import org.hibernate.internal.util.StringHelper; +import static java.lang.Character.isJavaIdentifierStart; +import static org.hibernate.internal.util.StringHelper.WHITESPACE; /** * Performs formatting of basic SQL statements (DML + query). @@ -37,7 +38,6 @@ private static class FormatProcess { boolean afterByOrSetOrFromOrSelect; int afterOn; boolean afterBetween; - boolean afterExtract; boolean afterInsert; int inFunction; int parensSinceSelect; @@ -58,7 +58,7 @@ public FormatProcess(String sql) { tokens = new StringTokenizer( sql, - "()+*/-=<>'`\"[]," + StringHelper.WHITESPACE, + "()+*/-=<>'`\"[]," + WHITESPACE, true ); } @@ -105,13 +105,22 @@ public String perform() { closeParen(); break; + case "for": + forUpdate(); + break; + case "select": select(); break; - case "merge": - case "insert": case "update": + if ( "for".equals( lastToken ) ) { + out(); + break; + } + // else fall through + case "insert": case "delete": + case "merge": updateOrInsertOrDelete(); break; @@ -127,11 +136,6 @@ public String perform() { afterBetween = true; misc(); break; - case "trim": - case "extract": - afterExtract = true; - misc(); - break; //TODO: detect when 'left', 'right' are function names case "left": @@ -201,6 +205,19 @@ public String perform() { return result.toString(); } + private void forUpdate() { + if ( inFunction==0 ) { + decrementIndent(); + newline(); + out(); + incrementIndent(); + newline(); + } + else { + misc(); + } + } + private void or() { logical(); } @@ -216,12 +233,11 @@ private void and() { } private void from() { - if ( afterExtract ) { - misc(); - afterExtract = false; + if ( inFunction == 0 ) { + endNewClause(); } else { - endNewClause(); + misc(); } } @@ -480,17 +496,18 @@ private void decrementIndent() { } private static boolean isFunctionName(String tok) { - if ( tok == null || tok.length() == 0 ) { + if ( tok == null || tok.isEmpty() ) { return false; } - - final char begin = tok.charAt( 0 ); - final boolean isIdentifier = Character.isJavaIdentifierStart( begin ) || '"' == begin; - return isIdentifier && !NON_FUNCTION_NAMES.contains( tok ); + else { + final char begin = tok.charAt( 0 ); + final boolean isIdentifier = isJavaIdentifierStart( begin ) || '"' == begin; + return isIdentifier && !NON_FUNCTION_NAMES.contains( tok ); + } } private static boolean isWhitespace(String token) { - return StringHelper.WHITESPACE.contains( token ); + return WHITESPACE.contains( token ); } private void newline() { @@ -500,15 +517,15 @@ private void newline() { } private void appendUntilToken(String stopToken) { - final StringBuilder sb = new StringBuilder( this.token ); + final StringBuilder quoted = new StringBuilder( this.token ); String t; do { t = tokens.nextToken(); - sb.append( t ); + quoted.append( t ); } while ( !stopToken.equals( t ) && tokens.hasMoreTokens() ); - this.token = sb.toString(); - lcToken = token; + this.token = quoted.toString(); + lcToken = this.token; } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/HighlightingFormatter.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/HighlightingFormatter.java index a629ceb10ddf..1f4f0cc3a384 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/HighlightingFormatter.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/HighlightingFormatter.java @@ -5,7 +5,6 @@ package org.hibernate.engine.jdbc.internal; import org.hibernate.engine.jdbc.env.spi.AnsiSqlKeywords; -import org.hibernate.internal.util.StringHelper; import java.util.Arrays; import java.util.HashSet; @@ -13,6 +12,7 @@ import java.util.Set; import java.util.StringTokenizer; +import static org.hibernate.internal.util.StringHelper.WHITESPACE; import static org.hibernate.internal.util.StringHelper.isEmpty; /** @@ -25,7 +25,7 @@ public final class HighlightingFormatter implements Formatter { private static final Set KEYWORDS_LOWERCASED = new HashSet<>( new AnsiSqlKeywords().sql2003() ); static { // additional keywords not reserved by ANSI SQL 2003 - KEYWORDS_LOWERCASED.addAll( Arrays.asList( "key", "sequence", "cascade", "increment", "boolean", "offset", "next", "returning" ) ); + KEYWORDS_LOWERCASED.addAll( Arrays.asList( "key", "sequence", "cascade", "increment", "boolean", "offset", "first", "next", "returning" ) ); } public static final Formatter INSTANCE = @@ -34,7 +34,7 @@ public final class HighlightingFormatter implements Formatter { "36", // cyan "32" ); - private static final String SYMBOLS_AND_WS = "=>