diff --git a/src/gausskernel/runtime/executor/nodeModifyTable.cpp b/src/gausskernel/runtime/executor/nodeModifyTable.cpp index 99a2cc66b6b7858a8e1ed143dde35dfd776e78a6..b3821d0a80baf8f5fa6eabcf4d8b0d6dec4c0534 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 * @@ -2220,6 +2212,14 @@ TupleTableSlot* ExecUpdate(ItemPointer tupleid, Assert(RELATION_HAS_BUCKET(result_relation_desc) == (bucketid != InvalidBktId)); lreplace: + /* 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; + } + } + /* * Compute stored generated columns */ 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 0000000000000000000000000000000000000000..e19fdab6006e2c9ee897ecbaa006ce1baddcbd78 --- /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 0000000000000000000000000000000000000000..fef93c808da2974f8508605ec20669ff77c53ef3 --- /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 c5efdcb4e124ad54e47ae90fc96e4b0040f22aa2..6e5ca738224aca93c09b9e67f034e2b2268ae076 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 0000000000000000000000000000000000000000..08293e6a0b831d7e5a154c541d1e58c1c520499a --- /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 0000000000000000000000000000000000000000..7f982f258ff62f5196ad881eaebf52806d731c6c --- /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