mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
支持Pivot
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@167 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
@@ -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)) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user