diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java index f51bddceb8..67c19df139 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java @@ -16,7 +16,6 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectSubqueryTableSource; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.ArrayList; @@ -74,12 +73,6 @@ public class SQLSubqueryTableSource extends SQLTableSourceImpl { public void cloneTo(SQLSubqueryTableSource x) { x.alias = alias; - if (this instanceof OracleSelectSubqueryTableSource) { - if (((OracleSelectSubqueryTableSource)this).getPivot() != null) { - ((OracleSelectSubqueryTableSource)x).setPivot(((OracleSelectSubqueryTableSource)this).getPivot()); - } - } - if (select != null) { x.select = select.clone(); x.select.setParent(x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectSubqueryTableSource.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectSubqueryTableSource.java index a6a0b802f0..ef157a78d8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectSubqueryTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectSubqueryTableSource.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; @@ -76,4 +77,23 @@ public class OracleSelectSubqueryTableSource extends SQLSubqueryTableSource impl return x; } + + public void cloneTo(OracleSelectSubqueryTableSource x) { + x.alias = alias; + + if (this.getPivot() != null) { + x.setPivot(this.getPivot()); + } + + if (select != null) { + x.select = select.clone(); + x.select.setParent(x); + } + + for (SQLName column : columns) { + SQLName c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + } } diff --git a/src/test/java/com/alibaba/druid/sql/parser/OraclePivotCloneTest.java b/src/test/java/com/alibaba/druid/sql/parser/OraclePivotCloneTest.java index 148ae59592..fded6a2132 100644 --- a/src/test/java/com/alibaba/druid/sql/parser/OraclePivotCloneTest.java +++ b/src/test/java/com/alibaba/druid/sql/parser/OraclePivotCloneTest.java @@ -4,6 +4,7 @@ import com.alibaba.druid.DbType; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import junit.framework.TestCase; +import org.junit.Assert; /** * @author gfChris @@ -15,40 +16,25 @@ public class OraclePivotCloneTest extends TestCase { public void testCreateCharset() { - String sql = "Select \n" + - "DEPT_ID,\n" + - "M01,M02,M03,M04,M05,M06,M07,M08,M09,M10,M11,M12\n" + - "from \n" + - "(\n" + - "Select \n" + - "DEPT_ID,CMONTH,\n" + - "SUM(SO_TAXMONEY) AS SO_TAXMONEY\n" + - "FROM DW_SCM_DIM_SALEDATA\n" + - "GROUP BY \n" + - "DEPT_ID,CMONTH\n" + - ") \n" + - "pivot(\n" + - " sum(SO_TAXMONEY) for CMONTH in ( \n" + - " '01' as M01, \n" + - " '02' as M02, \n" + - " '03' as M03,\n" + - " '04' as M04,\n" + - " '05' as M05,\n" + - " '06' as M06,\n" + - " '07' as M07,\n" + - " '08' as M08,\n" + - " '09' as M09,\n" + - " '10' as M10,\n" + - " '11' as M11,\n" + - " '12' as M12\n" + - " )\n" + - " );"; + String sql = "SELECT DEPT_ID, M01, M02, M03, M04\n" + + "\t, M05, M06, M07, M08, M09\n" + + "\t, M10, M11, M12\n" + + "FROM (\n" + + "\tSELECT DEPT_ID, CMONTH, SUM(SO_TAXMONEY) AS SO_TAXMONEY\n" + + "\tFROM DW_SCM_DIM_SALEDATA\n" + + "\tGROUP BY DEPT_ID, CMONTH\n" + + ")\n" + + "PIVOT (sum(SO_TAXMONEY) FOR CMONTH IN ('01' AS M01, '02' AS M02, '03' AS M03, '04' AS M04, '05' AS M05, '06' AS M06, '07' AS M07, '08' AS M08, '09' AS M09, '10' AS M10, '11' AS M11, '12' AS M12));"; SQLStatement sqlStatement = SQLUtils.parseSingleStatement(sql, DbType.oracle); SQLStatement sqlStatement1 = sqlStatement.clone(); System.out.println(sqlStatement1.toString()); + + + Assert.assertTrue(sqlStatement1.toString().equals(sql)); + } }