From 3b4add43f9b047f62776d395f705ce62e4064d00 Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 9 Oct 2017 12:38:10 +0800 Subject: [PATCH] improved sql parser. --- .../ast/stmt/PGDeleteStatement.java | 13 ++--- .../sql/visitor/SQLASTOutputVisitor.java | 14 +++++ .../druid/support/calcite/DDLSchema.java | 11 ++-- .../druid/support/calcite/DDLTable.java | 15 ++++- .../com/alibaba/druid/bvt/bug/Issue1865.java | 3 + .../createTable/MySqlCreateTableTest81.java | 1 + ...ySqlParameterizedOutputVisitorTest_34.java | 2 +- .../bvt/sql/postgresql/PGDeleteTest9.java | 56 +++++++++++++++++++ 8 files changed, 99 insertions(+), 16 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest9.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java index 85b08572f7..aa5a1701a1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGDeleteStatement.java @@ -28,8 +28,7 @@ import com.alibaba.druid.util.JdbcConstants; public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatement { private boolean returning; - private String alias; - + public PGDeleteStatement() { super (JdbcConstants.POSTGRESQL); } @@ -43,15 +42,16 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem } public String getAlias() { - return alias; + if (tableSource == null) { + return null; + } + return tableSource.getAlias(); } public void setAlias(String alias) { - this.alias = alias; + this.tableSource.setAlias(alias); } - - protected void accept0(SQLASTVisitor visitor) { accept0((PGASTVisitor) visitor); } @@ -73,7 +73,6 @@ public class PGDeleteStatement extends SQLDeleteStatement implements PGSQLStatem cloneTo(x); x.returning = returning; - x.alias = alias; return x; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 9dc66aff6e..c2b7a0161f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -163,6 +163,14 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet this.inputParameters = parameters; } + /** + * + * @since 1.1.5 + */ + public void setOutputParameters(List parameters) { + this.parameters = parameters; + } + public int getIndentCount() { return indentCount; } @@ -2286,10 +2294,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLDeleteStatement x) { SQLTableSource from = x.getFrom(); + String alias = x.getAlias(); if (from == null) { print0(ucase ? "DELETE FROM " : "delete from "); printTableSourceExpr(x.getTableName()); + + if (alias != null) { + print(' '); + print0(alias); + } } else { print0(ucase ? "DELETE " : "delete "); printTableSourceExpr(x.getTableName()); diff --git a/src/main/java/com/alibaba/druid/support/calcite/DDLSchema.java b/src/main/java/com/alibaba/druid/support/calcite/DDLSchema.java index ed4fc570d2..f239cad859 100644 --- a/src/main/java/com/alibaba/druid/support/calcite/DDLSchema.java +++ b/src/main/java/com/alibaba/druid/support/calcite/DDLSchema.java @@ -18,9 +18,7 @@ package com.alibaba.druid.support.calcite; import com.google.common.collect.*; import org.apache.calcite.linq4j.tree.Expression; import org.apache.calcite.materialize.Lattice; -import org.apache.calcite.schema.Function; -import org.apache.calcite.schema.Schema; -import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.schema.*; import org.apache.calcite.schema.Table; import java.util.Collection; @@ -105,6 +103,11 @@ public class DDLSchema implements Schema, SchemaPlus { return false; } + @Override + public Schema snapshot(SchemaVersion version) { + return null; + } + @Override public T unwrap(Class clazz) { return null; @@ -124,12 +127,10 @@ public class DDLSchema implements Schema, SchemaPlus { } - @Override public boolean contentsHaveChangedSince(long lastCheck, long now) { return false; } - @Override public Schema snapshot(long now) { return null; } diff --git a/src/main/java/com/alibaba/druid/support/calcite/DDLTable.java b/src/main/java/com/alibaba/druid/support/calcite/DDLTable.java index 1069fb1bce..9e99890fa6 100644 --- a/src/main/java/com/alibaba/druid/support/calcite/DDLTable.java +++ b/src/main/java/com/alibaba/druid/support/calcite/DDLTable.java @@ -18,13 +18,12 @@ package com.alibaba.druid.support.calcite; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLTableElement; +import org.apache.calcite.config.CalciteConnectionConfig; import org.apache.calcite.rel.type.*; import org.apache.calcite.schema.Schema; import org.apache.calcite.schema.Statistic; import org.apache.calcite.schema.Table; -import org.apache.calcite.sql.SqlCollation; -import org.apache.calcite.sql.SqlIdentifier; -import org.apache.calcite.sql.SqlIntervalQualifier; +import org.apache.calcite.sql.*; import org.apache.calcite.sql.type.SqlTypeName; import java.nio.charset.Charset; @@ -70,6 +69,16 @@ public class DDLTable implements Table, RelDataType { return Schema.TableType.TABLE; } + @Override + public boolean isRolledUp(String column) { + return false; + } + + @Override + public boolean rolledUpColumnValidInsideAgg(String column, SqlCall call, SqlNode parent, CalciteConnectionConfig config) { + return false; + } + @Override public boolean isStruct() { diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Issue1865.java b/src/test/java/com/alibaba/druid/bvt/bug/Issue1865.java index ef0e71ecce..6cd73b4b8f 100644 --- a/src/test/java/com/alibaba/druid/bvt/bug/Issue1865.java +++ b/src/test/java/com/alibaba/druid/bvt/bug/Issue1865.java @@ -34,6 +34,9 @@ public class Issue1865 extends TestCase { assertEquals("SELECT *\n" + "FROM t", stmt.toString()); + queryBlock.addCondition("id = 3"); + assertEquals("DELETE FROM t\n" + + "WHERE id = 3", stmt.toString()); } public void test_for_select_group() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest81.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest81.java index 81e42f30bd..a4a71b7d41 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest81.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest81.java @@ -41,6 +41,7 @@ public class MySqlCreateTableTest81 extends MysqlTest { // Column column = visitor.getColumn("tb_custom_vip_show_message", "custom_vip_show_message_seq"); // assertNotNull(column); // assertEquals("INT", column.getDataType()); + System.out.println(stmt); { String output = SQLUtils.toMySqlString(stmt); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_34.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_34.java index ecfe301639..22f43e14ec 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_34.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_34.java @@ -35,7 +35,7 @@ public class MySqlParameterizedOutputVisitorTest_34 extends TestCase { List parameters = new ArrayList(); visitor.setParameterized(true); visitor.setParameterizedMergeInList(true); - visitor.setParameters(parameters); + visitor.setOutputParameters(parameters); visitor.setExportTables(true); /*visitor.setPrettyFormat(false);*/ diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest9.java new file mode 100644 index 0000000000..c718768207 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGDeleteTest9.java @@ -0,0 +1,56 @@ +/* + * Copyright 1999-2017 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.postgresql; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +import java.util.List; + +public class PGDeleteTest9 extends PGTest { + + public void test_0() throws Exception { + String sql = "DELETE FROM ecc_cpr.ccg_gts_Boardlw i\n" + + "WHERE i.contract_header_id = ?"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + assertEquals("DELETE FROM ecc_cpr.ccg_gts_Boardlw AS i\n" + + "WHERE i.contract_header_id = ?", stmt.toString()); + + assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("ecc_cpr.ccg_gts_Boardlw"))); + + assertEquals(1, visitor.getColumns().size() ); + + assertTrue(visitor.containsColumn("ecc_cpr.ccg_gts_Boardlw", "contract_header_id")); + } + + +}