improved sql parser.

This commit is contained in:
wenshao
2017-07-11 15:48:32 +08:00
parent 15ac64e501
commit bb833e499e
20 changed files with 564 additions and 95 deletions
@@ -16,6 +16,7 @@
package com.alibaba.druid.sql.dialect.db2.ast.stmt;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.db2.ast.DB2Object;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2ASTVisitor;
@@ -80,4 +81,12 @@ public class DB2SelectQueryBlock extends SQLSelectQueryBlock implements DB2Objec
public static enum Isolation {
RR, RS, CS, UR
}
public void limit(int rowCount, int offset) {
if (offset <= 0) {
setFirst(new SQLIntegerExpr(rowCount));
} else {
throw new UnsupportedOperationException("not support offset");
}
}
}
@@ -328,9 +328,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
dataType.accept(this);
}
if (x.getCharsetExpr() != null) {
final SQLExpr charsetExpr = x.getCharsetExpr();
if (charsetExpr != null) {
print0(ucase ? " CHARSET " : " charset ");
x.getCharsetExpr().accept(this);
charsetExpr.accept(this);
}
for (SQLColumnConstraint item : x.getConstraints()) {
@@ -338,20 +339,23 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
item.accept(this);
}
if (x.getDefaultExpr() != null) {
final SQLExpr defaultExpr = x.getDefaultExpr();
if (defaultExpr != null) {
print0(ucase ? " DEFAULT " : " default ");
x.getDefaultExpr().accept(this);
defaultExpr.accept(this);
}
if (x.getStorage() != null) {
final SQLExpr storage = x.getStorage();
if (storage != null) {
print0(ucase ? " STORAGE " : " storage ");
x.getStorage().accept(this);
storage.accept(this);
}
if (x.getOnUpdate() != null) {
SQLExpr onUpdate = x.getOnUpdate();
if (onUpdate != null) {
print0(ucase ? " ON UPDATE " : " on update ");
x.getOnUpdate().accept(this);
onUpdate.accept(this);
}
if (x.isAutoIncrement()) {
@@ -21,7 +21,9 @@ import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLHint;
import com.alibaba.druid.sql.ast.SQLLimit;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor;
@@ -122,4 +124,12 @@ public class OdpsSelectQueryBlock extends SQLSelectQueryBlock {
public String toString() {
return SQLUtils.toOdpsString(this);
}
public void limit(int rowCount, int offset) {
if (offset > 0) {
throw new UnsupportedOperationException("not support offset");
}
setLimit(new SQLLimit(new SQLIntegerExpr(rowCount)));
}
}
@@ -21,6 +21,9 @@ import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLCommentHint;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLLimit;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
@@ -147,4 +150,15 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock {
public String toString() {
return SQLUtils.toOracleString(this);
}
public void limit(int rowCount, int offset) {
if (offset <= 0) {
SQLExpr rowCountExpr = new SQLIntegerExpr(rowCount);
SQLExpr newCondition = SQLUtils.buildCondition(SQLBinaryOperator.BooleanAnd, rowCountExpr, false,
where);
setWhere(newCondition);
} else {
throw new UnsupportedOperationException("not support offset");
}
}
}
@@ -15,6 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.sqlserver.ast;
import com.alibaba.druid.sql.ast.SQLLimit;
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -34,6 +36,10 @@ public class SQLServerSelectQueryBlock extends SQLSelectQueryBlock {
this.top = top;
}
public void setTop(int rowCount) {
setTop(new SQLServerTop(new SQLIntegerExpr(rowCount)));
}
@Override
protected void accept0(SQLASTVisitor visitor) {
accept0((SQLServerASTVisitor) visitor);
@@ -49,4 +55,12 @@ public class SQLServerSelectQueryBlock extends SQLSelectQueryBlock {
}
visitor.endVisit(this);
}
public void limit(int rowCount, int offset) {
if (offset <= 0) {
setTop(rowCount);
} else {
throw new UnsupportedOperationException("not support offset");
}
}
}