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:
@@ -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);
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1825
-18
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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user