YongGoose commented on code in PR #7219:
URL: https://github.com/apache/incubator-seata/pull/7219#discussion_r1994565804


##########
sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/DruidSQLRecognizerFactoryTest.java:
##########
@@ -48,75 +48,159 @@ public void testSqlRecognizerCreation() {
         Assertions.assertEquals(recognizers.size(), 1);
         Assertions.assertEquals(SQLType.DELETE, 
recognizers.get(0).getSQLType());
 
+        recognizers = recognizerFactory.create("delete from t1", 
JdbcConstants.DM);
+        Assertions.assertNotNull(recognizers);
+        Assertions.assertEquals(recognizers.size(), 1);
+        Assertions.assertEquals(SQLType.DELETE, 
recognizers.get(0).getSQLType());
+
+        recognizers = recognizerFactory.create("delete from t1", 
JdbcConstants.KINGBASE);
+        Assertions.assertNotNull(recognizers);
+        Assertions.assertEquals(recognizers.size(), 1);
+        Assertions.assertEquals(SQLType.DELETE, 
recognizers.get(0).getSQLType());
+
+        recognizers = recognizerFactory.create("delete from t1", 
JdbcConstants.OSCAR);
+        Assertions.assertNotNull(recognizers);
+        Assertions.assertEquals(recognizers.size(), 1);
+        Assertions.assertEquals(SQLType.DELETE, 
recognizers.get(0).getSQLType());
+
         //test sql syntax
         String sql = "update d.t set d.t.a = ?, d.t.b = ?, d.t.c = ?";
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.OSCAR));
 
-        String sql1 = "update a set a.id = (select id from b where a.pid = 
b.pid)";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.ORACLE));
-        String sql2 = "update (select a.id,a.name from a inner join b on a.id 
= b.id) t set t.name = 'xxx'";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.ORACLE));
-        String sql3 = "update a set id = b.pid from b where a.id = b.id";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql3, JdbcConstants.POSTGRESQL));
 
-        String sql4 = "update t set id = 1 where id in (select id from b)";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.MYSQL));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.MARIADB));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.POLARDBX));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.ORACLE));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.POSTGRESQL));
 
         String sql5 = "insert into a values (1, 2)";
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.OSCAR));
 
         String sql6 = "insert into a (id, name) values (1, 2), (3, 4)";
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.OSCAR));
+
 
-        String sql7 = "insert into a select * from b";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.MYSQL));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.MARIADB));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.POLARDBX));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.ORACLE));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.POSTGRESQL));
 
         String sql8 = "delete from t where id = ?";
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.OSCAR));
+
 
-        String sql9 = "delete from t where id in (select id from b)";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.MYSQL));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.MARIADB));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.POLARDBX));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.ORACLE));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.POSTGRESQL));
 
         String sql10 = "select * from t for update";
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.OSCAR));
+
+
 
-        String sql11 = "select * from (select * from t) for update";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.MYSQL));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.MARIADB));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.POLARDBX));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.ORACLE));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.POSTGRESQL));
+
+    }
+
+    @Test
+    public void testIsSqlSyntaxSupports() {
+        SQLRecognizerFactory recognizerFactory = 
EnhancedServiceLoader.load(SQLRecognizerFactory.class, 
SqlParserType.SQL_PARSER_TYPE_DRUID);
+
+        String sql1 = "delete from t where id in (select id from b)";
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.MYSQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.MARIADB));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.POLARDBX));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.DM));
+
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.SQLSERVER));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.KINGBASE));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.OSCAR));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.POSTGRESQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.ORACLE));
+
+        String sql2 = "select * from (select * from t) for update";
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.MYSQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.MARIADB));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.POLARDBX));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.DM));
+
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.KINGBASE));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.OSCAR));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.POSTGRESQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.ORACLE));
+
+        String sql3 = "replace into t (id,dr) values (1,'2'), (2,'3')";
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql3, JdbcConstants.MYSQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql3, JdbcConstants.MARIADB));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql3, JdbcConstants.POLARDBX));
+
+        // When dbtype are DM and SQLSERVER, druid cannot parse
+//        try {
+//            recognizerFactory.create(sql3, JdbcConstants.DM);
+//        } catch (Exception e) {
+//            //e.printStackTrace();
+//        }

