Browse Source

处理sql格式化报错问题

Caratacus 8 years ago
parent
commit
92614c28e0
1 changed files with 36 additions and 18 deletions
  1. 36 18
      src/main/java/com/baomidou/mybatisplus/toolkit/SqlFormatter.java

+ 36 - 18
src/main/java/com/baomidou/mybatisplus/toolkit/SqlFormatter.java

@@ -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++) {