Selaa lähdekoodia

调整动态表解析处理(处理UnsupportedStatement与DDL语法).

nieqiurong 1 kuukausi sitten
vanhempi
commit
78e9a35343
9 muutettua tiedostoa jossa 819 lisäystä ja 9 poistoa
  1. 24 0
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-4.9/src/main/java/com/baomidou/mybatisplus/extension/DynamicTableNameHandler.java
  2. 9 3
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-4.9/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptor.java
  3. 239 0
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-4.9/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptorTest.java
  4. 25 0
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-5.0/src/main/java/com/baomidou/mybatisplus/extension/DynamicTableNameHandler.java
  5. 9 3
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-5.0/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptor.java
  6. 240 0
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-5.0/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptorTest.java
  7. 25 0
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/DynamicTableNameHandler.java
  8. 9 3
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptor.java
  9. 239 0
      mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptorTest.java

+ 24 - 0
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-4.9/src/main/java/com/baomidou/mybatisplus/extension/DynamicTableNameHandler.java

@@ -18,6 +18,9 @@ package com.baomidou.mybatisplus.extension;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
 import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.create.index.CreateIndex;
+import net.sf.jsqlparser.statement.create.view.CreateView;
+import net.sf.jsqlparser.statement.drop.Drop;
 import net.sf.jsqlparser.util.TablesNamesFinder;
 
 import java.util.HashSet;
@@ -28,6 +31,7 @@ import java.util.Set;
  * <p>1.无法保留sql注释(例如 select * from test; --这是个查询 处理完会变成 select * from test)</p>
  * <p>2.无法保留语句分隔符;(例如 select * from test; 处理完会变成 select * from test )</p>
  * <p>3.如果使用转义符包裹了表名需要自行处理</p>
+ * <p>4.select * from dual (不处理这个,自行忽略)</p>
  *
  * @author nieqiurong
  * @since 3.5.11
@@ -46,6 +50,26 @@ public class DynamicTableNameHandler extends TablesNamesFinder {
         init(false);
     }
 
