支持Pivot

git-svn-id: http://code.alibabatech.com/svn/druid/trunk@167 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
wenshao
2011-05-21 02:34:28 +00:00
parent d1d7eba43a
commit f8cf79edfa
5 changed files with 31 additions and 57 deletions
@@ -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");
}
+8 -8
View File
@@ -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;