From 933b3ba16fe1b9b8e7d3cf1020191fcf485c5f7a Mon Sep 17 00:00:00 2001 From: zhenggli Date: Tue, 21 Jan 2025 16:13:58 -0600 Subject: [PATCH] Fix insert ValuesClause clone() issue --- .../sql/ast/statement/SQLInsertStatement.java | 7 ++- .../bvt/sql/ast/SQLInsertStatementTest.java | 43 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/com/alibaba/druid/bvt/sql/ast/SQLInsertStatementTest.java diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java index afcddf9438..c3f22a37a0 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java @@ -93,7 +93,12 @@ public ValuesClause() { public ValuesClause clone() { ValuesClause x = new ValuesClause(new ArrayList(this.values.size())); for (Object v : values) { - x.addValue(v); + if (v instanceof SQLObject) { + SQLObject clone = ((SQLExpr) v).clone(); + x.addValue(clone); + } else { + x.addValue(v); + } } return x; } diff --git a/core/src/test/java/com/alibaba/druid/bvt/sql/ast/SQLInsertStatementTest.java b/core/src/test/java/com/alibaba/druid/bvt/sql/ast/SQLInsertStatementTest.java new file mode 100644 index 0000000000..c23c12131b --- /dev/null +++ b/core/src/test/java/com/alibaba/druid/bvt/sql/ast/SQLInsertStatementTest.java @@ -0,0 +1,43 @@ +package com.alibaba.druid.bvt.sql.ast; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; + +import static org.junit.Assert.assertEquals; + +public class SQLInsertStatementTest { + @Test + public void test_0() throws Exception { + SQLInsertStatement stmt = new SQLInsertStatement(); + stmt.setTableSource(new SQLExprTableSource("my_table")); + + // Add columns + stmt.addColumn(new SQLIdentifierExpr("id")); + stmt.addColumn(new SQLIdentifierExpr("name")); + + // Add values + List values = new ArrayList<>(); + SQLExpr value1 = new SQLIdentifierExpr("1"); + SQLExpr value2 = new SQLIdentifierExpr("'abc'"); + values.add(value1); + values.add(value2); + SQLInsertStatement.ValuesClause valuesClause = new SQLInsertStatement.ValuesClause(values); + stmt.addValueCause(valuesClause); + assertEquals(value1.getParent(), valuesClause); + assertEquals(value2.getParent(), valuesClause); + + // clone + SQLInsertStatement clone = stmt.clone(); + assertEquals(value1.getParent(), valuesClause); + assertEquals(value2.getParent(), valuesClause); + + assertEquals(stmt.toString(), clone.toString()); + } +}