From 1190c0f3b556f0a352f79223ba70d6c12e206c4a Mon Sep 17 00:00:00 2001 From: lvhui Date: Tue, 20 Jun 2023 18:52:19 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8Don=20update=20timestamp?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=AF=B9=E5=B9=B6=E5=8F=91update?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runtime/executor/nodeModifyTable.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/gausskernel/runtime/executor/nodeModifyTable.cpp b/src/gausskernel/runtime/executor/nodeModifyTable.cpp index 99a2cc66b..f6ef4ff8e 100644 --- a/src/gausskernel/runtime/executor/nodeModifyTable.cpp +++ b/src/gausskernel/runtime/executor/nodeModifyTable.cpp @@ -2200,14 +2200,6 @@ TupleTableSlot* ExecUpdate(ItemPointer tupleid, bool update_indexes = false; LockTupleMode lockmode; - /* acquire Form_pg_attrdef ad_on_update */ - if (result_relation_desc->rd_att->constr && result_relation_desc->rd_att->constr->has_on_update) { - bool update_fix_result = ExecComputeStoredUpdateExpr(result_rel_info, estate, slot, tuple, CMD_UPDATE, tupleid, oldPartitionOid, bucketid); - if (!update_fix_result) { - tuple = slot->tts_tuple; - } - } - /* * Check the constraints of the tuple * @@ -2228,6 +2220,14 @@ lreplace: tuple = slot->tts_tuple; } + /* acquire Form_pg_attrdef ad_on_update */ + if (result_relation_desc->rd_att->constr && result_relation_desc->rd_att->constr->has_on_update) { + bool update_fix_result = ExecComputeStoredUpdateExpr(result_rel_info, estate, slot, tuple, CMD_UPDATE, tupleid, oldPartitionOid, bucketid); + if (!update_fix_result) { + tuple = slot->tts_tuple; + } + } + if (result_relation_desc->rd_att->constr) { TupleTableSlot *tmp_slot = node->mt_update_constr_slot == NULL ? slot : node->mt_update_constr_slot; if (!ExecConstraints(result_rel_info, tmp_slot, estate)) { From 138469465324af20f542fa8cae7bdb3f473db2bc Mon Sep 17 00:00:00 2001 From: lvhui Date: Wed, 21 Jun 2023 14:36:53 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0regression=20case=20test?= =?UTF-8?q?=20for=20concurrent=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../regress/expected/on_update_session1.out | 25 +++++++++++++++++++ .../regress/expected/on_update_session2.out | 14 +++++++++++ src/test/regress/parallel_schedule0 | 2 ++ src/test/regress/sql/on_update_session1.sql | 10 ++++++++ src/test/regress/sql/on_update_session2.sql | 4 +++ 5 files changed, 55 insertions(+) create mode 100644 src/test/regress/expected/on_update_session1.out create mode 100644 src/test/regress/expected/on_update_session2.out create mode 100644 src/test/regress/sql/on_update_session1.sql create mode 100644 src/test/regress/sql/on_update_session2.sql diff --git a/src/test/regress/expected/on_update_session1.out b/src/test/regress/expected/on_update_session1.out new file mode 100644 index 000000000..e19fdab60 --- /dev/null +++ b/src/test/regress/expected/on_update_session1.out @@ -0,0 +1,25 @@ +create database mysql_test dbcompatibility 'B'; +\c mysql_test +create table tb666(c1 timestamp default current_timestamp on update current_timestamp, c2 int, c3 timestamp generated always as(c1+c2) stored); +insert into tb666 values(default, 1); +select * from tb666; + c1 | c2 | c3 +--------------------------------+----+-------------------------------- +--?.* +(1 row) + +begin; +update tb666 set c2 = 2; +select * from tb666; + c1 | c2 | c3 +---------------------------------+----+-------------------------------- +--?.* +(1 row) + +select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +commit; diff --git a/src/test/regress/expected/on_update_session2.out b/src/test/regress/expected/on_update_session2.out new file mode 100644 index 000000000..fef93c808 --- /dev/null +++ b/src/test/regress/expected/on_update_session2.out @@ -0,0 +1,14 @@ +select pg_sleep(2); + pg_sleep +---------- + +(1 row) + +\c mysql_test +update tb666 set c2 = 3; +select * from tb666; + c1 | c2 | c3 +---------------------------------+----+--------------------------------- +--?.* +(1 row) + diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index c5efdcb4e..6e5ca7382 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -1088,3 +1088,5 @@ test: user_host_test # test for new_expr_by_flatten test: enable_expr_fusion_flatten +# test for on update timestamp and generated column +test: on_update_session1 on_update_session2 diff --git a/src/test/regress/sql/on_update_session1.sql b/src/test/regress/sql/on_update_session1.sql new file mode 100644 index 000000000..08293e6a0 --- /dev/null +++ b/src/test/regress/sql/on_update_session1.sql @@ -0,0 +1,10 @@ +create database mysql_test dbcompatibility 'B'; +\c mysql_test +create table tb666(c1 timestamp default current_timestamp on update current_timestamp, c2 int, c3 timestamp generated always as(c1+c2) stored); +insert into tb666 values(default, 1); +select * from tb666; +begin; +update tb666 set c2 = 2; +select * from tb666; +select pg_sleep(2); +commit; \ No newline at end of file diff --git a/src/test/regress/sql/on_update_session2.sql b/src/test/regress/sql/on_update_session2.sql new file mode 100644 index 000000000..7f982f258 --- /dev/null +++ b/src/test/regress/sql/on_update_session2.sql @@ -0,0 +1,4 @@ +select pg_sleep(2); +\c mysql_test +update tb666 set c2 = 3; +select * from tb666; \ No newline at end of file From a0c9dcd77b00cb57ff67edc9c60942f07ab1e220 Mon Sep 17 00:00:00 2001 From: lvhui Date: Sun, 25 Jun 2023 16:35:01 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E7=94=9F=E6=88=90=E5=88=97=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E5=9C=A8on=20update=E6=89=A7=E8=A1=8C=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E5=86=8D=E6=89=A7=E8=A1=8C=EF=BC=8C=E5=90=A6=E5=88=99?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=88=97=E5=8F=96=E7=9A=84=E6=98=AFon=20upda?= =?UTF-8?q?te=E4=B9=8B=E5=89=8D=E7=9A=84=E8=80=81=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=8C=E5=BD=B1=E5=93=8D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runtime/executor/nodeModifyTable.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/gausskernel/runtime/executor/nodeModifyTable.cpp b/src/gausskernel/runtime/executor/nodeModifyTable.cpp index f6ef4ff8e..b3821d0a8 100644 --- a/src/gausskernel/runtime/executor/nodeModifyTable.cpp +++ b/src/gausskernel/runtime/executor/nodeModifyTable.cpp @@ -2212,14 +2212,6 @@ TupleTableSlot* ExecUpdate(ItemPointer tupleid, Assert(RELATION_HAS_BUCKET(result_relation_desc) == (bucketid != InvalidBktId)); lreplace: - /* - * Compute stored generated columns - */ - if (result_relation_desc->rd_att->constr && result_relation_desc->rd_att->constr->has_generated_stored) { - ExecComputeStoredGenerated(result_rel_info, estate, slot, tuple, CMD_UPDATE); - tuple = slot->tts_tuple; - } - /* acquire Form_pg_attrdef ad_on_update */ if (result_relation_desc->rd_att->constr && result_relation_desc->rd_att->constr->has_on_update) { bool update_fix_result = ExecComputeStoredUpdateExpr(result_rel_info, estate, slot, tuple, CMD_UPDATE, tupleid, oldPartitionOid, bucketid); @@ -2228,6 +2220,14 @@ lreplace: } } + /* + * Compute stored generated columns + */ + if (result_relation_desc->rd_att->constr && result_relation_desc->rd_att->constr->has_generated_stored) { + ExecComputeStoredGenerated(result_rel_info, estate, slot, tuple, CMD_UPDATE); + tuple = slot->tts_tuple; + } + if (result_relation_desc->rd_att->constr) { TupleTableSlot *tmp_slot = node->mt_update_constr_slot == NULL ? slot : node->mt_update_constr_slot; if (!ExecConstraints(result_rel_info, tmp_slot, estate)) {