From 35184b11035f7477bc2f2876aca8df1b96e790c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 23 May 2012 09:45:41 +0800 Subject: [PATCH] sql parser refactor --- .../spi/MSSQLServerMappingVisitor.java | 6 ------ .../mapping/spi/MappingVisitorUtils.java | 20 ++----------------- .../mapping/spi/MySqlMappingVisitor.java | 6 ------ .../mapping/spi/OracleMappingVisitor.java | 6 ------ .../druid/sql/ast/expr/SQLVariantRefExpr.java | 12 ++++++++++- .../com/alibaba/druid/sql/parser/Lexer.java | 18 +++++++++++------ .../druid/sql/parser/SQLExprParser.java | 4 +++- .../druid/sql/visitor/SQLEvalVisitor.java | 2 -- .../sql/visitor/SQLEvalVisitorUtils.java | 11 +++------- 9 files changed, 31 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java index 189f8169a2..95f7a83bb0 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java @@ -14,7 +14,6 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; @@ -111,11 +110,6 @@ public class MSSQLServerMappingVisitor extends SQLServerASTVisitorAdapter implem return MappingVisitorUtils.visit(this, x); } - @Override - public boolean visit(SQLVariantRefExpr x) { - return MappingVisitorUtils.visit(this, x); - } - @Override public boolean visit(SQLAllColumnExpr x) { return MappingVisitorUtils.visit(this, x); diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java index d0ffb087dc..1c2e7b2a4e 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java @@ -30,7 +30,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.L public class MappingVisitorUtils { - private static final String MAPPING_VAR_INDEX = "mapping.varIndex"; private static final String MAPPING_VALUE = "mapping.value"; private static final String MAPPING_PROPERTY = "mapping.property"; private static final String MAPPING_ENTITY = "mapping.entity"; @@ -252,14 +251,9 @@ public class MappingVisitorUtils { } if (expr instanceof SQLVariantRefExpr) { - Map attributes = expr.getAttributes(); - Integer varIndex = (Integer) attributes.get(MAPPING_VAR_INDEX); - if (varIndex == null) { - varIndex = visitor.getAndIncrementVariantIndex(); - expr.putAttribute(MAPPING_VAR_INDEX, varIndex); - } + int varIndex = ((SQLVariantRefExpr) expr).getIndex(); - if (visitor.getParameters().size() > varIndex) { + if (varIndex != -1 && visitor.getParameters().size() > varIndex) { Object parameter = visitor.getParameters().get(varIndex); expr.putAttribute(MAPPING_VALUE, parameter); } @@ -371,16 +365,6 @@ public class MappingVisitorUtils { return false; } - public static boolean visit(MappingVisitor visitor, SQLVariantRefExpr x) { - Map attributes = x.getAttributes(); - Integer varIndex = (Integer) attributes.get(MAPPING_VAR_INDEX); - if (varIndex == null) { - varIndex = visitor.getAndIncrementVariantIndex(); - x.putAttribute(MAPPING_VAR_INDEX, varIndex); - } - return false; - } - public static boolean visit(MappingVisitor visitor, MySqlSelectQueryBlock x) { Integer maxLimit = visitor.getEngine().getMaxLimit(); diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java index da16c5ec05..016a3acbf8 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java @@ -14,7 +14,6 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; @@ -110,11 +109,6 @@ public class MySqlMappingVisitor extends MySqlASTVisitorAdapter implements Mappi public boolean visit(SQLBinaryOpExpr x) { return MappingVisitorUtils.visit(this, x); } - - @Override - public boolean visit(SQLVariantRefExpr x) { - return MappingVisitorUtils.visit(this, x); - } @Override public boolean visit(SQLAllColumnExpr x) { diff --git a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java index f3ee0d3574..39793f6e68 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java @@ -14,7 +14,6 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; @@ -113,11 +112,6 @@ public class OracleMappingVisitor extends OracleASTVisitorAdapter implements Map return MappingVisitorUtils.visit(this, x); } - @Override - public boolean visit(SQLVariantRefExpr x) { - return MappingVisitorUtils.visit(this, x); - } - @Override public boolean visit(SQLAllColumnExpr x) { return MappingVisitorUtils.visit(this, x); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java index 8df34b6112..cf0b8e7481 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java @@ -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; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index e0804ab0b2..15a58a62ee 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -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; } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 29da379b6e..adfb2ab012 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -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"); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitor.java index 7df2ca0c0f..ffdd2bac47 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitor.java @@ -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 getParameters(); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index cce8c1de68..e88303318e 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -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 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); } }