improve sqlwall rule

This commit is contained in:
kiki
2013-09-26 14:50:10 +08:00
parent 6df2cc1b06
commit 3347beea7b
24 changed files with 342 additions and 187 deletions
@@ -50,6 +50,9 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS
}
public void setTableSource(SQLExprTableSource tableSource) {
if (tableSource != null) {
tableSource.setParent(this);
}
this.tableSource = tableSource;
}
@@ -16,7 +16,8 @@
package com.alibaba.druid.sql.ast.statement;
public enum SQLUnionOperator {
UNION("UNION"), UNION_ALL("UNION ALL"), MINUS("MINUS"), INTERSECT("INTERSECT"), DISTINCT("UNION DISTINCT");
UNION("UNION"), UNION_ALL("UNION ALL"), MINUS("MINUS"), EXCEPT("EXCEPT"), INTERSECT("INTERSECT"),
DISTINCT("UNION DISTINCT");
public final String name;
@@ -30,11 +30,14 @@ public class MySqlLockTableStatement extends MySqlStatementImpl {
}
public void setTableSource(SQLExprTableSource tableSource) {
if (tableSource != null) {
tableSource.setParent(this);
}
this.tableSource = tableSource;
}
public void setTableSource(SQLName name) {
this.tableSource = new SQLExprTableSource(name);
setTableSource(new SQLExprTableSource(name));
}
public LockType getLockType() {
@@ -1380,8 +1380,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
print("USING ");
x.getUsing().accept(this);
print(" ON ");
print(" ON (");
x.getOn().accept(this);
print(") ");
if (x.getUpdateClause() != null) {
println();
@@ -3383,7 +3384,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
protected void printCascade() {
print(" CASCADE CONSTRAINTS");
}
@Override
public boolean visit(SQLMethodInvokeExpr x) {
if ("trim".equalsIgnoreCase(x.getMethodName())) {
@@ -3403,7 +3404,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
return false;
}
}
return super.visit(x);
}
}
@@ -35,9 +35,9 @@ public class Keywords {
map.put("AND", Token.AND);
map.put("ANY", Token.ANY);
map.put("AS", Token.AS);
map.put("ENABLE", Token.ENABLE);
map.put("DISABLE", Token. DISABLE);
map.put("DISABLE", Token.DISABLE);
map.put("ASC", Token.ASC);
map.put("BETWEEN", Token.BETWEEN);
@@ -61,6 +61,7 @@ public class Keywords {
map.put("DROP", Token.DROP);
map.put("ELSE", Token.ELSE);
map.put("EXPLAIN", Token.EXPLAIN);
map.put("EXCEPT", Token.EXCEPT);
map.put("END", Token.END);
map.put("ESCAPE", Token.ESCAPE);
@@ -121,18 +122,18 @@ public class Keywords {
map.put("WHEN", Token.WHEN);
map.put("WHERE", Token.WHERE);
map.put("XOR", Token.XOR);
map.put("OVER", Token.OVER);
map.put("TO", Token.TO);
map.put("USE", Token.USE);
map.put("REPLACE", Token.REPLACE);
map.put("COMMENT", Token.COMMENT);
map.put("COMPUTE", Token.COMPUTE);
map.put("WITH", Token.WITH);
map.put("GRANT", Token.GRANT);
DEFAULT_KEYWORDS = new Keywords(map);
}
@@ -62,7 +62,7 @@ public class SQLSelectParser extends SQLParser {
if (select.getOrderBy() == null) {
select.setOrderBy(parseOrderBy());
}
if (lexer.token() == Token.HINT) {
this.exprParser.parseHints(select.getHints());
}
@@ -103,6 +103,20 @@ public class SQLSelectParser extends SQLParser {
return unionRest(union);
}
if (lexer.token() == Token.EXCEPT) {
lexer.nextToken();
SQLUnionQuery union = new SQLUnionQuery();
union.setLeft(selectQuery);
union.setOperator(SQLUnionOperator.EXCEPT);
SQLSelectQuery right = this.query();
union.setRight(right);
return union;
}
if (lexer.token() == Token.INTERSECT) {
lexer.nextToken();
@@ -145,7 +159,7 @@ public class SQLSelectParser extends SQLParser {
}
accept(Token.SELECT);
if (lexer.token() == Token.COMMENT) {
lexer.nextToken();
}
@@ -73,6 +73,7 @@ public enum Token {
ALL("ALL"),
UNION("UNION"),
EXCEPT("EXCEPT"),
INTERSECT("INTERSECT"),
MINUS("MINUS"),
INNER("INNER"),
@@ -25,12 +25,12 @@ public interface SQLEvalVisitor extends SQLASTVisitor {
public static final String EVAL_EXPR = "eval.expr";
public static final Object EVAL_ERROR = new Object();
public static final Object EVAL_VALUE_COUNT = new Object();
public static final Object EVAL_VALUE_NULL = new Object();
public static final Object EVAL_VALUE_NULL = new Object();
Function getFunction(String funcName);
void registerFunction(String funcName, Function function);
void unregisterFunction(String funcName);
List<Object> getParameters();
@@ -704,7 +704,8 @@ public class SQLEvalVisitorUtils {
Object conditionValue = item.getConditionExpr().getAttribute(EVAL_VALUE);
if (eq(value, conditionValue)) {
if ((x.getValueExpr() != null && eq(value, conditionValue))
|| (x.getValueExpr() == null && conditionValue instanceof Boolean && (Boolean) conditionValue == Boolean.TRUE)) {
item.getValueExpr().accept(visitor);
if (item.getValueExpr().getAttributes().containsKey(EVAL_VALUE)) {
@@ -1051,6 +1052,8 @@ public class SQLEvalVisitorUtils {
if (list.size() == 1) {
return processValue(list.get(0));
}
} else if (value instanceof Date) {
return ((Date) value).getTime();
}
return value;
}
@@ -1702,6 +1705,10 @@ public class SQLEvalVisitorUtils {
return a;
}
if (a == EVAL_VALUE_NULL || b == EVAL_VALUE_NULL) {
return EVAL_VALUE_NULL;
}
if (a instanceof Date || b instanceof Date) {
return SQLEvalVisitor.EVAL_ERROR;
}