refactor sql parser

This commit is contained in:
高铁
2016-01-10 20:01:53 +08:00
parent d4066b101c
commit f8caff46c1
11 changed files with 44 additions and 175 deletions
@@ -30,7 +30,6 @@ import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
@@ -44,7 +43,6 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLIfStatement;
import com.alibaba.druid.sql.ast.statement.SQLLoopStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
@@ -3206,41 +3204,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
return false;
}
@Override
public boolean visit(SQLParameter x) {
if (x.getDataType().getName().equalsIgnoreCase("CURSOR")) {
print0(ucase ? "CURSOR " : "cursor ");
x.getName().accept(this);
print0(ucase ? " IS" : " is");
incrementIndent();
println();
SQLSelect select = ((SQLQueryExpr) x.getDefaultValue()).getSubQuery();
select.accept(this);
decrementIndent();
} else {
if (x.getParamType() == SQLParameter.ParameterType.IN) {
print0(ucase ? "IN " : "in ");
} else if (x.getParamType() == SQLParameter.ParameterType.OUT) {
print0(ucase ? "OUT " : "out ");
} else if (x.getParamType() == SQLParameter.ParameterType.INOUT) {
print0(ucase ? "INOUT " : "inout ");
}
x.getName().accept(this);
print(' ');
x.getDataType().accept(this);
if (x.getDefaultValue() != null) {
print0(" := ");
x.getDefaultValue().accept(this);
}
}
return false;
}
@Override
public boolean visit(MySqlWhileStatement x) {
if (x.getLabelName() != null && !x.getLabelName().equals("")) {
@@ -28,7 +28,6 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.ast.statement.SQLBlockStatement;
import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType;
@@ -2515,38 +2514,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
@Override
public boolean visit(SQLParameter x) {
if (x.getDataType().getName().equalsIgnoreCase("CURSOR")) {
print0(ucase ? "CURSOR " : "cursor ");
x.getName().accept(this);
print0(ucase ? " IS" : " is");
incrementIndent();
println();
SQLSelect select = ((SQLQueryExpr) x.getDefaultValue()).getSubQuery();
select.accept(this);
decrementIndent();
} else {
x.getName().accept(this);
print(' ');
x.getDataType().accept(this);
if (x.getDefaultValue() != null) {
print0(" := ");
x.getDefaultValue().accept(this);
}
}
return false;
}
@Override
public void endVisit(SQLParameter x) {
}
@Override
public boolean visit(OracleCommitStatement x) {
print0(ucase ? "COMMIT" : "commit");
@@ -1,52 +0,0 @@
/*
* 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.sql.dialect.postgresql.ast.expr;
import com.alibaba.druid.sql.ast.SQLDataType;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSQLObjectImpl;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
public class PGParameter extends PGSQLObjectImpl {
private SQLExpr name;
private SQLDataType dataType;
public SQLExpr getName() {
return name;
}
public void setName(SQLExpr name) {
this.name = name;
}
public SQLDataType getDataType() {
return dataType;
}
public void setDataType(SQLDataType dataType) {
this.dataType = dataType;
}
@Override
public void accept0(PGASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, name);
acceptChild(visitor, dataType);
}
visitor.endVisit(this);
}
}
@@ -19,15 +19,15 @@ import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLParameter;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGSQLObject;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGParameter;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class PGFunctionTableSource extends SQLExprTableSource implements PGSQLObject {
private final List<PGParameter> parameters = new ArrayList<PGParameter>();
private final List<SQLParameter> parameters = new ArrayList<SQLParameter>();
public PGFunctionTableSource(){
@@ -37,7 +37,7 @@ public class PGFunctionTableSource extends SQLExprTableSource implements PGSQLOb
this.expr = expr;
}
public List<PGParameter> getParameters() {
public List<SQLParameter> getParameters() {
return parameters;
}
@@ -18,13 +18,13 @@ package com.alibaba.druid.sql.dialect.postgresql.parser;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLParameter;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGParameter;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.IntoOption;
@@ -286,9 +286,9 @@ public class PGSelectParser extends SQLSelectParser {
return super.parseTableSourceRest(tableSource);
}
private void parserParameters(List<PGParameter> parameters) {
private void parserParameters(List<SQLParameter> parameters) {
for (;;) {
PGParameter parameter = new PGParameter();
SQLParameter parameter = new SQLParameter();
parameter.setName(this.exprParser.name());
parameter.setDataType(this.exprParser.parseDataType());
@@ -25,7 +25,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGParameter;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPolygonExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGTypeCastExpr;
@@ -85,10 +84,6 @@ public interface PGASTVisitor extends SQLASTVisitor {
boolean visit(PGUpdateStatement x);
void endVisit(PGParameter x);
boolean visit(PGParameter x);
void endVisit(PGFunctionTableSource x);
boolean visit(PGFunctionTableSource x);
@@ -25,7 +25,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGParameter;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPolygonExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGTypeCastExpr;
@@ -150,16 +149,6 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi
return true;
}
@Override
public void endVisit(PGParameter x) {
}
@Override
public boolean visit(PGParameter x) {
return true;
}
@Override
public void endVisit(PGFunctionTableSource x) {
@@ -29,7 +29,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGParameter;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPolygonExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGTypeCastExpr;
@@ -448,21 +447,6 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
}
@Override
public void endVisit(PGParameter x) {
}
@Override
public boolean visit(PGParameter x) {
x.getName().accept(this);
print(' ');
x.getDataType().accept(this);
return false;
}
@Override
public boolean visit(PGFunctionTableSource x) {
x.getExpr().accept(this);
@@ -31,7 +31,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGParameter;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPolygonExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGTypeCastExpr;
@@ -261,16 +260,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
return this.visit((SQLSelectQueryBlock) x);
}
@Override
public void endVisit(PGParameter x) {
}
@Override
public boolean visit(PGParameter x) {
return false;
}
@Override
public void endVisit(PGFunctionTableSource x) {
@@ -32,6 +32,7 @@ import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.SQLOver;
import com.alibaba.druid.sql.ast.SQLParameter;
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
@@ -2567,6 +2568,41 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
print0(ucase ? "END LOOP" : "end loop");
return false;
}
@Override
public boolean visit(SQLParameter x) {
if (x.getDataType().getName().equalsIgnoreCase("CURSOR")) {
print0(ucase ? "CURSOR " : "cursor ");
x.getName().accept(this);
print0(ucase ? " IS" : " is");
incrementIndent();
println();
SQLSelect select = ((SQLQueryExpr) x.getDefaultValue()).getSubQuery();
select.accept(this);
decrementIndent();
} else {
if (x.getParamType() == SQLParameter.ParameterType.IN) {
print0(ucase ? "IN " : "in ");
} else if (x.getParamType() == SQLParameter.ParameterType.OUT) {
print0(ucase ? "OUT " : "out ");
} else if (x.getParamType() == SQLParameter.ParameterType.INOUT) {
print0(ucase ? "INOUT " : "inout ");
}
x.getName().accept(this);
print(' ');
x.getDataType().accept(this);
if (x.getDefaultValue() != null) {
print0(" := ");
x.getDefaultValue().accept(this);
}
}
return false;
}
public boolean isUppCase() {
return ucase;
@@ -1,10 +1,7 @@
package com.alibaba.druid.bvt.sql.postgresql;
import junit.framework.TestCase;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGParameter;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGFunctionTableSource;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.FetchClause;
@@ -12,6 +9,8 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForC
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitorAdapter;
import junit.framework.TestCase;
public class PGASTVisitorAdapterTest extends TestCase {
public void test_adapter() throws Exception {
@@ -23,7 +22,6 @@ public class PGASTVisitorAdapterTest extends TestCase {
new PGWithQuery().accept(adapter);
new PGWithClause().accept(adapter);
new PGDeleteStatement().accept(adapter);
new PGParameter().accept(adapter);
new PGFunctionTableSource().accept(adapter);
}
}