Review Comment:
   Is there a reason why you didn’t remove the comments?



##########
sqlparser/seata-sqlparser-druid/src/main/java/org/apache/seata/sqlparser/druid/sqlserver/SqlServerOperateRecognizerHolder.java:
##########
@@ -55,23 +57,29 @@ public SQLRecognizer getUpdateRecognizer(String sql, 
SQLStatement ast) {
 
     @Override
     public SQLRecognizer getSelectForUpdateRecognizer(String sql, SQLStatement 
ast) {
-        List<SQLHint> hints = ((SQLSelectStatement) 
ast).getSelect().getFirstQueryBlock().getFrom().getHints();
-        if (CollectionUtils.isNotEmpty(hints)) {
-            List<String> hintsTexts = hints
-                    .stream()
-                    .map(hint -> {
-                        if (hint instanceof SQLExprHint) {
-                            SQLExpr expr = ((SQLExprHint) hint).getExpr();
-                            return expr instanceof SQLIdentifierExpr ? 
((SQLIdentifierExpr) expr).getName() : "";
-                        } else if (hint instanceof SQLCommentHint) {
-                            return ((SQLCommentHint) hint).getText();
-                        }
-                        return "";
-                    }).collect(Collectors.toList());
-            if (hintsTexts.contains("UPDLOCK")) {
-                return new SqlServerSelectForUpdateRecognizer(sql, ast);
+        SQLTableSource tableSource = ((SQLSelectStatement) 
ast).getSelect().getFirstQueryBlock().getFrom();
+
+        if (tableSource instanceof SQLSubqueryTableSource) {
+            return new SqlServerSelectForUpdateRecognizer(sql, ast);
+        } else {
+            List<SQLHint> hints = tableSource.getHints();
+            if (CollectionUtils.isNotEmpty(hints)) {
+                List<String> hintsTexts = hints
+                        .stream()
+                        .map(hint -> {
+                            if (hint instanceof SQLExprHint) {
+                                SQLExpr expr = ((SQLExprHint) hint).getExpr();
+                                return expr instanceof SQLIdentifierExpr ? 
((SQLIdentifierExpr) expr).getName() : "";
+                            } else if (hint instanceof SQLCommentHint) {
+                                return ((SQLCommentHint) hint).getText();
+                            }
+                            return "";
+                        }).collect(Collectors.toList());
+                if (hintsTexts.contains("UPDLOCK")) {
+                    return new SqlServerSelectForUpdateRecognizer(sql, ast);
+                }
             }
+            return null;
         }

Review Comment:
   In the given code, the `else` block is unnecessary because the `return` 
statement inside the if block already exits the method. Removing the `else` 
will improve readability and reduce nesting.



##########
sqlparser/seata-sqlparser-druid/src/test/java/org/apache/seata/sqlparser/druid/DruidSQLRecognizerFactoryTest.java:
##########
@@ -48,75 +48,159 @@ public void testSqlRecognizerCreation() {
         Assertions.assertEquals(recognizers.size(), 1);
         Assertions.assertEquals(SQLType.DELETE, 
recognizers.get(0).getSQLType());
 
+        recognizers = recognizerFactory.create("delete from t1", 
JdbcConstants.DM);
+        Assertions.assertNotNull(recognizers);
+        Assertions.assertEquals(recognizers.size(), 1);
+        Assertions.assertEquals(SQLType.DELETE, 
recognizers.get(0).getSQLType());
+
+        recognizers = recognizerFactory.create("delete from t1", 
JdbcConstants.KINGBASE);
+        Assertions.assertNotNull(recognizers);
+        Assertions.assertEquals(recognizers.size(), 1);
+        Assertions.assertEquals(SQLType.DELETE, 
recognizers.get(0).getSQLType());
+
+        recognizers = recognizerFactory.create("delete from t1", 
JdbcConstants.OSCAR);
+        Assertions.assertNotNull(recognizers);
+        Assertions.assertEquals(recognizers.size(), 1);
+        Assertions.assertEquals(SQLType.DELETE, 
recognizers.get(0).getSQLType());
+
         //test sql syntax
         String sql = "update d.t set d.t.a = ?, d.t.b = ?, d.t.c = ?";
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql, 
JdbcConstants.OSCAR));
 
-        String sql1 = "update a set a.id = (select id from b where a.pid = 
b.pid)";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.ORACLE));
-        String sql2 = "update (select a.id,a.name from a inner join b on a.id 
= b.id) t set t.name = 'xxx'";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.ORACLE));
-        String sql3 = "update a set id = b.pid from b where a.id = b.id";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql3, JdbcConstants.POSTGRESQL));
 
