diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index ad29d179a0..17aa5faa71 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -695,7 +695,12 @@ public class MySqlExprParser extends SQLExprParser { } } - item.setValue(this.expr()); + if (lexer.token() == Token.ON) { + lexer.nextToken(); + item.setValue(new SQLIdentifierExpr("ON")); + } else { + item.setValue(this.expr()); + } item.setTarget(var); return item; diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 9945a74664..5f04e268a2 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -113,6 +113,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLTableElement; @@ -1729,4 +1730,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } + + @Override + public boolean visit(SQLSetStatement x) { + return false; + } + } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetTest_1.java new file mode 100644 index 0000000000..1d11f42699 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlSetTest_1.java @@ -0,0 +1,57 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; + +import junit.framework.TestCase; + +public class MySqlSetTest_1 extends TestCase { + + public void test_0() throws Exception { + String sql = "SET @@session.autocommit = ON;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List stmtList = parser.parseStatementList(); + SQLStatement stmt = stmtList.get(0); +// print(stmtList); + + Assert.assertEquals(1, stmtList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + String text = SQLUtils.toMySqlString(stmt); + + Assert.assertEquals("SET @@session.autocommit = ON", text); + } +} diff --git a/src/test/java/com/alibaba/druid/demo/sql/ExportParameters.java b/src/test/java/com/alibaba/druid/demo/sql/ExportParameters.java new file mode 100644 index 0000000000..42a1f38119 --- /dev/null +++ b/src/test/java/com/alibaba/druid/demo/sql/ExportParameters.java @@ -0,0 +1,33 @@ +package com.alibaba.druid.demo.sql; + +import java.util.List; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlExportParameterVisitor; +import com.alibaba.druid.sql.visitor.ExportParameterVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import junit.framework.TestCase; + +public class ExportParameters extends TestCase { + public void test_export_parameters() throws Exception { + String sql = "select * from t where id = 3 and name = 'abc'"; + + List stmtList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + + StringBuilder out = new StringBuilder(); + ExportParameterVisitor visitor = new MySqlExportParameterVisitor(out); + for (SQLStatement stmt : stmtList) { + stmt.accept(visitor); + } + + String paramteredSql = out.toString(); + System.out.println(paramteredSql); + + List paramters = visitor.getParameters(); // [3, "abc"] + for (Object param : paramters) { + System.out.println(param); + } + } +}