From 060c12e39325ccbc082b77dd5d6c65982d2436fd Mon Sep 17 00:00:00 2001 From: "houzj.fnst" Date: Mon, 11 Apr 2022 16:23:56 +0800 Subject: [PATCH] Fix missed ReleaseSysCache in AlterPublicationOptions --- src/backend/commands/publicationcmds.c | 10 ++++++---- src/test/regress/expected/publication.out | 8 ++++++++ src/test/regress/sql/publication.sql | 8 ++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 7aacb6b2fe..1a25f7d994 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -954,14 +954,16 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, ObjectIdGetDatum(relid), ObjectIdGetDatum(pubform->oid)); + if (!HeapTupleIsValid(rftuple)) + continue; + has_row_filter = !heap_attisnull(rftuple, Anum_pg_publication_rel_prqual, NULL); has_column_list = !heap_attisnull(rftuple, Anum_pg_publication_rel_prattrs, NULL); - if (HeapTupleIsValid(rftuple) && - (has_row_filter || has_column_list)) + if (has_row_filter || has_column_list) { HeapTuple tuple; @@ -996,9 +998,9 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, ReleaseSysCache(tuple); } - - ReleaseSysCache(rftuple); } + + ReleaseSysCache(rftuple); } } diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 8208f9fa0e..a9e4c43caa 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -590,6 +590,10 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1; ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); ERROR: cannot set publish_via_partition_root = false for publication "testpub6" DETAIL: The publication contains a WHERE clause for a partitioned table "rf_tbl_abcd_part_pk" which is not allowed when publish_via_partition_root is false. +-- remove partitioned table's row filter +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk; +-- ok - we don't have row filter for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -- Now change the root filter to use a column "b" -- (which is not in the replica identity) ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 WHERE (b > 99); @@ -953,6 +957,10 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1; ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); ERROR: cannot set publish_via_partition_root = false for publication "testpub6" DETAIL: The publication contains a column list for a partitioned table "rf_tbl_abcd_part_pk" which is not allowed when publish_via_partition_root is false. +-- remove partitioned table's column list +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk; +-- ok - we don't have column list for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -- Now change the root column list to use a column "b" -- (which is not in the replica identity) ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 (b); diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index 8539110025..9eb86fd54f 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -352,6 +352,10 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1; -- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any row filter is -- used for partitioned table ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- remove partitioned table's row filter +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk; +-- ok - we don't have row filter for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -- Now change the root filter to use a column "b" -- (which is not in the replica identity) ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 WHERE (b > 99); @@ -635,6 +639,10 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1; -- fail - cannot set PUBLISH_VIA_PARTITION_ROOT to false if any column list is -- used for partitioned table ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); +-- remove partitioned table's column list +ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk; +-- ok - we don't have column list for partitioned table. +ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=0); -- Now change the root column list to use a column "b" -- (which is not in the replica identity) ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk_1 (b); -- 2.18.4