-        String sql4 = "update t set id = 1 where id in (select id from b)";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.MYSQL));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.MARIADB));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.POLARDBX));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.ORACLE));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql4, JdbcConstants.POSTGRESQL));
 
         String sql5 = "insert into a values (1, 2)";
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql5, 
JdbcConstants.OSCAR));
 
         String sql6 = "insert into a (id, name) values (1, 2), (3, 4)";
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql6, 
JdbcConstants.OSCAR));
+
 
-        String sql7 = "insert into a select * from b";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.MYSQL));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.MARIADB));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.POLARDBX));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.ORACLE));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql7, JdbcConstants.POSTGRESQL));
 
         String sql8 = "delete from t where id = ?";
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql8, 
JdbcConstants.OSCAR));
+
 
-        String sql9 = "delete from t where id in (select id from b)";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.MYSQL));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.MARIADB));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.POLARDBX));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.ORACLE));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql9, JdbcConstants.POSTGRESQL));
 
         String sql10 = "select * from t for update";
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.MYSQL));
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.MARIADB));
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.POLARDBX));
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.ORACLE));
         Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.POSTGRESQL));
+        Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.KINGBASE));
+        Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.DM));
+        Assertions.assertNotNull(recognizerFactory.create(sql10, 
JdbcConstants.OSCAR));
+
+
 
-        String sql11 = "select * from (select * from t) for update";
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.MYSQL));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.MARIADB));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.POLARDBX));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.ORACLE));
-        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql11, JdbcConstants.POSTGRESQL));
+
+    }
+
+    @Test
+    public void testIsSqlSyntaxSupports() {
+        SQLRecognizerFactory recognizerFactory = 
EnhancedServiceLoader.load(SQLRecognizerFactory.class, 
SqlParserType.SQL_PARSER_TYPE_DRUID);
+
+        String sql1 = "delete from t where id in (select id from b)";
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.MYSQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.MARIADB));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.POLARDBX));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.DM));
+
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.SQLSERVER));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.KINGBASE));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.OSCAR));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.POSTGRESQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql1, JdbcConstants.ORACLE));
+
+        String sql2 = "select * from (select * from t) for update";
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.MYSQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.MARIADB));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.POLARDBX));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.DM));
+
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.KINGBASE));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.OSCAR));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.POSTGRESQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql2, JdbcConstants.ORACLE));
+
+        String sql3 = "replace into t (id,dr) values (1,'2'), (2,'3')";
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql3, JdbcConstants.MYSQL));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql3, JdbcConstants.MARIADB));
+        Assertions.assertThrows(NotSupportYetException.class, () -> 
recognizerFactory.create(sql3, JdbcConstants.POLARDBX));
+
+        // When dbtype are DM and SQLSERVER, druid cannot parse
+//        try {
+//            recognizerFactory.create(sql3, JdbcConstants.DM);
+//        } catch (Exception e) {
+//            //e.printStackTrace();
+//        }
+
+        // druid cannot parse the sql syntax merge into
+        String sql4 = "MERGE INTO target_table\n" +
+                "USING source_table\n" +
+                "ON target_table.id = source_table.id\n" +
+                "WHEN NOT MATCHED THEN\n" +
+                "    INSERT (id, name) VALUES (source_table.id, 
source_table.name);";
+
+//        try {
+//            recognizerFactory.create(sql4, JdbcConstants.MYSQL);
+//        } catch (Exception e) {
+//            //e.printStackTrace();
+//        }

Review Comment:
   Ditto



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org
For additional commands, e-mail: notifications-h...@seata.apache.org

Reply via email to