From 45ea92be2859ad6723fac0acebb0ec836405c31c Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 10:25:55 +0000 Subject: [PATCH] [BugFix] fix partial update failure due to column name case (backport #53656) (#54462) Co-authored-by: Yixin Luo <18810541851@163.com> --- .../com/starrocks/sql/ast/UpdateStmt.java | 2 +- .../starrocks/sql/plan/UpdatePlanTest.java | 12 +++++ .../R/test_upper_case_partial_update | 49 +++++++++++++++++++ .../T/test_upper_case_partial_update | 27 ++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 test/sql/test_partial_update_column_mode/R/test_upper_case_partial_update create mode 100644 test/sql/test_partial_update_column_mode/T/test_upper_case_partial_update diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/ast/UpdateStmt.java b/fe/fe-core/src/main/java/com/starrocks/sql/ast/UpdateStmt.java index 2ac35a79a8c28..e25e211a2727f 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/ast/UpdateStmt.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/ast/UpdateStmt.java @@ -49,7 +49,7 @@ public UpdateStmt(TableName tableName, List assignments, List< this.fromRelations = fromRelations; this.wherePredicate = wherePredicate; this.commonTableExpressions = commonTableExpressions; - this.assignmentColumns = Sets.newHashSet(); + this.assignmentColumns = Sets.newTreeSet(String.CASE_INSENSITIVE_ORDER); for (ColumnAssignment each : assignments) { this.assignmentColumns.add(each.getColumn()); } diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/plan/UpdatePlanTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/plan/UpdatePlanTest.java index 23e04efbc869d..f7e85167eb83c 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/plan/UpdatePlanTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/plan/UpdatePlanTest.java @@ -49,6 +49,18 @@ public void testUpdate() throws Exception { testExplain("explain costs update tprimary set v2 = v2 + 1 where v1 = 'aaa'"); } + @Test + public void testColumnPartialUpdate() throws Exception { + String oldVal = connectContext.getSessionVariable().getPartialUpdateMode(); + connectContext.getSessionVariable().setPartialUpdateMode("column"); + testExplain("explain update tprimary set v2 = v2 + 1 where v1 = 'aaa'"); + testExplain("explain update tprimary set v2 = DEFAULT where v1 = 'aaa'"); + testExplain("explain update tprimary_auto_increment set v2 = DEFAULT where v1 = '123'"); + testExplain("explain verbose update tprimary set v2 = v2 + 1 where v1 = 'aaa'"); + testExplain("explain costs update tprimary set v2 = v2 + 1 where v1 = 'aaa'"); + connectContext.getSessionVariable().setPartialUpdateMode(oldVal); + } + private void testExplain(String explainStmt) throws Exception { connectContext.getState().reset(); List statements = diff --git a/test/sql/test_partial_update_column_mode/R/test_upper_case_partial_update b/test/sql/test_partial_update_column_mode/R/test_upper_case_partial_update new file mode 100644 index 0000000000000..f443625ae2b1a --- /dev/null +++ b/test/sql/test_partial_update_column_mode/R/test_upper_case_partial_update @@ -0,0 +1,49 @@ +-- name: test_upper_case_partial_update +show backends; +CREATE table tab1 ( + k1 INTEGER, + k2 VARCHAR(50), + V1 INTEGER, + v2 INTEGER, + v3 INTEGER, + v4 varchar(50), + v5 varchar(50) +) +ENGINE=OLAP +PRIMARY KEY(`k1`,`k2`) +DISTRIBUTED BY HASH(`k1`) BUCKETS 10 +PROPERTIES ( + "replication_num" = "1" +); +-- result: +-- !result +insert into tab1 values (100, "k2_100", 100, 100, 100, "v4_100", "v5_100"); +-- result: +-- !result +insert into tab1 values (200, "k2_200", 200, 200, 200, "v4_200", "v5_200"); +-- result: +-- !result +insert into tab1 values (300, "k3_300", 300, 300, 300, "v4_300", "v5_300"); +-- result: +-- !result +select * from tab1; +-- result: +300 k3_300 300 300 300 v4_300 v5_300 +100 k2_100 100 100 100 v4_100 v5_100 +200 k2_200 200 200 200 v4_200 v5_200 +-- !result +set partial_update_mode = 'column'; +-- result: +-- !result +update tab1 set V1 = 101 where k1 = 100 and k2 = "k2_100"; +-- result: +-- !result +update tab1 set v1 = 202 where k1 = 200 and k2 = "k2_200"; +-- result: +-- !result +select * from tab1; +-- result: +300 k3_300 300 300 300 v4_300 v5_300 +100 k2_100 101 100 100 v4_100 v5_100 +200 k2_200 202 200 200 v4_200 v5_200 +-- !result \ No newline at end of file diff --git a/test/sql/test_partial_update_column_mode/T/test_upper_case_partial_update b/test/sql/test_partial_update_column_mode/T/test_upper_case_partial_update new file mode 100644 index 0000000000000..bfe009cd3f3b7 --- /dev/null +++ b/test/sql/test_partial_update_column_mode/T/test_upper_case_partial_update @@ -0,0 +1,27 @@ +-- name: test_upper_case_partial_update +show backends; +CREATE table tab1 ( + k1 INTEGER, + k2 VARCHAR(50), + V1 INTEGER, + v2 INTEGER, + v3 INTEGER, + v4 varchar(50), + v5 varchar(50) +) +ENGINE=OLAP +PRIMARY KEY(`k1`,`k2`) +DISTRIBUTED BY HASH(`k1`) BUCKETS 10 +PROPERTIES ( + "replication_num" = "1" +); + +insert into tab1 values (100, "k2_100", 100, 100, 100, "v4_100", "v5_100"); +insert into tab1 values (200, "k2_200", 200, 200, 200, "v4_200", "v5_200"); +insert into tab1 values (300, "k3_300", 300, 300, 300, "v4_300", "v5_300"); +select * from tab1; + +set partial_update_mode = 'column'; +update tab1 set V1 = 101 where k1 = 100 and k2 = "k2_100"; +update tab1 set v1 = 202 where k1 = 200 and k2 = "k2_200"; +select * from tab1; \ No newline at end of file