improved sql parser.

This commit is contained in:
wenshao
2017-10-09 12:38:10 +08:00
parent dda1569080
commit 3b4add43f9
8 changed files with 99 additions and 16 deletions
@@ -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;
}
@@ -163,6 +163,14 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
this.inputParameters = parameters;
}
/**
*
* @since 1.1.5
*/
public void setOutputParameters(List<Object> 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());
@@ -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> T unwrap(Class<T> 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;
}
@@ -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() {
@@ -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 {
@@ -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);
@@ -35,7 +35,7 @@ public class MySqlParameterizedOutputVisitorTest_34 extends TestCase {
List<Object> parameters = new ArrayList<Object>();
visitor.setParameterized(true);
visitor.setParameterizedMergeInList(true);
visitor.setParameters(parameters);
visitor.setOutputParameters(parameters);
visitor.setExportTables(true);
/*visitor.setPrettyFormat(false);*/
@@ -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<SQLStatement> 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"));
}
}