improved sql parser.

This commit is contained in:
wenshao
2017-08-08 20:34:21 +08:00
parent bcb692f424
commit 5ea4ac8009
35 changed files with 538 additions and 22 deletions
@@ -28,11 +28,23 @@ public class MySqlExtractExpr extends SQLExprImpl implements MySqlExpr {
public MySqlExtractExpr(){
}
public MySqlExtractExpr clone() {
MySqlExtractExpr x = new MySqlExtractExpr();
if (value != null) {
x.setValue(value.clone());
}
x.unit = unit;
return x;
}
public SQLExpr getValue() {
return value;
}
public void setValue(SQLExpr value) {
if (value != null) {
value.setParent(this);
}
this.value = value;
}
@@ -28,6 +28,15 @@ public class MySqlIntervalExpr extends SQLExprImpl implements MySqlExpr {
public MySqlIntervalExpr(){
}
public MySqlIntervalExpr clone() {
MySqlIntervalExpr x = new MySqlIntervalExpr();
if (value != null) {
x.setValue(value.clone());
}
x.unit = unit;
return x;
}
public SQLExpr getValue() {
return value;
}
@@ -31,6 +31,20 @@ public class MySqlMatchAgainstExpr extends SQLExprImpl implements MySqlExpr {
private SearchModifier searchModifier;
public MySqlMatchAgainstExpr clone() {
MySqlMatchAgainstExpr x = new MySqlMatchAgainstExpr();
for (SQLExpr column : columns) {
SQLExpr column2 = column.clone();
column2.setParent(x);
x.columns.add(column2);
}
if (against != null) {
x.setAgainst(against.clone());
}
x.searchModifier = searchModifier;
return x;
}
public List<SQLExpr> getColumns() {
return columns;
}
@@ -44,6 +58,9 @@ public class MySqlMatchAgainstExpr extends SQLExprImpl implements MySqlExpr {
}
public void setAgainst(SQLExpr against) {
if (against != null) {
against.setParent(this);
}
this.against = against;
}
@@ -32,10 +32,19 @@ public class MySqlOrderingExpr extends SQLExprImpl implements MySqlExpr {
public MySqlOrderingExpr(SQLExpr expr, SQLOrderingSpecification type){
super();
this.expr = expr;
setExpr(expr);
this.type = type;
}
public MySqlOrderingExpr clone() {
MySqlOrderingExpr x = new MySqlOrderingExpr();
if (expr != null) {
x.setExpr(expr.clone());
}
x.type = type;
return x;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
MySqlASTVisitor mysqlVisitor = (MySqlASTVisitor) visitor;
@@ -51,7 +60,9 @@ public class MySqlOrderingExpr extends SQLExprImpl implements MySqlExpr {
}
public void setExpr(SQLExpr expr) {
expr.setParent(this);
if (expr != null) {
expr.setParent(this);
}
this.expr = expr;
}
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.ast.*;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlObject {
@@ -46,6 +47,34 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO
}
public MySqlSelectQueryBlock clone() {
MySqlSelectQueryBlock x = new MySqlSelectQueryBlock();
cloneTo(x);
x.hignPriority = hignPriority;
x.straightJoin = straightJoin;
x.smallResult = smallResult;
x.bigResult = bigResult;
x.bufferResult = bufferResult;
x.cache = cache;
x.calcFoundRows = calcFoundRows;
if (procedureName != null) {
x.setProcedureName(procedureName.clone());
}
if (procedureArgumentList != null) {
for (SQLExpr arg : procedureArgumentList) {
SQLExpr arg_cloned = arg.clone();
arg_cloned.setParent(this);
x.procedureArgumentList.add(arg_cloned);
}
}
x.lockInShareMode = lockInShareMode;
return x;
}
public int getHintsSize() {
if (hints == null) {
return 0;
@@ -16,10 +16,7 @@
package com.alibaba.druid.sql.dialect.mysql.visitor;
import com.alibaba.druid.sql.ast.*;
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.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
@@ -3677,4 +3674,31 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
block.accept(this);
return false;
}
@Override
public boolean visit(SQLCommentStatement x) {
SQLCommentStatement.Type type = x.getType();
SQLExpr on = x.getOn();
if (type == SQLCommentStatement.Type.TABLE) {
print0(ucase ? "ALTER TABLE " : "alter table ");
on.accept(this);
print0(ucase ? " COMMENT = " : " comment = ");
x.getComment().accept(this);
} else {
SQLPropertyExpr propertyExpr = (SQLPropertyExpr) on;
SQLExpr table = propertyExpr.getOwner();
String column = propertyExpr.getName();
print0(ucase ? "ALTER TABLE " : "alter table ");
table.accept(this);
print0(ucase ? " MODIFY COLUMN " : " modify column ");
print(column);
print0(ucase ? " COMMENT " : " comment ");
x.getComment().accept(this);
}
return false;
}
} //
@@ -28,9 +28,16 @@ public class OracleCursorExpr extends SQLExprImpl implements OracleExpr {
}
public OracleCursorExpr clone() {
OracleCursorExpr x = new OracleCursorExpr();
if (query != null) {
x.setQuery(query.clone());
}
return x;
}
public OracleCursorExpr(SQLSelect query){
super();
this.query = query;
setQuery(query);
}
public SQLSelect getQuery() {
@@ -31,11 +31,22 @@ public class OracleIsSetExpr extends SQLExprImpl implements OracleExpr {
this.nestedTable = nestedTable;
}
public OracleIsSetExpr clone() {
OracleIsSetExpr x = new OracleIsSetExpr();
if (nestedTable != null) {
x.setNestedTable(nestedTable.clone());
}
return x;
}
public SQLExpr getNestedTable() {
return nestedTable;
}
public void setNestedTable(SQLExpr nestedTable) {
if (nestedTable != null) {
nestedTable.setParent(this);
}
this.nestedTable = nestedTable;
}
@@ -22,6 +22,14 @@ public class PGBoxExpr extends PGExprImpl {
private SQLExpr value;
public PGBoxExpr clone() {
PGBoxExpr x = new PGBoxExpr();
if (value != null) {
x.setValue(value.clone());
}
return x;
}
public SQLExpr getValue() {
return value;
}
@@ -22,6 +22,14 @@ public class PGCidrExpr extends PGExprImpl {
private SQLExpr value;
public PGCidrExpr clone() {
PGCidrExpr x = new PGCidrExpr();
if (value != null) {
x.setValue(value.clone());
}
return x;
}
public SQLExpr getValue() {
return value;
}
@@ -22,6 +22,14 @@ public class PGCircleExpr extends PGExprImpl {
private SQLExpr value;
public PGCircleExpr clone() {
PGCircleExpr x = new PGCircleExpr();
if (value != null) {
x.setValue(value.clone());
}
return x;
}
public SQLExpr getValue() {
return value;
}
@@ -23,6 +23,15 @@ public class PGExtractExpr extends PGExprImpl {
private PGDateField field;
private SQLExpr source;
public PGExtractExpr clone() {
PGExtractExpr x = new PGExtractExpr();
x.field = field;
if (source != null) {
x.setSource(source.clone());
}
return x;
}
public PGDateField getField() {
return field;
}
@@ -36,6 +45,9 @@ public class PGExtractExpr extends PGExprImpl {
}
public void setSource(SQLExpr source) {
if (source != null) {
source.setParent(this);
}
this.source = source;
}
@@ -22,6 +22,14 @@ public class PGInetExpr extends PGExprImpl {
private SQLExpr value;
public PGInetExpr clone() {
PGInetExpr x = new PGInetExpr();
if (value != null) {
x.setValue(value.clone());
}
return x;
}
public SQLExpr getValue() {
return value;
}
@@ -22,6 +22,14 @@ public class PGLineSegmentsExpr extends PGExprImpl {
private SQLExpr value;
public PGLineSegmentsExpr clone() {
PGLineSegmentsExpr x = new PGLineSegmentsExpr();
if (value != null) {
x.setValue(value.clone());
}
return x;
}
public SQLExpr getValue() {
return value;
}
@@ -23,6 +23,14 @@ public class PGMacAddrExpr extends PGExprImpl {
private SQLExpr value;
public PGMacAddrExpr clone() {
PGMacAddrExpr x = new PGMacAddrExpr();
if (value != null) {
x.setValue(value.clone());
}
return x;
}
public SQLExpr getValue() {
return value;
}
@@ -22,6 +22,14 @@ public class PGPointExpr extends PGExprImpl {
private SQLExpr value;
public PGPointExpr clone() {
PGPointExpr x = new PGPointExpr();
if (value != null) {
x.setValue(value.clone());
}
return x;
}
public SQLExpr getValue() {
return value;
}
@@ -23,6 +23,14 @@ public class PGPolygonExpr extends PGExprImpl {
private SQLExpr value;
public PGPolygonExpr clone() {
PGPolygonExpr x = new PGPolygonExpr();
if (value != null) {
x.setValue(value.clone());
}
return x;
}
public SQLExpr getValue() {
return value;
}