sql parser refactor

This commit is contained in:
温少
2012-05-23 09:45:41 +08:00
parent 1e37332858
commit 35184b1103
9 changed files with 31 additions and 54 deletions
@@ -26,10 +26,12 @@ public class SQLVariantRefExpr extends SQLExprImpl {
private boolean global = false;
private int index = -1;
public SQLVariantRefExpr(String name){
this.name = name;
}
public SQLVariantRefExpr(String name, boolean global){
this.name = name;
this.global = global;
@@ -39,6 +41,14 @@ public class SQLVariantRefExpr extends SQLExprImpl {
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getName() {
return this.name;
}
@@ -82,6 +82,8 @@ public class Lexer {
*/
private boolean allowComment = true;
private int varIndex = -1;
public Lexer(String input){
this(input, true);
}
@@ -93,6 +95,10 @@ public class Lexer {
public void setAllowComment(boolean allowComment) {
this.allowComment = allowComment;
}
public int nextVarIndex() {
return ++varIndex;
}
private static class SavePoint {
@@ -185,7 +191,7 @@ public class Lexer {
public final Token token() {
return token;
}
public String info() {
return this.token + " " + this.stringVal();
}
@@ -507,11 +513,11 @@ public class Lexer {
token = LITERAL_CHARS;
break;
} else {
if (!hasSpecial) {
System.arraycopy(buf, np + 1, sbuf, 0, sp);
hasSpecial = true;
}
putChar('\'');
if (!hasSpecial) {
System.arraycopy(buf, np + 1, sbuf, 0, sp);
hasSpecial = true;
}
putChar('\'');
continue;
}
}
@@ -356,7 +356,9 @@ public class SQLExprParser extends SQLParser {
break;
case QUES:
lexer.nextToken();
sqlExpr = new SQLVariantRefExpr("?");
SQLVariantRefExpr quesVarRefExpr = new SQLVariantRefExpr("?");
quesVarRefExpr.setIndex(lexer.nextVarIndex());
sqlExpr = quesVarRefExpr;
break;
case LEFT:
sqlExpr = new SQLIdentifierExpr("LEFT");
@@ -4,8 +4,6 @@ import java.util.List;
public interface SQLEvalVisitor extends SQLASTVisitor {
public static final String EVAL_VAR_INDEX = "eval.varIndex";
public static final String EVAL_VALUE = "eval.value";
List<Object> getParameters();
@@ -1,7 +1,6 @@
package com.alibaba.druid.sql.visitor;
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE;
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VAR_INDEX;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -104,16 +103,12 @@ public class SQLEvalVisitorUtils {
Map<String, Object> attributes = x.getAttributes();
Integer varIndex = (Integer) attributes.get(EVAL_VAR_INDEX);
if (varIndex == null) {
varIndex = visitor.incrementAndGetVariantIndex();
x.putAttribute(EVAL_VAR_INDEX, varIndex);
}
int varIndex = x.getIndex();
if (visitor.getParameters().size() > 0) {
if (varIndex != -1 && visitor.getParameters().size() > varIndex) {
boolean containsValue = attributes.containsKey(EVAL_VALUE);
if (!containsValue) {
Object value = visitor.getParameters().get(varIndex.intValue());
Object value = visitor.getParameters().get(varIndex);
attributes.put(EVAL_VALUE, value);
}
}