diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLLiteralExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLLiteralExpr.java index c5b6a20d58..5c38ffc680 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLLiteralExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLLiteralExpr.java @@ -18,6 +18,5 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; public interface SQLLiteralExpr extends SQLExpr { - - + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java index 093c20aa28..b7d9257f53 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsExprParser.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.sql.dialect.odps.parser; +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -41,4 +43,8 @@ public class OdpsExprParser extends SQLExprParser { this(new OdpsLexer(sql)); this.lexer.nextToken(); } + + protected SQLExpr parseAliasExpr(String alias) { + return new SQLCharExpr(alias); + } } 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 a0b7ad3376..580841ec39 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -560,7 +560,7 @@ public class SQLExprParser extends SQLParser { sqlExpr = allExpr; break; case LITERAL_ALIAS: - sqlExpr = new SQLIdentifierExpr('"' + lexer.stringVal() + '"'); + sqlExpr = parseAliasExpr(lexer.stringVal()); lexer.nextToken(); break; case EOF: @@ -579,6 +579,10 @@ public class SQLExprParser extends SQLParser { return primaryRest(sqlExpr); } + + protected SQLExpr parseAliasExpr(String alias) { + return new SQLIdentifierExpr('"' + alias + '"'); + } protected SQLExpr parseInterval() { throw new ParserException("TODO"); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsDoubleQuoteTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsDoubleQuoteTest.java new file mode 100644 index 0000000000..d4ca36ef90 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsDoubleQuoteTest.java @@ -0,0 +1,42 @@ +package com.alibaba.druid.bvt.sql.odps; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.odps.parser.OdpsStatementParser; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + + +public class OdpsDoubleQuoteTest extends TestCase { + public void test_0() throws Exception { + String sql = "SELECT my_udtf(1,2,3) as (a, b, c) from employee t1 WHERE t1.name = \"aaa\";"; + + OdpsStatementParser parser = new OdpsStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + OdpsSchemaStatVisitor visitor = new OdpsSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employee"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("employee", "name"))); + } +}