[Fix](variant) fallback to none partial update for mow table (#28116)
This commit is contained in:
@ -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()) {
|
||||
|
||||
@ -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}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user