This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new 0c3e73e6016 Branch-3.0 [Fix](RowStore) fix partial columns as row 
store (#49542) (#49609)
0c3e73e6016 is described below

commit 0c3e73e6016a1d65047a060c4f9292e6689c1018
Author: lihangyu <lihan...@selectdb.com>
AuthorDate: Sun Mar 30 10:43:02 2025 +0800

    Branch-3.0 [Fix](RowStore) fix partial columns as row store (#49542) 
(#49609)
    
    cherry-pick from #49542
---
 be/src/service/point_query_executor.cpp            |   2 +
 .../apache/doris/alter/SchemaChangeHandler.java    |  17 ++++--
 .../org/apache/doris/catalog/TableProperty.java    |   3 ++
 regression-test/data/point_query_p0/load.out       | Bin 5193 -> 5239 bytes
 regression-test/suites/point_query_p0/load.groovy  |  60 +++++++++++++++++++--
 5 files changed, 75 insertions(+), 7 deletions(-)

diff --git a/be/src/service/point_query_executor.cpp 
b/be/src/service/point_query_executor.cpp
index d3935745882..2079a496f39 100644
--- a/be/src/service/point_query_executor.cpp
+++ b/be/src/service/point_query_executor.cpp
@@ -79,6 +79,8 @@ static void get_missing_and_include_cids(const TabletSchema& 
schema,
     for (auto* slot : slots) {
         missing_cids.insert(slot->col_unique_id());
     }
+    // insert delete sign column id
+    
missing_cids.insert(schema.columns()[schema.delete_sign_idx()]->unique_id());
     if (target_rs_column_id == -1) {
         // no row store columns
         return;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java 
b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
index deb9f0ac938..8ae7112e49b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
@@ -1382,12 +1382,21 @@ public class SchemaChangeHandler extends AlterHandler {
         } catch (AnalysisException e) {
             throw new DdlException(e.getMessage());
         }
-        // check row store column has change
+
         boolean hasRowStoreChanged = false;
-        if (storeRowColumn || (rsColumns != null && !rsColumns.isEmpty())) {
+        if (storeRowColumn || rsColumns != null) {
             List<String> oriRowStoreColumns = 
olapTable.getTableProperty().getCopiedRowStoreColumns();
-            if ((oriRowStoreColumns != null && 
!oriRowStoreColumns.equals(rsColumns))
-                    || storeRowColumn != olapTable.storeRowColumn()) {
+            // correct the comparison logic for null and empty list
+            boolean columnsChanged = false;
+            if (rsColumns == null) {
+                columnsChanged = oriRowStoreColumns != null;
+            } else if (oriRowStoreColumns == null) {
+                columnsChanged = true;
+            } else {
+                columnsChanged = !oriRowStoreColumns.equals(rsColumns);
+            }
+            // partial row store columns changed, or store_row_column enabled, 
not supported to disable at present
+            if (columnsChanged || (!olapTable.storeRowColumn() && 
storeRowColumn)) {
                 // only support mow and duplicate model
                 if (!(olapTable.getKeysType() == KeysType.DUP_KEYS
                         || olapTable.getEnableUniqueKeyMergeOnWrite())) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java
index cdefe46a102..e2e28d9652e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableProperty.java
@@ -688,6 +688,9 @@ public class TableProperty implements Writable, 
GsonPostProcessable {
             
modifyTableProperties(PropertyAnalyzer.PROPERTIES_ROW_STORE_COLUMNS,
                     Joiner.on(",").join(rowStoreColumns));
             buildRowStoreColumns();
+        } else {
+            // clear row store columns
+            this.rowStoreColumns = null;
         }
     }
 
diff --git a/regression-test/data/point_query_p0/load.out 
b/regression-test/data/point_query_p0/load.out
index e2a2ef88733..36880e254f9 100644
Binary files a/regression-test/data/point_query_p0/load.out and 
b/regression-test/data/point_query_p0/load.out differ
diff --git a/regression-test/suites/point_query_p0/load.groovy 
b/regression-test/suites/point_query_p0/load.groovy
index 8e7db326fb8..99b317a0def 100644
--- a/regression-test/suites/point_query_p0/load.groovy
+++ b/regression-test/suites/point_query_p0/load.groovy
@@ -126,23 +126,35 @@ suite("test_load_and_schema_change_row_store", "p0") {
     sql "INSERT INTO tbl_scalar_types_dup_1 SELECT * from tbl_scalar_types_dup"
     sql """alter table tbl_scalar_types_dup_1 set ("bloom_filter_columns" = 
"c_largeint")"""    
     wait_job_done.call("tbl_scalar_types_dup_1")
+
+    sql """alter table tbl_scalar_types_dup_1 set ("row_store_columns" = 
"k1,c_largeint")"""    
+    wait_job_done.call("tbl_scalar_types_dup_1")
+
+    def show_result = sql "SHOW CREATE TABLE tbl_scalar_types_dup_1"
+    assertTrue(show_result[0][1].contains("k1,c_largeint"))
+
     sql """alter table tbl_scalar_types_dup_1 set ("store_row_column" = 
"true")"""    
     wait_job_done.call("tbl_scalar_types_dup_1")
+    show_result = sql "SHOW CREATE TABLE tbl_scalar_types_dup_1"
+    assertTrue(show_result[0][1].contains("store_row_column"))
     qt_sql "select sum(length(__DORIS_ROW_STORE_COL__)) from 
tbl_scalar_types_dup_1"
+
     sql """
          ALTER table tbl_scalar_types_dup_1 ADD COLUMN new_column1 INT default 
"123";
     """
     sql "select /*+ SET_VAR(enable_nereids_planner=true)*/ * from 
tbl_scalar_types_dup_1 where k1 = -2147303679"
     sql """insert into tbl_scalar_types_dup_1(new_column1) values (9999999)"""
     qt_sql """select length(__DORIS_ROW_STORE_COL__) from 
tbl_scalar_types_dup_1 where new_column1 = 9999999"""
-
     explain {
         sql("select /*+ SET_VAR(enable_nereids_planner=true)*/ * from 
tbl_scalar_types_dup_1 where k1 = -2147303679")
         contains "SHORT-CIRCUIT"
     } 
+
     sql """alter table tbl_scalar_types_dup_1 set ("row_store_columns" = 
"k1,c_datetimev2")"""    
     wait_job_done.call("tbl_scalar_types_dup_1")
     qt_sql "select sum(length(__DORIS_ROW_STORE_COL__)) from 
tbl_scalar_types_dup_1"
+    show_result = sql "SHOW CREATE TABLE tbl_scalar_types_dup_1"
+    assertTrue(show_result[0][1].contains("k1,c_datetimev2"))
     sql "set enable_short_circuit_query_access_column_store = false"
     test {
         sql "select /*+ 
SET_VAR(enable_nereids_planner=true,enable_short_circuit_query_access_column_store=false)*/
 * from tbl_scalar_types_dup_1 where k1 = -2147303679"
@@ -152,16 +164,19 @@ suite("test_load_and_schema_change_row_store", "p0") {
         sql("select /*+ SET_VAR(enable_nereids_planner=true)*/ k1, 
c_datetimev2 from tbl_scalar_types_dup_1 where k1 = -2147303679")
         contains "SHORT-CIRCUIT"
     } 
-    qt_sql "select /*+ SET_VAR(enable_nereids_planner=true)*/ k1, c_datetimev2 
from tbl_scalar_types_dup_1 where k1 = -2147303679"
+
+    sql "set enable_short_circuit_query_access_column_store = true"
+    qt_sql "select /*+ 
SET_VAR(enable_nereids_planner=true,enable_short_circuit_query_access_column_store=true)*/
 k1, c_datetimev2 from tbl_scalar_types_dup_1 where k1 = -2147303679"
 
     sql """alter table tbl_scalar_types_dup_1 set ("row_store_columns" = 
"k1,c_decimalv3")"""    
     wait_job_done.call("tbl_scalar_types_dup_1")
+    sql "set enable_short_circuit_query_access_column_store = false"
     test {
         sql "select /*+ 
SET_VAR(enable_nereids_planner=true,enable_short_circuit_query_access_column_store=false)*/
 k1,c_datetimev2 from tbl_scalar_types_dup_1 where k1 = -2147303679"
         exception("Not support column store")
     }
-    qt_sql "select /*+ 
SET_VAR(enable_nereids_planner=true,enable_short_circuit_query_access_column_store=false)*/
 k1, c_decimalv3 from tbl_scalar_types_dup_1 where k1 = -2147303679"
     sql "set enable_short_circuit_query_access_column_store = true"
+    qt_sql "select /*+ SET_VAR(enable_nereids_planner=true)*/ k1, c_decimalv3 
from tbl_scalar_types_dup_1 where k1 = -2147303679"
 
 
     sql "DROP TABLE IF EXISTS tbl_scalar_types_uk_not_mow"
@@ -195,4 +210,43 @@ suite("test_load_and_schema_change_row_store", "p0") {
         sql """alter table tbl_scalar_types_agg set ("store_row_column" = 
"true")"""    
         exception("`store_row_column` only support duplicate model or mow 
model")
     }
+
+    sql "DROP TABLE IF EXISTS test_sclar_types_mow"
+    sql """
+        CREATE TABLE IF NOT EXISTS test_sclar_types_mow (
+            `k1` bigint(11) NULL,
+            `c_string` text NULL
+        ) ENGINE=OLAP
+        UNIQUE KEY(`k1`)
+        COMMENT 'OLAP'
+        DISTRIBUTED BY HASH(`k1`) BUCKETS 1
+        PROPERTIES("replication_num" = "1", "enable_unique_key_merge_on_write" 
= "true");
+        """
+    sql "insert into test_sclar_types_mow(k1,c_string) values (1,'123'), 
(2,'456')"
+    sql """alter table test_sclar_types_mow set ("store_row_column" = 
"true")"""     
+    wait_job_done.call("test_sclar_types_mow")
+    show_result = sql "SHOW CREATE TABLE test_sclar_types_mow"
+    assertTrue(show_result[0][1].contains("store_row_column"))
+    qt_sql "select * from test_sclar_types_mow where k1 = 1"
+
+    sql """alter table test_sclar_types_mow set ("row_store_columns" = 
"c_string")"""     
+    wait_job_done.call("test_sclar_types_mow")
+    show_result = sql "SHOW CREATE TABLE test_sclar_types_mow"
+    assertTrue(show_result[0][1].contains("c_string"))
+    qt_sql "select c_string from test_sclar_types_mow where k1 = 1"
+    // alter again
+    test {
+        sql """alter table test_sclar_types_mow set ("row_store_columns" = 
"c_string")"""     
+        exception("Nothing is changed")
+    }
+
+    sql """alter table test_sclar_types_mow set ("store_row_column" = 
"true")"""     
+    wait_job_done.call("test_sclar_types_mow")
+    sql "select * from test_sclar_types_mow where k1 = 1"
+
+    // test delete with partial row store columns
+    sql """alter table test_sclar_types_mow set ("row_store_columns" = 
"k1,c_string")"""     
+    wait_job_done.call("test_sclar_types_mow")
+    sql "delete from test_sclar_types_mow where k1 = 1"
+    qt_sql "select * from test_sclar_types_mow where k1 = 1"
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to