[Fix](variant) fallback to none partial update for mow table (#28116)

This commit is contained in:
lihangyu
2023-12-07 19:30:24 +08:00
committed by GitHub
parent 942450a2e5
commit cc9b4bcddb
3 changed files with 23 additions and 5 deletions

View File

@ -189,8 +189,12 @@ public class UpdateStmt extends DdlStmt {
// step3: generate select list and insert column name list in insert stmt
boolean isMow = ((OlapTable) targetTable).getEnableUniqueKeyMergeOnWrite();
boolean hasVariant = false;
int setExprCnt = 0;
for (Column column : targetTable.getColumns()) {
if (column.getType().isVariantType()) {
hasVariant = true;
}
for (BinaryPredicate setExpr : setExprs) {
Expr lhs = setExpr.getChild(0);
if (((SlotRef) lhs).getColumn().equals(column)) {
@ -198,10 +202,13 @@ public class UpdateStmt extends DdlStmt {
}
}
}
// table with sequence col cannot use partial update cause in MOW, we encode pk
// 1.table with sequence col cannot use partial update cause in MOW, we encode pk
// with seq column but we don't know which column is sequence in update
// 2. variant column update schema during load, so implement partial update is complicated,
// just ignore it at present
if (isMow && ((OlapTable) targetTable).getSequenceCol() == null
&& setExprCnt <= targetTable.getColumns().size() * 3 / 10) {
&& setExprCnt <= targetTable.getColumns().size() * 3 / 10
&& !hasVariant) {
isPartialUpdate = true;
}
for (Column column : targetTable.getColumns()) {

View File

@ -7,4 +7,10 @@
-- !sql --
2 {"updated_value":123} {"updated_value":123}
6 {"c":4.0,"a":4,"b":[4]} {"updated_value" : 123}
7 {"updated_value":1111} yyy
-- !sql --
2 {"updated_value":123} {"updated_value":123}
6 {"c":4.0,"a":4,"b":[4]} {"updated_value" : 123}

View File

@ -55,9 +55,14 @@ suite("regression_test_variant_delete_and_update", "variant_type"){
sql "insert into var_delete_update_mow select k, cast(v as string), cast(v as string) from var_delete_update"
sql "delete from ${table_name} where k = 1"
sql "delete from ${table_name} where k in (select k from var_delete_update_mow where k in (3, 4, 5))"
// FIXME
// sql """update ${table_name} set vs = '{"updated_value" : 123}' where k = 2"""
// sql """update ${table_name} set v = '{"updated_value" : 123}' where k = 2"""
sql """insert into ${table_name} values (6, '{"a" : 4, "b" : [4], "c": 4.0}', 'xxx')"""
sql """insert into ${table_name} values (7, '{"a" : 4, "b" : [4], "c": 4.0}', 'yyy')"""
sql """update ${table_name} set vs = '{"updated_value" : 123}' where k = 6"""
sql """update ${table_name} set v = '{"updated_value" : 1111}' where k = 7"""
qt_sql "select * from ${table_name} order by k"
sql """delete from ${table_name} where vs = 'xxx' or vs = 'yyy'"""
qt_sql "select * from ${table_name} order by k"
// delete & insert concurrently