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@166 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
@@ -1,59 +0,0 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.clause;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
|
||||
|
||||
public class PivotClause {
|
||||
|
||||
private boolean xml;
|
||||
private final List<Entry> entries = new ArrayList<Entry>();
|
||||
private final List<SQLName> pivotFor = new ArrayList<SQLName>();
|
||||
private final List<SQLName> pivotIn = new ArrayList<SQLName>();
|
||||
|
||||
public List<Entry> getEntries() {
|
||||
return entries;
|
||||
}
|
||||
|
||||
public List<SQLName> getPivotFor() {
|
||||
return pivotFor;
|
||||
}
|
||||
|
||||
public List<SQLName> getPivotIn() {
|
||||
return pivotIn;
|
||||
}
|
||||
|
||||
public static class Entry {
|
||||
|
||||
private OracleAggregateExpr aggregateExpr;
|
||||
private String alias;
|
||||
|
||||
public OracleAggregateExpr getAggregateExpr() {
|
||||
return aggregateExpr;
|
||||
}
|
||||
|
||||
public void setAggregateExpr(OracleAggregateExpr aggregateExpr) {
|
||||
this.aggregateExpr = aggregateExpr;
|
||||
}
|
||||
|
||||
public String getAlias() {
|
||||
return alias;
|
||||
}
|
||||
|
||||
public void setAlias(String alias) {
|
||||
this.alias = alias;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean isXml() {
|
||||
return xml;
|
||||
}
|
||||
|
||||
public void setXml(boolean xml) {
|
||||
this.xml = xml;
|
||||
}
|
||||
|
||||
}
|
||||
+1
@@ -1684,5 +1684,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(CycleClause x) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateTimeUnit;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalType;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OraclePriorExpr;
|
||||
@@ -97,6 +99,22 @@ public class OracleExprParser extends SQLExprParser {
|
||||
String alias = '"' + lexer.stringVal() + '"';
|
||||
lexer.nextToken();
|
||||
return primaryRest(new SQLIdentifierExpr(alias));
|
||||
case EXTRACT:
|
||||
lexer.nextToken();
|
||||
OracleExtractExpr extract = new OracleExtractExpr();
|
||||
|
||||
accept(Token.LPAREN);
|
||||
|
||||
extract.setUnit(OracleDateTimeUnit.valueOf(lexer.stringVal()));
|
||||
lexer.nextToken();
|
||||
|
||||
accept(Token.FROM);
|
||||
|
||||
extract.setFrom(expr());
|
||||
|
||||
accept(Token.RPAREN);
|
||||
|
||||
return primaryRest(extract);
|
||||
default:
|
||||
return super.primary();
|
||||
}
|
||||
|
||||
@@ -86,6 +86,7 @@ public class OracleLexer extends Lexer {
|
||||
map.put("CONNECT", Token.CONNECT);
|
||||
map.put("PRIOR", Token.PRIOR);
|
||||
map.put("WITH", Token.WITH);
|
||||
map.put("EXTRACT", Token.EXTRACT);
|
||||
|
||||
DEFAULT_ORACLE_KEYWORDS = new Keywords(map);
|
||||
}
|
||||
|
||||
@@ -638,7 +638,7 @@ public class OracleSelectParser extends SQLSelectParser {
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
acceptIdentifier("FOR");
|
||||
accept(Token.FOR);
|
||||
|
||||
if (lexer.token() == (Token.LPAREN)) {
|
||||
lexer.nextToken();
|
||||
@@ -656,17 +656,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());
|
||||
pivot.getPivotIn().add(item);
|
||||
|
||||
if (!(lexer.token() == (Token.COMMA))) break;
|
||||
if (lexer.token() != Token.COMMA) {
|
||||
break;
|
||||
}
|
||||
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ public enum Token {
|
||||
PRIOR("PRIOR"),
|
||||
CONNECT("CONNECT"),
|
||||
WITH("WITH"),
|
||||
EXTRACT("EXTRACT"),
|
||||
|
||||
EOF,
|
||||
ERROR,
|
||||
|
||||
@@ -16,37 +16,37 @@ import com.alibaba.druid.util.JdbcUtils;
|
||||
public class OracleSQLParserResourceTest extends TestCase {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
exec_test("bvt/parser/oracle-0.txt");
|
||||
exec_test("bvt/parser/oracle-1.txt");
|
||||
exec_test("bvt/parser/oracle-2.txt");
|
||||
exec_test("bvt/parser/oracle-3.txt");
|
||||
exec_test("bvt/parser/oracle-4.txt");
|
||||
exec_test("bvt/parser/oracle-5.txt");
|
||||
exec_test("bvt/parser/oracle-6.txt"); // PARTITION
|
||||
exec_test("bvt/parser/oracle-7.txt");
|
||||
exec_test("bvt/parser/oracle-8.txt");
|
||||
exec_test("bvt/parser/oracle-9.txt");
|
||||
exec_test("bvt/parser/oracle-10.txt");
|
||||
exec_test("bvt/parser/oracle-11.txt");
|
||||
exec_test("bvt/parser/oracle-12.txt");
|
||||
exec_test("bvt/parser/oracle-13.txt");
|
||||
exec_test("bvt/parser/oracle-14.txt");
|
||||
exec_test("bvt/parser/oracle-15.txt");
|
||||
exec_test("bvt/parser/oracle-16.txt");
|
||||
exec_test("bvt/parser/oracle-17.txt");
|
||||
exec_test("bvt/parser/oracle-18.txt");
|
||||
exec_test("bvt/parser/oracle-19.txt");
|
||||
exec_test("bvt/parser/oracle-20.txt");
|
||||
exec_test("bvt/parser/oracle-21.txt");
|
||||
exec_test("bvt/parser/oracle-22.txt");
|
||||
exec_test("bvt/parser/oracle-23.txt");
|
||||
exec_test("bvt/parser/oracle-24.txt");
|
||||
exec_test("bvt/parser/oracle-25.txt");
|
||||
exec_test("bvt/parser/oracle-26.txt");
|
||||
exec_test("bvt/parser/oracle-27.txt");
|
||||
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-0.txt");
|
||||
// exec_test("bvt/parser/oracle-1.txt");
|
||||
// exec_test("bvt/parser/oracle-2.txt");
|
||||
// exec_test("bvt/parser/oracle-3.txt");
|
||||
// exec_test("bvt/parser/oracle-4.txt");
|
||||
// exec_test("bvt/parser/oracle-5.txt");
|
||||
// exec_test("bvt/parser/oracle-6.txt"); // PARTITION
|
||||
// exec_test("bvt/parser/oracle-7.txt");
|
||||
// exec_test("bvt/parser/oracle-8.txt");
|
||||
// exec_test("bvt/parser/oracle-9.txt");
|
||||
// exec_test("bvt/parser/oracle-10.txt");
|
||||
// exec_test("bvt/parser/oracle-11.txt");
|
||||
// exec_test("bvt/parser/oracle-12.txt");
|
||||
// exec_test("bvt/parser/oracle-13.txt");
|
||||
// exec_test("bvt/parser/oracle-14.txt");
|
||||
// exec_test("bvt/parser/oracle-15.txt");
|
||||
// exec_test("bvt/parser/oracle-16.txt");
|
||||
// exec_test("bvt/parser/oracle-17.txt");
|
||||
// exec_test("bvt/parser/oracle-18.txt");
|
||||
// exec_test("bvt/parser/oracle-19.txt");
|
||||
// exec_test("bvt/parser/oracle-20.txt");
|
||||
// exec_test("bvt/parser/oracle-21.txt");
|
||||
// exec_test("bvt/parser/oracle-22.txt");
|
||||
// exec_test("bvt/parser/oracle-23.txt");
|
||||
// exec_test("bvt/parser/oracle-24.txt");
|
||||
// exec_test("bvt/parser/oracle-25.txt");
|
||||
// exec_test("bvt/parser/oracle-26.txt");
|
||||
// exec_test("bvt/parser/oracle-27.txt");
|
||||
// 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");
|
||||
}
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ PIVOT
|
||||
|
||||
|
||||
---------------------------
|
||||
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 (SELECT EXTRACT(YEAR FROM order_date) AS year, order_mode, order_total
|
||||
FROM orders)
|
||||
PIVOT (SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user