fix:SQLStatement clone方法 oracle使用行列转置piovt 丢失问题

This commit is contained in:
郭福
2022-08-12 07:39:00 +08:00
parent db2c52cd65
commit 9c77eacd4a
3 changed files with 34 additions and 35 deletions
@@ -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);
@@ -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);
}
}
}
@@ -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));
}
}