mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
+6
-7
@@ -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);
|
||||
|
||||
+1
-1
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user