diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java index a8b2da68b5..2b2b3a988b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java @@ -39,41 +39,6 @@ public class MySqlSelectParser extends SQLSelectParser { this.lexer.nextToken(); } - @Override - protected final String as() throws ParserException { - String alias = null; - - if (lexer.token() == Token.AS) { - lexer.nextToken(); - - if (lexer.token() == Token.LITERAL_ALIAS) { - alias = '"' + lexer.stringVal() + '"'; - lexer.nextToken(); - return alias; - } - - if (lexer.token() == Token.IDENTIFIER) { - alias = lexer.stringVal(); - lexer.nextToken(); - return alias; - } - - throw new ParserException("Error", 0, 0); - } - - if (lexer.token() == Token.LITERAL_ALIAS) { - alias = '"' + lexer.stringVal() + '"'; - lexer.nextToken(); - } else if (lexer.token() == Token.IDENTIFIER) { - alias = lexer.stringVal(); - lexer.nextToken(); - } else if (lexer.token() == Token.LITERAL_CHARS) { - alias = "'" + lexer.stringVal() + "'"; - lexer.nextToken(); - } - return alias; - } - @Override protected SQLSelectQuery query() throws ParserException { if (lexer.token() == (Token.LPAREN)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 9bc09341a4..e1fadc13d9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -675,7 +675,7 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() != Token.COMMA) { break; } - + lexer.nextToken(); } @@ -708,7 +708,7 @@ public class OracleSelectParser extends SQLSelectParser { unPivot.getItems().add(this.createExprParser().expr()); } - acceptIdentifier("FOR"); + accept(Token.FOR); if (lexer.token() == (Token.LPAREN)) { lexer.nextToken(); @@ -726,17 +726,26 @@ public class OracleSelectParser extends SQLSelectParser { lexer.nextToken(); } - acceptIdentifier("IN"); + accept(Token.IN); accept(Token.LPAREN); - if (lexer.token() == (Token.LPAREN)) throw new ParserException("TODO"); - if (lexer.token() == (Token.SELECT)) throw new ParserException("TODO"); - while (true) { + if (lexer.token() == (Token.LPAREN)) { + throw new ParserException("TODO"); + } + + if (lexer.token() == (Token.SELECT)) { + throw new ParserException("TODO"); + } + + for (;;) { item = new OracleSelectPivot.Item(); item.setExpr(this.createExprParser().expr()); item.setAlias(as()); unPivot.getPivotIn().add(item); - if (!(lexer.token() == (Token.COMMA))) break; + if (lexer.token() != Token.COMMA) { + break; + } + lexer.nextToken(); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java index 586d1fbf38..ee71020414 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java @@ -41,7 +41,7 @@ public class SQLParser { } } - protected String as() throws ParserException { + protected final String as() throws ParserException { String alias = null; if (lexer.token() == Token.AS) { @@ -59,9 +59,9 @@ public class SQLParser { return alias; } - if (lexer.token() == Token.KEY) { + if (lexer.token() == Token.LITERAL_CHARS) { + alias = "'" + lexer.stringVal() + "'"; lexer.nextToken(); - alias = "KEY"; return alias; } @@ -74,10 +74,9 @@ public class SQLParser { } else if (lexer.token() == Token.IDENTIFIER) { alias = lexer.stringVal(); lexer.nextToken(); - } else if (lexer.token() == Token.KEY) { + } else if (lexer.token() == Token.LITERAL_CHARS) { + alias = "'" + lexer.stringVal() + "'"; lexer.nextToken(); - alias = "KEY"; - return alias; } return alias; } diff --git a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java index 08a5e3ae6a..77c791817c 100644 --- a/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java +++ b/src/test/java/com/alibaba/druid/sql/oracle/bvt/OracleSQLParserResourceTest.java @@ -47,7 +47,8 @@ public class OracleSQLParserResourceTest extends TestCase { // exec_test("bvt/parser/oracle-28.txt"); // exec_test("bvt/parser/oracle-29.txt"); // exec_test("bvt/parser/oracle-30.txt"); - exec_test("bvt/parser/oracle-31.txt"); +// exec_test("bvt/parser/oracle-31.txt"); + exec_test("bvt/parser/oracle-32.txt"); } diff --git a/src/test/resources/bvt/parser/oracle-32.txt b/src/test/resources/bvt/parser/oracle-32.txt index 711464c6f9..a08b70c0ca 100644 --- a/src/test/resources/bvt/parser/oracle-32.txt +++ b/src/test/resources/bvt/parser/oracle-32.txt @@ -1,12 +1,12 @@ -SELECT * FROM -(SELECT EXTRACT(YEAR FROM order_date) year, order_mode, order_total FROM orders) -PIVOT -(SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet)); +SELECT * FROM pivot_table + UNPIVOT (yearly_total FOR order_mode IN (store AS 'direct', + internet AS 'online')) + ORDER BY year, order_mode; --------------------------- -SELECT * FROM -(SELECT EXTRACT(YEAR FROM order_date) year, order_mode, order_total FROM orders) -PIVOT -(SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet)); +SELECT * +FROM pivot_table + UNPIVOT (yearly_total FOR order_mode IN (store AS 'direct', internet AS 'online')) +ORDER BY year, order_mode;