+    @Override
+    public void visit(CreateIndex createIndex) {
+        super.visit(createIndex.getTable());
+    }
+
+    @Override
+    public void visit(Drop drop) {
+        if(StringUtils.isNotBlank(drop.getType())){
+            String type = drop.getType().toUpperCase();
+            if ("TABLE".equals(type)) {
+                 super.visit(drop);
+            }
+        }
+    }
+
+    @Override
+    public void visit(CreateView createView) {
+        super.visit(createView.getSelect());
+    }
+
     @Override
     protected String extractTableName(Table table) {
         String originalTableName = table.getName();

+ 9 - 3
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-4.9/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptor.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal;
 import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
 import lombok.Setter;
 import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.UnsupportedStatement;
 
 /**
  * 动态表处理器 (基于JsqlParser解析器)
@@ -56,18 +57,23 @@ public class DynamicTableNameJsqlParserInnerInterceptor extends DynamicTableName
 
     @Override
     protected String processTableName(String sql) {
+        boolean unsupported = false;
         try {
             Statement statement = JsqlParserGlobal.parse(sql);
             statement.accept(new DynamicTableNameHandler(sql, super.getTableNameHandler()));
+            if (statement instanceof UnsupportedStatement) {
+                unsupported = true;
+                return super.processTableName(sql);
+            }
             return statement.toString();
         } catch (Exception exception) {
-            return handleFallback(sql, exception);
+            return handleFallback(unsupported, sql, exception);
         }
     }
 
-    private String handleFallback(String sql, Exception originalException) {
+    private String handleFallback(boolean unsupported, String sql, Exception originalException) {
         Exception exception = originalException;
-        if (shouldFallback) {
+        if (!unsupported || shouldFallback) {
             try {
                 return super.processTableName(sql);
             } catch (Exception e) {

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 239 - 0
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-4.9/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptorTest.java


+ 25 - 0
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-5.0/src/main/java/com/baomidou/mybatisplus/extension/DynamicTableNameHandler.java

@@ -18,6 +18,9 @@ package com.baomidou.mybatisplus.extension;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
 import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.create.index.CreateIndex;
+import net.sf.jsqlparser.statement.create.view.CreateView;
+import net.sf.jsqlparser.statement.drop.Drop;
 import net.sf.jsqlparser.util.TablesNamesFinder;
 
 import java.util.HashSet;
@@ -28,6 +31,7 @@ import java.util.Set;
  * <p>1.无法保留sql注释(例如 select * from test; --这是个查询 处理完会变成 select * from test)</p>
  * <p>2.无法保留语句分隔符;(例如 select * from test; 处理完会变成 select * from test )</p>
  * <p>3.如果使用转义符包裹了表名需要自行处理</p>
+ * <p>4.select * from dual (不处理这个,自行忽略)</p>
  *
  * @author nieqiurong
  * @since 3.5.11
@@ -46,6 +50,27 @@ public class DynamicTableNameHandler extends TablesNamesFinder<Void> {
         init(false);
     }
 
+    @Override
+    public <S> Void visit(CreateIndex createIndex, S context) {
+        return this.visit(createIndex.getTable(), context);
+    }
+
+    @Override
+    public <S> Void visit(Drop drop, S context) {
+        if(StringUtils.isNotBlank(drop.getType())){
+            String type = drop.getType().toUpperCase();
+            if ("TABLE".equals(type)) {
+                return super.visit(drop, context);
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public <S> Void visit(CreateView createView, S context) {
+        return super.visit(createView.getSelect(), context);
+    }
+
     @Override
     protected String extractTableName(Table table) {
         String originalTableName = table.getName();

+ 9 - 3
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-5.0/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptor.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal;
 import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
 import lombok.Setter;
 import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.UnsupportedStatement;
 
 /**
  * 动态表处理器 (基于JsqlParser解析器)
@@ -56,18 +57,23 @@ public class DynamicTableNameJsqlParserInnerInterceptor extends DynamicTableName
 
     @Override
     protected String processTableName(String sql) {
+        boolean unsupported = false;
         try {
             Statement statement = JsqlParserGlobal.parse(sql);
             statement.accept(new DynamicTableNameHandler(sql, super.getTableNameHandler()));
+            if (statement instanceof UnsupportedStatement) {
+                unsupported = true;
+                return super.processTableName(sql);
+            }
             return statement.toString();
         } catch (Exception exception) {
-            return handleFallback(sql, exception);
+            return handleFallback(unsupported, sql, exception);
         }
     }
 
-    private String handleFallback(String sql, Exception originalException) {
+    private String handleFallback(boolean unsupported, String sql, Exception originalException) {
         Exception exception = originalException;
-        if (shouldFallback) {
+        if (!unsupported || shouldFallback) {
             try {
                 return super.processTableName(sql);
             } catch (Exception e) {

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 240 - 0
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser-5.0/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptorTest.java


+ 25 - 0
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/DynamicTableNameHandler.java

@@ -18,6 +18,9 @@ package com.baomidou.mybatisplus.extension;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
 import net.sf.jsqlparser.schema.Table;
+import net.sf.jsqlparser.statement.create.index.CreateIndex;
+import net.sf.jsqlparser.statement.create.view.CreateView;
+import net.sf.jsqlparser.statement.drop.Drop;
 import net.sf.jsqlparser.util.TablesNamesFinder;
 
 import java.util.HashSet;
@@ -28,6 +31,7 @@ import java.util.Set;
  * <p>1.无法保留sql注释(例如 select * from test; --这是个查询 处理完会变成 select * from test)</p>
  * <p>2.无法保留语句分隔符;(例如 select * from test; 处理完会变成 select * from test )</p>
  * <p>3.如果使用转义符包裹了表名需要自行处理</p>
+ * <p>4.select * from dual (不处理这个,自行忽略)</p>
  *
  * @author nieqiurong
  * @since 3.5.11
@@ -46,6 +50,27 @@ public class DynamicTableNameHandler extends TablesNamesFinder<Void> {
         init(false);
     }
 
+    @Override
+    public <S> Void visit(CreateIndex createIndex, S context) {
+        return this.visit(createIndex.getTable(), context);
+    }
+
+    @Override
+    public <S> Void visit(CreateView create, S context) {
+        return this.visit(create.getSelect(), context);
+    }
+
+    @Override
+    public <S> Void visit(Drop drop, S context) {
+        if(StringUtils.isNotBlank(drop.getType())){
+            String type = drop.getType().toUpperCase();
+            if ("TABLE".equals(type)) {
+                return super.visit(drop, context);
+            }
+        }
+        return null;
+    }
+
     @Override
     protected String extractTableName(Table table) {
         String originalTableName = table.getName();

+ 9 - 3
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptor.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal;
 import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
 import lombok.Setter;
 import net.sf.jsqlparser.statement.Statement;
+import net.sf.jsqlparser.statement.UnsupportedStatement;
 
 /**
  * 动态表处理器 (基于JsqlParser解析器)
@@ -56,18 +57,23 @@ public class DynamicTableNameJsqlParserInnerInterceptor extends DynamicTableName
 
     @Override
     protected String processTableName(String sql) {
+        boolean unsupported = false;
         try {
             Statement statement = JsqlParserGlobal.parse(sql);
             statement.accept(new DynamicTableNameHandler(sql, super.getTableNameHandler()));
+            if (statement instanceof UnsupportedStatement) {
+                unsupported = true;
+                return super.processTableName(sql);
+            }
             return statement.toString();
         } catch (Exception exception) {
-            return handleFallback(sql, exception);
+            return handleFallback(unsupported, sql, exception);
         }
     }
 
-    private String handleFallback(String sql, Exception originalException) {
+    private String handleFallback(boolean unsupported, String sql, Exception originalException) {
         Exception exception = originalException;
-        if (shouldFallback) {
+        if (!unsupported || shouldFallback) {
             try {
                 return super.processTableName(sql);
             } catch (Exception e) {

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 239 - 0
mybatis-plus-jsqlparser-support/mybatis-plus-jsqlparser/src/test/java/com/baomidou/mybatisplus/test/extension/plugins/inner/DynamicTableNameJsqlParserInnerInterceptorTest.java


Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä