From 25073edf072fcdebc657044ded1103d14b8a98c8 Mon Sep 17 00:00:00 2001 From: XIAO-HOU <372060054@qq.com> Date: Mon, 24 Jun 2024 12:45:21 +0000 Subject: [PATCH] Fix padding access invalid memory in default cg. --- .../column_store/ob_virtual_cg_scanner.cpp | 2 + .../column_store/r/mysql/add_column.result | 12 +++++- .../test_suite/column_store/t/add_column.test | 42 +++++++++++++++++-- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/storage/column_store/ob_virtual_cg_scanner.cpp b/src/storage/column_store/ob_virtual_cg_scanner.cpp index af73d6477..b00c9b751 100644 --- a/src/storage/column_store/ob_virtual_cg_scanner.cpp +++ b/src/storage/column_store/ob_virtual_cg_scanner.cpp @@ -314,6 +314,8 @@ int ObDefaultCGScanner::init_datum_infos_and_default_row(const ObTableIterParam STORAGE_LOG(WARN, "unexpected null column_param", K(ret), K(iter_param)); } else if (OB_FAIL(default_row_.storage_datums_[0].from_obj_enhance(column_param->get_orig_default_value()))) { STORAGE_LOG(WARN, "Failed to transefer obj to datum", K(ret)); + } else if (OB_FAIL(pad_column(column_param->get_meta_type(), column_param->get_accuracy(), *access_ctx.stmt_allocator_, default_row_.storage_datums_[0]))) { + LOG_WARN("Failed to pad default column", K(ret), KPC(column_param), K_(default_row)); } else if (OB_FAIL(add_lob_header_if_need(*column_param, default_row_.local_allocator_, default_row_.storage_datums_[0]))) { STORAGE_LOG(WARN, "Failed to add lob header to default value", K(ret)); } else if (iter_param.vectorized_enabled_ && !iter_param.enable_pd_aggregate()) { diff --git a/tools/deploy/mysql_test/test_suite/column_store/r/mysql/add_column.result b/tools/deploy/mysql_test/test_suite/column_store/r/mysql/add_column.result index 055bc96a4..19223c805 100644 --- a/tools/deploy/mysql_test/test_suite/column_store/r/mysql/add_column.result +++ b/tools/deploy/mysql_test/test_suite/column_store/r/mysql/add_column.result @@ -1,5 +1,6 @@ create table t1(a int, b varchar(3048), primary key (a), c int) with column group (all columns, each column); create table t2(pk int, c1 int, c2 int unsigned, c3 varchar(100)) block_size=2048 with column group (all columns, each column); +create table t3(c1 int) with column group (each column); select count(*) from t1; count(*) 150 @@ -11,6 +12,7 @@ count(*) count(pk) min(pk) max(pk) sum(pk) min(c1) max(c1) sum(c1) min(c2) max(c 1500 1500 11 3000 2258250 11 3000 2258250 12 3001 2259750 abcdefg1 abcdefg99 alter system major freeze; alter table t1 add column c1 int default 0, add column c2 varchar(100); +alter table t3 add column c2 char(60) default "中文"; alter system set _pushdown_storage_level = 0; alter system set _rowsets_enabled = false; alter system flush plan cache; @@ -179,6 +181,14 @@ count(*) count(a) min(a) max(a) sum(a) count(b) min(b) max(b) count(c) min(c) ma select count(*),count(c1),min(c1),max(c1),sum(c1),count(c2),min(c2),max(c2) from t1; count(*) count(c1) min(c1) max(c1) sum(c1) count(c2) min(c2) max(c2) 250 250 0 498 39900 100 300300300300300 498498498498498 +select count(c2), min(c2), max(c2) from t3 where c1 < 256; +count(c2) min(c2) max(c2) +16384 中文 中文 +alter system set _rowsets_enabled = false; +alter system flush plan cache; +select count(c2), min(c2), max(c2) from t3 where c1 < 256; +count(c2) min(c2) max(c2) +16384 中文 中文 alter system major freeze; alter table t2 add column c4 bigint default 10, add column c5 bigint unsigned default 20; alter table t2 add column c6 bigint default null; @@ -326,7 +336,7 @@ count(*) count(a) min(a) max(a) sum(a) count(b) min(b) max(b) count(c) min(c) ma select count(*),count(c1),min(c1),max(c1),sum(c1),count(c2),min(c2),max(c2) from t1; count(*) count(c1) min(c1) max(c1) sum(c1) count(c2) min(c2) max(c2) 250 250 0 498 39900 100 300300300300300 498498498498498 -drop table t1,t2; +drop table t1,t2,t3; alter system flush plan cache; create table t1(a int, b varchar(3048), primary key (a), c int) with column group (each column); create table t2(pk int, c1 int, c2 int unsigned, c3 varchar(100)) block_size=2048 with column group (each column); diff --git a/tools/deploy/mysql_test/test_suite/column_store/t/add_column.test b/tools/deploy/mysql_test/test_suite/column_store/t/add_column.test index 82c15921c..adfd420fb 100644 --- a/tools/deploy/mysql_test/test_suite/column_store/t/add_column.test +++ b/tools/deploy/mysql_test/test_suite/column_store/t/add_column.test @@ -4,14 +4,18 @@ --disable_query_log --disable_warnings +connect (obsys,$OBMYSQL_MS0,admin,$OBMYSQL_PWD,test,$OBMYSQL_PORT); +connection obsys; +alter system set_tp tp_name = "EN_COMPACTION_DISABLE_ROW_COL_SWITCH", error_code = 4016, frequency = 1; +connection default; set @@recyclebin = off; -drop table if exists t1,t2; +drop table if exists t1,t2,t3; --enable_warnings --enable_query_log create table t1(a int, b varchar(3048), primary key (a), c int) with column group (all columns, each column); create table t2(pk int, c1 int, c2 int unsigned, c3 varchar(100)) block_size=2048 with column group (all columns, each column); - +create table t3(c1 int) with column group (each column); sleep 10; --disable_query_log @@ -31,9 +35,18 @@ while ($count < 300) ($count * 10 + 8,$count * 10 + 8, $count * 10 + 8 + 1, concat("abcdefg", $count)), ($count * 10 + 9,$count * 10 + 9, $count * 10 + 9 + 1, concat("abcdefg", $count)), ($count * 10 + 10,$count * 10 + 10, $count * 10 + 10+ 1, concat("abcdefg", $count)); + eval insert into t3(c1) values ($count); inc $count; inc $count; } + +--let $count=1 +while ($count < 8) +{ + eval insert into t3 select * from t3; + inc $count; +} + --enable_warnings --enable_query_log select count(*) from t1; @@ -44,6 +57,7 @@ alter system major freeze; --source mysql_test/include/wait_daily_merge.inc alter table t1 add column c1 int default 0, add column c2 varchar(100); +alter table t3 add column c2 char(60) default "中文"; --disable_query_log --disable_warnings @@ -117,6 +131,24 @@ select a, c1, count(c1) from t1 where a <20 and c1 != 80 and c1 != 6 and c1 < 30 select count(*),count(a),min(a),max(a),sum(a),count(b),min(b),max(b),count(c),min(c),max(c),sum(c) from t1; select count(*),count(c1),min(c1),max(c1),sum(c1),count(c2),min(c2),max(c2) from t1; +--disable_query_log +SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; +alter system flush plan cache; +sleep 1; +--enable_query_log + +select count(c2), min(c2), max(c2) from t3 where c1 < 256; + +alter system set _rowsets_enabled = false; +alter system flush plan cache; +select count(c2), min(c2), max(c2) from t3 where c1 < 256; + +--disable_query_log +SET sql_mode = ''; +alter system flush plan cache; +sleep 1; +--enable_query_log + alter system major freeze; --source mysql_test/include/wait_daily_merge.inc @@ -183,7 +215,7 @@ select count(*) from t1; select count(*),count(a),min(a),max(a),sum(a),count(b),min(b),max(b),count(c),min(c),max(c),sum(c) from t1; select count(*),count(c1),min(c1),max(c1),sum(c1),count(c2),min(c2),max(c2) from t1; -drop table t1,t2; +drop table t1,t2,t3; alter system flush plan cache; @@ -353,3 +385,7 @@ set @@recyclebin = on; alter system set _pushdown_storage_level = 4; alter system set _rowsets_enabled = true; alter system flush plan cache; +connection obsys; +alter system set_tp tp_name = "EN_COMPACTION_DISABLE_ROW_COL_SWITCH", error_code = 4016, frequency = 0; +connection default; +--enable_query_log