From fe369e7bdf1d02e3df46b31fcf748b23587b6db0 Mon Sep 17 00:00:00 2001 From: wjHuang Date: Wed, 4 Sep 2024 19:23:09 +0800 Subject: [PATCH] core: fix missing update on nested generated column (#55829) close pingcap/tidb#53967 --- pkg/planner/core/integration_test.go | 17 +++++++++++++++++ pkg/planner/core/logical_plan_builder.go | 3 +++ 2 files changed, 20 insertions(+) diff --git a/pkg/planner/core/integration_test.go b/pkg/planner/core/integration_test.go index 47b6e227a0f05..acf17621e0cf0 100644 --- a/pkg/planner/core/integration_test.go +++ b/pkg/planner/core/integration_test.go @@ -2809,3 +2809,20 @@ func TestIssue48257(t *testing.T) { "└─TableFullScan 1.00 cop[tikv] table:t1 keep order:false", )) } + +func TestNestedVirtualGeneratedColumnUpdate(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("CREATE TABLE test1 (\ncol1 bigint(20) NOT NULL ,\ncol2 varchar(36) NOT NULL ,\ncol3 int(11) DEFAULT NULL ,\ncol4 varchar(36) NOT NULL ,\ncol5 varchar(255) DEFAULT NULL ,\nmodify_time bigint(20) DEFAULT NULL,\ncreate_time bigint(20) DEFAULT NULL,\ncol6 json DEFAULT NULL ,\n" + + "col7 json DEFAULT NULL ," + + "col8 json GENERATED ALWAYS AS (json_merge_patch(ifnull(col6, _utf8mb4\"{}\"), ifnull(col7, _utf8mb4\"{}\"))) STORED," + + "col9 varchar(36) GENERATED ALWAYS AS (left(json_unquote(json_extract(col8, _utf8mb4\"$.col9[0]\")), 36)) VIRTUAL," + + "col10 varchar(30) GENERATED ALWAYS AS (left(json_unquote(json_extract(col8, _utf8mb4\"$.col10\")), 30)) VIRTUAL," + + "KEY dev_idx1 (col10)) " + + "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;") + tk.MustExec("INSERT INTO test1 VALUES (-100000000, \"123459789332\", 1, \"123459789332\", \"BBBBB\", 1675871896, 1675871896, '{\"col10\": \"CCCCC\",\"col9\": [\"ABCDEFG\"]}', NULL, DEFAULT, DEFAULT, DEFAULT);\n") + tk.MustExec("UPDATE test1 SET col7 = '{\"col10\":\"DDDDD\",\"col9\":[\"abcdefg\"]}';\n") + tk.MustExec("DELETE FROM test1 WHERE col1 < 0;\n") +} diff --git a/pkg/planner/core/logical_plan_builder.go b/pkg/planner/core/logical_plan_builder.go index 54ea6b4f654f0..9155f0e21d990 100644 --- a/pkg/planner/core/logical_plan_builder.go +++ b/pkg/planner/core/logical_plan_builder.go @@ -6426,6 +6426,9 @@ func (b *PlanBuilder) buildUpdateLists(ctx context.Context, tableList []*ast.Tab break } } + if isModified { + dependentColumnsModified[col.UniqueID] = true + } // skip unmodified generated columns if !isModified { continue