improved sql parser.

This commit is contained in:
wenshao
2017-09-29 21:49:59 +08:00
parent 236e99bf45
commit bc8032c595
11 changed files with 2113 additions and 35 deletions
@@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*;
import com.alibaba.druid.util.FnvHash;
@@ -762,6 +763,13 @@ public class SQLTransformUtils {
return y;
}
if (x instanceof OracleWithSubqueryEntry) {
SQLWithSubqueryClause.Entry entry = new SQLWithSubqueryClause.Entry();
((OracleWithSubqueryEntry) x).cloneTo(entry);
entry.setParent(x.getParent());
return entry;
}
return x;
}
@@ -74,7 +74,7 @@ public class SQLWithSubqueryClause extends SQLObjectImpl {
protected SQLSelect subQuery;
protected SQLStatement returningStatement;
protected void cloneTo(Entry x) {
public void cloneTo(Entry x) {
for (SQLName column : columns) {
SQLName column2 = column.clone();
column2.setParent(x);
@@ -63,7 +63,7 @@ public class OracleWithSubqueryEntry extends Entry implements OracleSQLObject {
this.accept0((OracleASTVisitor) visitor);
}
protected void cloneTo(OracleWithSubqueryEntry x) {
public void cloneTo(OracleWithSubqueryEntry x) {
super.cloneTo(x);
if (searchClause != null) {
@@ -885,17 +885,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
@Override
public boolean visit(OracleCursorExpr x) {
print0(ucase ? "CURSOR(" : "cursor(");
this.indentCount++;
println();
x.getQuery().accept(this);
this.indentCount--;
println();
print(')');
return false;
}
@Override
public void endVisit(OracleCursorExpr x) {
File diff suppressed because it is too large Load Diff
@@ -37,6 +37,8 @@ import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause;
import com.alibaba.druid.sql.ast.statement.SQLWhileStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes;
import com.alibaba.druid.sql.ast.statement.SQLDeclareStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreatePackageStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
import com.alibaba.druid.sql.dialect.oracle.parser.OracleFunctionDataType;
@@ -2668,7 +2670,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
if (left instanceof SQLJoinTableSource
&& ((SQLJoinTableSource) left).getJoinType() == JoinType.COMMA
&& x.getJoinType() != JoinType.COMMA) {
&& x.getJoinType() != JoinType.COMMA
&& !JdbcConstants.POSTGRESQL.equals(dbType)) {
print('(');
printTableSource(left);
print(')');
@@ -5388,4 +5391,33 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
this.ucase = isEnabled(VisitorFeature.OutputUCase);
this.parameterized = isEnabled(VisitorFeature.OutputParameterized);
}
/////////////// for oracle
public boolean visit(OracleCursorExpr x) {
print0(ucase ? "CURSOR(" : "cursor(");
this.indentCount++;
println();
x.getQuery().accept(this);
this.indentCount--;
println();
print(')');
return false;
}
public boolean visit(OracleDatetimeExpr x) {
x.getExpr().accept(this);
SQLExpr timeZone = x.getTimeZone();
if (timeZone instanceof SQLIdentifierExpr) {
if (((SQLIdentifierExpr) timeZone).getName().equalsIgnoreCase("LOCAL")) {
print0(ucase ? " AT LOCAL" : "alter session set ");
return false;
}
}
print0(ucase ? " AT TIME ZONE " : " at time zone ");
timeZone.accept(this);
return false;
}
}