diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java index 0105ae48fc829d..cc2d13413770f7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/NativeInsertStmt.java @@ -1012,7 +1012,7 @@ private void trySetPartialUpdate() throws UserException { for (Column col : olapTable.getFullSchema()) { boolean exists = false; for (Column insertCol : targetColumns) { - if (insertCol.getName() != null && insertCol.getName().equals(col.getName())) { + if (insertCol.getName() != null && insertCol.getName().equalsIgnoreCase(col.getName())) { if (!col.isVisible() && !Column.DELETE_SIGN.equals(col.getName())) { throw new UserException("Partial update should not include invisible column except" + " delete sign column: " + col.getName()); @@ -1027,7 +1027,11 @@ private void trySetPartialUpdate() throws UserException { } isPartialUpdate = true; - partialUpdateCols.addAll(targetColumnNames); + for (String name : targetColumnNames) { + Column column = olapTable.getFullSchema().stream() + .filter(col -> col.getName().equalsIgnoreCase(name)).findFirst().get(); + partialUpdateCols.add(column.getName()); + } if (isPartialUpdate && olapTable.hasSequenceCol() && olapTable.getSequenceMapCol() != null && partialUpdateCols.contains(olapTable.getSequenceMapCol())) { partialUpdateCols.add(Column.SEQUENCE_COL); diff --git a/regression-test/data/unique_with_mow_p0/partial_update/test_partial_update_case_insensitivity.out b/regression-test/data/unique_with_mow_p0/partial_update/test_partial_update_case_insensitivity.out new file mode 100644 index 00000000000000..fd4ae1289281a4 --- /dev/null +++ b/regression-test/data/unique_with_mow_p0/partial_update/test_partial_update_case_insensitivity.out @@ -0,0 +1,77 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !sql -- +t1 1 \N \N + +-- !sql -- +t1 1 2 \N + +-- !sql -- +t1 1 2 \N +t2 \N 20 30 + +-- !sql -- +t1 999 2 888 +t2 \N 20 30 + +-- !sql -- +t1 999 2 888 +t2 \N 20 30 +t3 123 456 789 + +-- !sql -- +t1 1 \N \N + +-- !sql -- +t1 1 2 \N + +-- !sql -- +t1 1 2 \N +t2 \N 20 30 + +-- !sql -- +t1 999 2 888 +t2 \N 20 30 + +-- !sql -- +t1 999 2 888 +t2 \N 20 30 +t3 123 456 789 + +-- !sql -- +t1 1 \N \N + +-- !sql -- +t1 1 2 \N + +-- !sql -- +t1 1 2 \N +t2 \N 20 30 + +-- !sql -- +t1 999 2 888 +t2 \N 20 30 + +-- !sql -- +t1 999 2 888 +t2 \N 20 30 +t3 123 456 789 + +-- !sql -- +t1 1 \N \N + +-- !sql -- +t1 1 2 \N + +-- !sql -- +t1 1 2 \N +t2 \N 20 30 + +-- !sql -- +t1 999 2 888 +t2 \N 20 30 + +-- !sql -- +t1 999 2 888 +t2 \N 20 30 +t3 123 456 789 + diff --git a/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_case_insensitivity.groovy b/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_case_insensitivity.groovy new file mode 100644 index 00000000000000..c1828343f07e58 --- /dev/null +++ b/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_case_insensitivity.groovy @@ -0,0 +1,71 @@ + +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_partial_update_case_insensitivity", "p0") { + String db = context.config.getDbNameByFile(context.file) + sql "select 1;" // to create database + + for (def use_row_store : [false, true]) { + for (def use_nereids_planner : [false, true]) { + logger.info("current params: use_row_store: ${use_row_store}, use_nereids_planner: ${use_nereids_planner}") + connect(user = context.config.jdbcUser, password = context.config.jdbcPassword, url = context.config.jdbcUrl) { + sql "use ${db};" + if (use_nereids_planner) { + sql """ set enable_nereids_dml = true; """ + sql """ set enable_nereids_planner=true; """ + sql """ set enable_fallback_to_original_planner=false; """ + } else { + sql """ set enable_nereids_dml = false; """ + sql """ set enable_nereids_planner = false; """ + } + + def tableName = "test_partial_update_case_insensitivity" + sql """ DROP TABLE IF EXISTS ${tableName} """ + sql """ CREATE TABLE ${tableName} ( + name varchar(300), + status int, + MY_COLUMN int, + UpAndDown int + ) ENGINE=OLAP + UNIQUE KEY(name) COMMENT 'OLAP' + DISTRIBUTED BY HASH(name) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "enable_unique_key_merge_on_write" = "true", + "store_row_column" = "${use_row_store}");""" + + sql "set enable_unique_key_partial_update = true;" + sql "set enable_insert_strict = false;" + sql "sync;" + + sql """ insert into ${tableName}(name, STATUS) values("t1", 1); """ + qt_sql "select * from ${tableName} order by name;" + sql """ insert into ${tableName}(name, my_column) values("t1", 2); """ + qt_sql "select * from ${tableName} order by name;" + sql """ insert into ${tableName}(name, My_Column, uPaNddOWN) values("t2", 20, 30); """ + qt_sql "select * from ${tableName} order by name;" + sql """ insert into ${tableName}(NAME, StAtUs, upanddown) values("t1", 999, 888); """ + qt_sql "select * from ${tableName} order by name;" + sql """ insert into ${tableName}(NaMe, StAtUs, mY_CoLUmN, upAndDoWn) values("t3", 123, 456, 789); """ + qt_sql "select * from ${tableName} order by name;" + + sql """ DROP TABLE IF EXISTS ${tableName} """ + } + } + } +}