|
@@ -80,33 +80,29 @@ public class SqlFormatter {
|
|
boolean beginLine = true;
|
|
boolean beginLine = true;
|
|
boolean afterBeginBeforeEnd;
|
|
boolean afterBeginBeforeEnd;
|
|
boolean afterByOrSetOrFromOrSelect;
|
|
boolean afterByOrSetOrFromOrSelect;
|
|
|
|
+ boolean afterValues;
|
|
boolean afterOn;
|
|
boolean afterOn;
|
|
boolean afterBetween;
|
|
boolean afterBetween;
|
|
boolean afterInsert;
|
|
boolean afterInsert;
|
|
int inFunction;
|
|
int inFunction;
|
|
int parensSinceSelect;
|
|
int parensSinceSelect;
|
|
|
|
+ private LinkedList<Integer> parenCounts = new LinkedList<>();
|
|
|
|
+ private LinkedList<Boolean> afterByOrFromOrSelects = new LinkedList<>();
|
|
|
|
+
|
|
int indent = 1;
|
|
int indent = 1;
|
|
|
|
+
|
|
StringBuilder result = new StringBuilder();
|
|
StringBuilder result = new StringBuilder();
|
|
StringTokenizer tokens;
|
|
StringTokenizer tokens;
|
|
String lastToken;
|
|
String lastToken;
|
|
String token;
|
|
String token;
|
|
String lcToken;
|
|
String lcToken;
|
|
- private LinkedList<Integer> parenCounts = new LinkedList<>();
|
|
|
|
- private LinkedList<Boolean> afterByOrFromOrSelects = new LinkedList<>();
|
|
|
|
|
|
|
|
public FormatProcess(String sql) {
|
|
public FormatProcess(String sql) {
|
|
- tokens = new StringTokenizer(sql, "()+*/-=<>'`\"[]," + WHITESPACE, true);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private static boolean isFunctionName(String tok) {
|
|
|
|
- final char begin = tok.charAt(0);
|
|
|
|
- final boolean isIdentifier = Character.isJavaIdentifierStart(begin) || '"' == begin;
|
|
|
|
- return isIdentifier && !LOGICAL.contains(tok) && !END_CLAUSES.contains(tok) && !QUANTIFIERS.contains(tok)
|
|
|
|
- && !DML.contains(tok) && !MISC.contains(tok);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private static boolean isWhitespace(String token) {
|
|
|
|
- return WHITESPACE.contains(token);
|
|
|
|
|
|
+ tokens = new StringTokenizer(
|
|
|
|
+ sql,
|
|
|
|
+ "()+*/-=<>'`\"[]," + WHITESPACE,
|
|
|
|
+ true
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
public String perform() {
|
|
public String perform() {
|
|
@@ -118,9 +114,12 @@ public class SqlFormatter {
|
|
lcToken = token.toLowerCase(Locale.ROOT);
|
|
lcToken = token.toLowerCase(Locale.ROOT);
|
|
|
|
|
|
if ("'".equals(token)) {
|
|
if ("'".equals(token)) {
|
|
- String t;
|
|
|
|
|
|
+ String t = StringUtils.EMPTY;
|
|
do {
|
|
do {
|
|
- t = tokens.nextToken();
|
|
|
|
|
|
+ try {
|
|
|
|
+ t = tokens.nextToken();
|
|
|
|
+ } catch (Exception ignored) {
|
|
|
|
+ }
|
|
token += t;
|
|
token += t;
|
|
}
|
|
}
|
|
// cannot handle single quotes
|
|
// cannot handle single quotes
|
|
@@ -130,7 +129,8 @@ public class SqlFormatter {
|
|
do {
|
|
do {
|
|
t = tokens.nextToken();
|
|
t = tokens.nextToken();
|
|
token += t;
|
|
token += t;
|
|
- } while (!"\"".equals(t));
|
|
|
|
|
|
+ }
|
|
|
|
+ while (!"\"".equals(t));
|
|
}
|
|
}
|
|
|
|
|
|
if (afterByOrSetOrFromOrSelect && ",".equals(token)) {
|
|
if (afterByOrSetOrFromOrSelect && ",".equals(token)) {
|
|
@@ -265,7 +265,9 @@ public class SqlFormatter {
|
|
}
|
|
}
|
|
newline();
|
|
newline();
|
|
afterBeginBeforeEnd = false;
|
|
afterBeginBeforeEnd = false;
|
|
- afterByOrSetOrFromOrSelect = "by".equals(lcToken) || "set".equals(lcToken) || "from".equals(lcToken);
|
|
|
|
|
|
+ afterByOrSetOrFromOrSelect = "by".equals(lcToken)
|
|
|
|
+ || "set".equals(lcToken)
|
|
|
|
+ || "from".equals(lcToken);
|
|
}
|
|
}
|
|
|
|
|
|
private void beginNewClause() {
|
|
private void beginNewClause() {
|
|
@@ -288,6 +290,7 @@ public class SqlFormatter {
|
|
out();
|
|
out();
|
|
indent++;
|
|
indent++;
|
|
newline();
|
|
newline();
|
|
|
|
+ afterValues = true;
|
|
}
|
|
}
|
|
|
|
|
|
private void closeParen() {
|
|
private void closeParen() {
|
|
@@ -328,6 +331,21 @@ public class SqlFormatter {
|
|
parensSinceSelect++;
|
|
parensSinceSelect++;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private static boolean isFunctionName(String tok) {
|
|
|
|
+ final char begin = tok.charAt(0);
|
|
|
|
+ final boolean isIdentifier = Character.isJavaIdentifierStart(begin) || '"' == begin;
|
|
|
|
+ return isIdentifier &&
|
|
|
|
+ !LOGICAL.contains(tok) &&
|
|
|
|
+ !END_CLAUSES.contains(tok) &&
|
|
|
|
+ !QUANTIFIERS.contains(tok) &&
|
|
|
|
+ !DML.contains(tok) &&
|
|
|
|
+ !MISC.contains(tok);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static boolean isWhitespace(String token) {
|
|
|
|
+ return WHITESPACE.contains(token);
|
|
|
|
+ }
|
|
|
|
+
|
|
private void newline() {
|
|
private void newline() {
|
|
result.append("\n");
|
|
result.append("\n");
|
|
for (int i = 0; i < indent; i++) {
|
|
for (int i = 0; i < indent; i++) {
|