diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/PivotClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/PivotClause.java new file mode 100644 index 0000000000..190c3db0f6 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/PivotClause.java @@ -0,0 +1,59 @@ +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 entries = new ArrayList(); + private final List pivotFor = new ArrayList(); + private final List pivotIn = new ArrayList(); + + public List getEntries() { + return entries; + } + + public List getPivotFor() { + return pivotFor; + } + + public List 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; + } + +} 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 8164d06255..d49cfcfd31 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,6 +47,7 @@ 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"); } diff --git a/src/test/resources/bvt/parser/oracle-31.txt b/src/test/resources/bvt/parser/oracle-31.txt index bf36866271..711464c6f9 100644 --- a/src/test/resources/bvt/parser/oracle-31.txt +++ b/src/test/resources/bvt/parser/oracle-31.txt @@ -1,25 +1,12 @@ -WITH - org_chart (eid, emp_last, mgr_id, reportLevel, salary, job_id) AS - ( - SELECT employee_id, last_name, manager_id, 0 reportLevel, salary, job_id - FROM employees - WHERE manager_id is null - UNION ALL - SELECT e.employee_id, e.last_name, e.manager_id, - r.reportLevel+1 reportLevel, e.salary, e.job_id - FROM org_chart r, employees e - WHERE r.eid = e.manager_id - ) - SEARCH DEPTH FIRST BY emp_last SET order1 -SELECT lpad(' ',2*reportLevel)||emp_last emp_name, eid, mgr_id, salary, job_id -FROM org_chart -ORDER BY order1; - +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 bk.attr_id AS attrId, group_concat(DISTINCT(bk.value_id)) AS attrValueStr, group_concat(DISTINCT(pt.name)) AS themeNameStr -FROM price_theme pt LEFT JOIN tl_spu_attr_value_rel_bk bk ON pt.spu_id = bk.spu_id -WHERE pt.status = 'action' AND pt.category_id = ? -GROUP BY bk.attr_id; +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)); diff --git a/src/test/resources/bvt/parser/oracle-32.txt b/src/test/resources/bvt/parser/oracle-32.txt new file mode 100644 index 0000000000..711464c6f9 --- /dev/null +++ b/src/test/resources/bvt/parser/oracle-32.txt @@ -0,0 +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 +(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)); +