diff --git a/src/gausskernel/optimizer/plan/createplan.cpp b/src/gausskernel/optimizer/plan/createplan.cpp index 7dcedd1bf719bf7b7601bae948898634cb0ba254..8dce2a561184119fbb2e58ce900d1e1650ed5d8d 100755 --- a/src/gausskernel/optimizer/plan/createplan.cpp +++ b/src/gausskernel/optimizer/plan/createplan.cpp @@ -9645,9 +9645,10 @@ ModifyTable* make_modifytable(CmdType operation, bool canSetTag, List* resultRel isUstore = result_rte->is_ustore; } + int nest_level = GetCurrentTransactionNestLevel(); // not support the smp in nest transaction. bool supportIUDParallel = (operation == CMD_DELETE || operation == CMD_UPDATE || (operation == CMD_INSERT && !upsertClause)) && - returningLists == NIL && !isUstore && list_length(subplans) == 1 && + returningLists == NIL && !isUstore && list_length(subplans) == 1 && nest_level <= 1 && (linitial_node(RangeTblEntry, root->parse->rtable)->orientation == REL_ROW_ORIENTED); Assert(list_length(resultRelations) == list_length(subplans)); diff --git a/src/test/regress/expected/smp.out b/src/test/regress/expected/smp.out index 2026bf5db6df6a79dc842a81f7cfda34a7dc1eaf..0bea03e687f86ca33d55e583cc4599387db47b4b 100644 --- a/src/test/regress/expected/smp.out +++ b/src/test/regress/expected/smp.out @@ -1564,6 +1564,18 @@ select /*+ set(query_dop 1002) indexonlyscan(ios_t1) */ count(*) from ios_t1; (1 row) drop table ios_t1; +create table pktable2(f1 int primary key); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "pktable2_pkey" for table "pktable2" +create table fktable2(f1 int references pktable2 deferrable initially deferred); +insert into pktable2 values(1); +begin; +insert into fktable2 values(1); +savepoint x; +delete from fktable2; +rollback to x; +commit; +drop table fktable2; +drop table pktable2; --clean set search_path=public; drop schema test_smp cascade; diff --git a/src/test/regress/sql/smp.sql b/src/test/regress/sql/smp.sql index fdb88ae94c6e689c0151c841c228f3bd796adfd4..3f8979132e614e0ab6a8fb3e7859fd928eb25a7b 100644 --- a/src/test/regress/sql/smp.sql +++ b/src/test/regress/sql/smp.sql @@ -304,6 +304,22 @@ explain(costs off) select /*+ set(query_dop 1002) indexonlyscan(ios_t1) */ count select /*+ set(query_dop 1002) indexonlyscan(ios_t1) */ count(*) from ios_t1; drop table ios_t1; + + +create table pktable2(f1 int primary key); +create table fktable2(f1 int references pktable2 deferrable initially deferred); +insert into pktable2 values(1); + +begin; +insert into fktable2 values(1); +savepoint x; +delete from fktable2; +rollback to x; +commit; + +drop table fktable2; +drop table pktable2; + --clean set search_path=public; drop schema test_smp cascade;