On 07.03.22 16:18, Tomas Vondra wrote:
AFAICS these issues should be resolved by the adoption of the row-filter
approach (i.e. it should fail the same way as for row filter).
The first two patches (additional testing for row filtering feature)
look okay to me.
Attached is a fixup patch for your main feature patch (the third one).
It's a bit of code and documentation cleanup, but mainly I removed the
term "column filter" from the patch. Half the code was using "column
list" or similar and half the code "column filter", which was confusing.
Also, there seemed to be a bit of copy-and-pasting from row-filter
code going on, with some code comments not quite sensible, so I rewrote
some of them. Also some code used "rf" and "cf" symbols which were a
bit hard to tell apart. A few more letters can increase readability.
Note in publicationcmds.c OpenTableList() the wrong if condition was used.
I'm still confused about the intended replica identity handling. This
patch still checks whether the column list contains the replica identity
at DDL time. And then it also checks at execution time. I thought the
latest understanding was that the DDL-time checking would be removed. I
think it's basically useless now, since as the test cases show, you can
subvert those checks by altering the replica identity later.From d0e9df4674389cda9f891f5678f476d35095c618 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Tue, 8 Mar 2022 16:23:01 +0100
Subject: [PATCH] fixup! Allow specifying column filters for logical
replication
---
doc/src/sgml/catalogs.sgml | 4 +-
doc/src/sgml/protocol.sgml | 5 +-
doc/src/sgml/ref/alter_publication.sgml | 4 +
src/backend/catalog/pg_publication.c | 20 ++-
src/backend/commands/publicationcmds.c | 80 ++++++------
src/backend/executor/execReplication.c | 8 +-
src/backend/replication/logical/proto.c | 21 +--
src/backend/replication/logical/tablesync.c | 16 +--
src/backend/replication/pgoutput/pgoutput.c | 2 +-
src/backend/utils/cache/relcache.c | 25 ++--
src/bin/psql/describe.c | 2 +-
src/include/catalog/pg_publication.h | 7 +-
src/include/commands/publicationcmds.h | 4 +-
src/test/regress/expected/publication.out | 134 ++++++++++----------
src/test/regress/sql/publication.sql | 90 ++++++-------
src/test/subscription/t/029_column_list.pl | 50 ++++----
16 files changed, 235 insertions(+), 237 deletions(-)
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 2b61f42b71..c043da37ae 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -4392,7 +4392,7 @@ <title><structname>pg_index</structname> Columns</title>
</para>
<para>
This is an array of <structfield>indnatts</structfield> values that
- indicate which table columns this index indexes. For example a value
+ indicate which table columns this index indexes. For example, a value
of <literal>1 3</literal> would mean that the first and the third table
columns make up the index entries. Key columns come before non-key
(included) columns. A zero in this array indicates that the
@@ -6271,7 +6271,7 @@ <title><structname>pg_publication_namespace</structname>
Columns</title>
</para>
<para>
This is an array of values that indicates which table columns are
- part of the publication. For example a value of <literal>1 3</literal>
+ part of the publication. For example, a value of <literal>1 3</literal>
would mean that the first and the third table columns are published.
A null value indicates that all columns are published.
</para></entry>
diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml
index 496593201b..6f4d76ef7f 100644
--- a/doc/src/sgml/protocol.sgml
+++ b/doc/src/sgml/protocol.sgml
@@ -7005,9 +7005,8 @@ <title>Logical Replication Message Formats</title>
</listitem>
</varlistentry>
</variablelist>
- Next, the following message part appears for each column (except
- generated columns and other columns that don't appear in the column
- filter list, for tables that have one):
+ Next, the following message part appears for each column included in
+ the publication (except generated columns):
<variablelist>
<varlistentry>
<term>
diff --git a/doc/src/sgml/ref/alter_publication.sgml
b/doc/src/sgml/ref/alter_publication.sgml
index aa6827c977..470d50a244 100644
--- a/doc/src/sgml/ref/alter_publication.sgml
+++ b/doc/src/sgml/ref/alter_publication.sgml
@@ -119,10 +119,14 @@ <title>Parameters</title>
specified, the table and all its descendant tables (if any) are
affected. Optionally, <literal>*</literal> can be specified after the
table
name to explicitly indicate that descendant tables are included.
+ </para>
+ <para>
Optionally, a column list can be specified. See <xref
linkend="sql-createpublication"/> for details.
+ </para>
+ <para>
If the optional <literal>WHERE</literal> clause is specified, rows for
which the <replaceable class="parameter">expression</replaceable>
evaluates to false or null will not be published. Note that parentheses
diff --git a/src/backend/catalog/pg_publication.c
b/src/backend/catalog/pg_publication.c
index 4dab96265f..3275a7c8b9 100644
--- a/src/backend/catalog/pg_publication.c
+++ b/src/backend/catalog/pg_publication.c
@@ -333,7 +333,6 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri,
Publication *pub = GetPublication(pubid);
AttrNumber *attarray;
int natts = 0;
- int i;
ObjectAddress myself,
referenced;
List *relids = NIL;
@@ -381,7 +380,7 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri,
values[Anum_pg_publication_rel_prrelid - 1] =
ObjectIdGetDatum(relid);
- /* Add column filter, if available */
+ /* Add column list, if available */
if (pri->columns)
{
int2vector *prattrs;
@@ -408,7 +407,7 @@ publication_add_relation(Oid pubid, PublicationRelInfo *pri,
ObjectAddressSet(myself, PublicationRelRelationId, pubreloid);
/* Add dependency on the columns, if any are listed */
- for (i = 0; i < natts; i++)
+ for (int i = 0; i < natts; i++)
{
ObjectAddressSubSet(referenced, RelationRelationId, relid,
attarray[i]);
recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO);
@@ -461,7 +460,6 @@ publication_set_table_columns(Relation pubrel, HeapTuple
pubreltup,
bool nulls[Natts_pg_publication_rel];
bool replaces[Natts_pg_publication_rel];
Datum values[Natts_pg_publication_rel];
- int i;
memset(values, 0, sizeof(values));
memset(nulls, false, sizeof(nulls));
@@ -480,14 +478,14 @@ publication_set_table_columns(Relation pubrel, HeapTuple
pubreltup,
}
else
{
- ObjectAddress myself,
+ ObjectAddress myself,
referenced;
int2vector *prattrs;
Form_pg_publication_rel pubrel;
publication_translate_columns(targetrel, columns, &natts,
&attarray);
- /* XXX "pub" is leaked here */
+ /* XXX "pub" is leaked here ??? */
prattrs = buildint2vector(attarray, natts);
values[Anum_pg_publication_rel_prattrs - 1] =
PointerGetDatum(prattrs);
@@ -496,7 +494,7 @@ publication_set_table_columns(Relation pubrel, HeapTuple
pubreltup,
pubrel = (Form_pg_publication_rel) GETSTRUCT(pubreltup);
ObjectAddressSet(myself, PublicationRelRelationId, pubrel->oid);
- for (i = 0; i < natts; i++)
+ for (int i = 0; i < natts; i++)
{
ObjectAddressSubSet(referenced, RelationRelationId,
RelationGetRelid(targetrel), attarray[i]);
@@ -713,11 +711,10 @@ GetRelationColumnPartialPublications(Oid relid)
{
CatCList *pubrellist;
List *pubs = NIL;
- int i;
pubrellist = SearchSysCacheList1(PUBLICATIONRELMAP,
ObjectIdGetDatum(relid));
- for (i = 0; i < pubrellist->n_members; i++)
+ for (int i = 0; i < pubrellist->n_members; i++)
{
HeapTuple tup = &pubrellist->members[i]->tuple;
bool isnull;
@@ -727,7 +724,7 @@ GetRelationColumnPartialPublications(Oid relid)
Anum_pg_publication_rel_prattrs,
&isnull);
- /* no column filter for this publications/relation */
+ /* no column list for this publications/relation */
if (isnull)
continue;
@@ -756,7 +753,6 @@ GetRelationColumnListInPublication(Oid relid, Oid pubid)
int nelems;
int16 *elems;
List *attnos = NIL;
- int i;
tup = SearchSysCache2(PUBLICATIONRELMAP,
ObjectIdGetDatum(relid),
@@ -774,7 +770,7 @@ GetRelationColumnListInPublication(Oid relid, Oid pubid)
nelems = ARR_DIMS(arr)[0];
elems = (int16 *) ARR_DATA_PTR(arr);
- for (i = 0; i < nelems; i++)
+ for (int i = 0; i < nelems; i++)
attnos = lappend_oid(attnos, elems[i]);
ReleaseSysCache(tup);
diff --git a/src/backend/commands/publicationcmds.c
b/src/backend/commands/publicationcmds.c
index fa1462ae54..b32ec27555 100644
--- a/src/backend/commands/publicationcmds.c
+++ b/src/backend/commands/publicationcmds.c
@@ -296,7 +296,7 @@ contain_invalid_rfcolumn_walker(Node *node, rf_context
*context)
* Returns true if any invalid column is found.
*/
bool
-contain_invalid_rfcolumn(Oid pubid, Relation relation, List *ancestors,
+pub_rf_contains_invalid_column(Oid pubid, Relation relation, List *ancestors,
bool pubviaroot)
{
HeapTuple rftuple;
@@ -368,28 +368,28 @@ contain_invalid_rfcolumn(Oid pubid, Relation relation,
List *ancestors,
}
/*
- * Check if all columns referenced in the column filter are part of the
+ * Check if all columns referenced in the column list are part of the
* REPLICA IDENTITY index or not.
*
* Returns true if any invalid column is found.
*/
bool
-contain_invalid_cfcolumn(Oid pubid, Relation relation, List *ancestors,
+pub_collist_contains_invalid_column(Oid pubid, Relation relation, List
*ancestors,
bool pubviaroot)
{
- HeapTuple cftuple;
+ HeapTuple tuple;
Oid relid = RelationGetRelid(relation);
Oid publish_as_relid = RelationGetRelid(relation);
bool result = false;
- Datum cfdatum;
- bool cfisnull;
+ Datum datum;
+ bool isnull;
/*
* For a partition, if pubviaroot is true, find the topmost ancestor
that
- * is published via this publication as we need to use its column filter
+ * is published via this publication as we need to use its column list
* for the changes.
*
- * Note that even though the column filter used is for an ancestor, the
+ * Note that even though the column list used is for an ancestor, the
* REPLICA IDENTITY used will be for the actual child table.
*/
if (pubviaroot && relation->rd_rel->relispartition)
@@ -400,24 +400,24 @@ contain_invalid_cfcolumn(Oid pubid, Relation relation,
List *ancestors,
publish_as_relid = relid;
}
- cftuple = SearchSysCache2(PUBLICATIONRELMAP,
+ tuple = SearchSysCache2(PUBLICATIONRELMAP,
ObjectIdGetDatum(publish_as_relid),
ObjectIdGetDatum(pubid));
- if (!HeapTupleIsValid(cftuple))
+ if (!HeapTupleIsValid(tuple))
return false;
- cfdatum = SysCacheGetAttr(PUBLICATIONRELMAP, cftuple,
+ datum = SysCacheGetAttr(PUBLICATIONRELMAP, tuple,
Anum_pg_publication_rel_prattrs,
- &cfisnull);
+ &isnull);
- if (!cfisnull)
+ if (!isnull)
{
int x;
Bitmapset *idattrs;
Bitmapset *columns = NULL;
- /* With REPLICA IDENTITY FULL, no column filter is allowed. */
+ /* With REPLICA IDENTITY FULL, no column list is allowed. */
if (relation->rd_rel->relreplident == REPLICA_IDENTITY_FULL)
result = true;
@@ -426,7 +426,7 @@ contain_invalid_cfcolumn(Oid pubid, Relation relation, List
*ancestors,
int nelems;
int16 *elems;
- arr = DatumGetArrayTypeP(cfdatum);
+ arr = DatumGetArrayTypeP(datum);
nelems = ARR_DIMS(arr)[0];
elems = (int16 *) ARR_DATA_PTR(arr);
@@ -441,7 +441,7 @@ contain_invalid_cfcolumn(Oid pubid, Relation relation, List
*ancestors,
/*
* Attnums in the bitmap returned by RelationGetIndexAttrBitmap
are
- * offset (to handle system columns the usual way), while
column filter
+ * offset (to handle system columns the usual way), while
column list
* does not use offset, so we can't do bms_is_subset().
Instead, we have
* to loop over the idattrs and check all of them are in the
filter.
*/
@@ -479,7 +479,7 @@ contain_invalid_cfcolumn(Oid pubid, Relation relation, List
*ancestors,
bms_free(columns);
}
- ReleaseSysCache(cftuple);
+ ReleaseSysCache(tuple);
return result;
}
@@ -733,7 +733,7 @@ TransformPubWhereClauses(List *tables, const char
*queryString,
* XXX The name is a bit misleading, because we don't really transform
* anything here - we merely check the column list is compatible with the
* definition of the publication (with publish_via_partition_root=false)
- * we only allow filters on the leaf relations. So maybe rename it?
+ * we only allow column lists on the leaf relations. So maybe rename it?
*/
static void
TransformPubColumnList(List *tables, const char *queryString,
@@ -750,7 +750,7 @@ TransformPubColumnList(List *tables, const char
*queryString,
/*
* If the publication doesn't publish changes via the root
partitioned
- * table, the partition's column filter will be used. So
disallow using
+ * table, the partition's column list will be used. So disallow
using
* the column list on partitioned table in this case.
*/
if (!pubviaroot &&
@@ -988,8 +988,8 @@ AlterPublicationOptions(ParseState *pstate,
AlterPublicationStmt *stmt,
/*
* If the publication doesn't publish changes via the root partitioned
- * table, the partition's row and column filter will be used. So
disallow
- * using WHERE clause and column filters on partitioned table in this
case.
+ * table, the partition's row filter and column list will be used. So
disallow
+ * using WHERE clause and column lists on partitioned table in this
case.
*/
if (!pubform->puballtables && publish_via_partition_root_given &&
!publish_via_partition_root)
@@ -997,7 +997,7 @@ AlterPublicationOptions(ParseState *pstate,
AlterPublicationStmt *stmt,
/*
* Lock the publication so nobody else can do anything with it.
This
* prevents concurrent alter to add partitioned table(s) with
WHERE
- * clause(s) and/or column filters which we don't allow when not
+ * clause(s) and/or column lists which we don't allow when not
* publishing via root.
*/
LockDatabaseObject(PublicationRelationId, pubform->oid, 0,
@@ -1010,7 +1010,7 @@ AlterPublicationOptions(ParseState *pstate,
AlterPublicationStmt *stmt,
{
HeapTuple rftuple;
Oid relid = lfirst_oid(lc);
- bool has_column_filter;
+ bool has_column_list;
bool has_row_filter;
rftuple = SearchSysCache2(PUBLICATIONRELMAP,
@@ -1020,11 +1020,11 @@ AlterPublicationOptions(ParseState *pstate,
AlterPublicationStmt *stmt,
has_row_filter
= !heap_attisnull(rftuple,
Anum_pg_publication_rel_prqual, NULL);
- has_column_filter
+ has_column_list
= !heap_attisnull(rftuple,
Anum_pg_publication_rel_prattrs, NULL);
if (HeapTupleIsValid(rftuple) &&
- (has_row_filter || has_column_filter))
+ (has_row_filter || has_column_list))
{
HeapTuple tuple;
@@ -1046,13 +1046,13 @@ AlterPublicationOptions(ParseState *pstate,
AlterPublicationStmt *stmt,
"publish_via_partition_root")));
if ((relform->relkind ==
RELKIND_PARTITIONED_TABLE) &&
- has_column_filter)
+ has_column_list)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("cannot
set %s for publication \"%s\"",
"publish_via_partition_root = false",
stmt->pubname),
- errdetail("The
publication contains a column filter for a partitioned table \"%s\" "
+ errdetail("The
publication contains a column list for a partitioned table \"%s\" "
"which is not allowed when %s is false.",
NameStr(relform->relname),
"publish_via_partition_root")));
@@ -1067,7 +1067,7 @@ AlterPublicationOptions(ParseState *pstate,
AlterPublicationStmt *stmt,
/*
* FIXME check pubactions vs. replica identity, to ensure the replica
- * identity is included in the column filter. Only do this for update
+ * identity is included in the column list. Only do this for update
* and delete publications. See check_publication_columns.
*
* XXX This is needed because publish_via_partition_root may change,
@@ -1261,7 +1261,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt,
HeapTuple tup,
/*
* See if the existing relation currently has a WHERE
clause or a
- * column filter. We need to compare those too.
+ * column list. We need to compare those too.
*/
if (HeapTupleIsValid(rftuple))
{
@@ -1313,7 +1313,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt,
HeapTuple tup,
newrelid =
RelationGetRelid(newpubrel->relation);
/*
- * If the new publication has column filter,
transform it to
+ * If the new publication has column list,
transform it to
* a bitmap too.
*/
if (newpubrel->columns)
@@ -1710,7 +1710,7 @@ OpenTableList(List *tables)
List *rels = NIL;
ListCell *lc;
List *relids_with_rf = NIL;
- List *relids_with_cf = NIL;
+ List *relids_with_collist = NIL;
/*
* Open, share-lock, and check all the explicitly-specified relations
@@ -1745,11 +1745,11 @@ OpenTableList(List *tables)
errmsg("conflicting or
redundant WHERE clauses for table \"%s\"",
RelationGetRelationName(rel))));
- /* Disallow duplicate tables if there are any with
column filters. */
- if (t->columns || list_member_oid(relids_with_cf,
myrelid))
+ /* Disallow duplicate tables if there are any with
column lists. */
+ if (t->columns || list_member_oid(relids_with_collist,
myrelid))
ereport(ERROR,
(errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("conflicting or
redundant column filters for table \"%s\"",
+ errmsg("conflicting or
redundant column lists for table \"%s\"",
RelationGetRelationName(rel))));
table_close(rel, ShareUpdateExclusiveLock);
@@ -1767,7 +1767,7 @@ OpenTableList(List *tables)
relids_with_rf = lappend_oid(relids_with_rf, myrelid);
if (t->columns)
- relids_with_cf = lappend_oid(relids_with_cf, myrelid);
+ relids_with_collist = lappend_oid(relids_with_collist,
myrelid);
/*
* Add children of this rel, if requested, so that they too are
added
@@ -1809,15 +1809,15 @@ OpenTableList(List *tables)
RelationGetRelationName(rel))));
/*
- * We don't allow to specify column
filter for both parent
+ * We don't allow to specify column
list for both parent
* and child table at the same time as
it is not very
* clear which one should be given
preference.
*/
if (childrelid != myrelid &&
- (t->columns ||
list_member_oid(relids_with_cf, childrelid)))
+ (t->columns ||
list_member_oid(relids_with_collist, childrelid)))
ereport(ERROR,
(errcode(ERRCODE_DUPLICATE_OBJECT),
-
errmsg("conflicting or redundant column fiters for table \"%s\"",
+
errmsg("conflicting or redundant column lists for table \"%s\"",
RelationGetRelationName(rel))));
continue;
@@ -1837,8 +1837,8 @@ OpenTableList(List *tables)
if (t->whereClause)
relids_with_rf =
lappend_oid(relids_with_rf, childrelid);
- if (t->whereClause)
- relids_with_cf =
lappend_oid(relids_with_cf, childrelid);
+ if (t->columns)
+ relids_with_collist =
lappend_oid(relids_with_collist, childrelid);
}
}
}
diff --git a/src/backend/executor/execReplication.c
b/src/backend/executor/execReplication.c
index 1d8d4af341..3e282ed99a 100644
--- a/src/backend/executor/execReplication.c
+++ b/src/backend/executor/execReplication.c
@@ -592,24 +592,24 @@ CheckCmdReplicaIdentity(Relation rel, CmdType cmd)
errmsg("cannot update table \"%s\"",
RelationGetRelationName(rel)),
errdetail("Column used in the publication
WHERE expression is not part of the replica identity.")));
- else if (cmd == CMD_UPDATE && !pubdesc.cf_valid_for_update)
+ else if (cmd == CMD_UPDATE && !pubdesc.cols_valid_for_update)
ereport(ERROR,
(errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
errmsg("cannot update table \"%s\"",
RelationGetRelationName(rel)),
- errdetail("Column filter used by the
publication does not cover the replica identity.")));
+ errdetail("Column list used by the publication
does not cover the replica identity.")));
else if (cmd == CMD_DELETE && !pubdesc.rf_valid_for_delete)
ereport(ERROR,
(errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
errmsg("cannot delete from table \"%s\"",
RelationGetRelationName(rel)),
errdetail("Column used in the publication
WHERE expression is not part of the replica identity.")));
- else if (cmd == CMD_DELETE && !pubdesc.cf_valid_for_delete)
+ else if (cmd == CMD_DELETE && !pubdesc.cols_valid_for_delete)
ereport(ERROR,
(errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
errmsg("cannot delete from table \"%s\"",
RelationGetRelationName(rel)),
- errdetail("Column filter used by the
publication does not cover the replica identity.")));
+ errdetail("Column list used by the publication
does not cover the replica identity.")));
/* If relation has replica identity we are always good. */
if (OidIsValid(RelationGetReplicaIndex(rel)))
diff --git a/src/backend/replication/logical/proto.c
b/src/backend/replication/logical/proto.c
index 1e8785ff9a..816d461acd 100644
--- a/src/backend/replication/logical/proto.c
+++ b/src/backend/replication/logical/proto.c
@@ -40,8 +40,12 @@ static void logicalrep_read_tuple(StringInfo in,
LogicalRepTupleData *tuple);
static void logicalrep_write_namespace(StringInfo out, Oid nspid);
static const char *logicalrep_read_namespace(StringInfo in);
-#define ColumnInFilter(columns, attnum) \
- (((columns) == NULL) || (bms_is_member((attnum), (columns))))
+
+static bool
+column_in_set(int attnum, Bitmapset *columns)
+{
+ return (columns == NULL || bms_is_member(attnum, columns));
+}
/*
@@ -774,9 +778,9 @@ logicalrep_write_tuple(StringInfo out, Relation rel,
TupleTableSlot *slot,
if (att->attisdropped || att->attgenerated)
continue;
- /* skip columns not included in the column filter */
- if (!ColumnInFilter(columns, att->attnum))
+ if (!column_in_set(att->attnum, columns))
continue;
+
nliveatts++;
}
pq_sendint16(out, nliveatts);
@@ -795,8 +799,7 @@ logicalrep_write_tuple(StringInfo out, Relation rel,
TupleTableSlot *slot,
if (att->attisdropped || att->attgenerated)
continue;
- /* skip columns not included in the column filter */
- if (!ColumnInFilter(columns, att->attnum))
+ if (!column_in_set(att->attnum, columns))
continue;
if (isnull[i])
@@ -938,8 +941,7 @@ logicalrep_write_attrs(StringInfo out, Relation rel,
Bitmapset *columns)
if (att->attisdropped || att->attgenerated)
continue;
- /* skip columns not included in the column filter */
- if (!ColumnInFilter(columns, att->attnum))
+ if (!column_in_set(att->attnum, columns))
continue;
nliveatts++;
@@ -960,8 +962,7 @@ logicalrep_write_attrs(StringInfo out, Relation rel,
Bitmapset *columns)
if (att->attisdropped || att->attgenerated)
continue;
- /* skip columns not included in the column filter */
- if (!ColumnInFilter(columns, att->attnum))
+ if (!column_in_set(att->attnum, columns))
continue;
/* REPLICA IDENTITY FULL means all columns are sent as part of
key. */
diff --git a/src/backend/replication/logical/tablesync.c
b/src/backend/replication/logical/tablesync.c
index 42708dcf82..d4d504fe02 100644
--- a/src/backend/replication/logical/tablesync.c
+++ b/src/backend/replication/logical/tablesync.c
@@ -754,13 +754,13 @@ fetch_remote_table_info(char *nspname, char *relname,
/*
- * Get relation's column filter expressions.
+ * Get column lists for each relation.
*
- * For initial synchronization, column filter can be ignored in
following
+ * For initial synchronization, column lists can be ignored in following
* cases:
*
* 1) one of the subscribed publications for the table hasn't specified
- * any column filter
+ * any column list
*
* 2) one of the subscribed publications has puballtables set to true
*
@@ -788,7 +788,7 @@ fetch_remote_table_info(char *nspname, char *relname,
/*
* First, check if any of the publications FOR ALL TABLES? If
yes, we
- * should not use any column filter. It's enough to find a
single such
+ * should not use any column list. It's enough to find a single
such
* publication.
*
* XXX Maybe we could combine all three steps into a single
query, but
@@ -823,7 +823,7 @@ fetch_remote_table_info(char *nspname, char *relname,
/*
* If there's no FOR ALL TABLES publication, look for a FOR ALL
TABLES
* IN SCHEMA publication, with schema of the remote relation.
The logic
- * is the same - such publications have no column filters.
+ * is the same - such publications have no column lists.
*
* XXX Does this need any handling of partitions /
publish_via_part_root?
*/
@@ -859,8 +859,8 @@ fetch_remote_table_info(char *nspname, char *relname,
/*
* If we haven't found any FOR ALL TABLES [IN SCHEMA]
publications for
- * the table, we have to look for the column filters set for
relations.
- * First, we check if there's a publication with no column
filter for
+ * the table, we have to look for the column lists for
relations.
+ * First, we check if there's a publication with no column list
for
* the relation - which means all columns need to be replicated.
*/
if (!all_columns)
@@ -906,7 +906,7 @@ fetch_remote_table_info(char *nspname, char *relname,
}
/*
- * All that
+ * All that FIXME
*/
if (!all_columns)
{
diff --git a/src/backend/replication/pgoutput/pgoutput.c
b/src/backend/replication/pgoutput/pgoutput.c
index 07cdfc1d8c..b4203788b0 100644
--- a/src/backend/replication/pgoutput/pgoutput.c
+++ b/src/backend/replication/pgoutput/pgoutput.c
@@ -1936,7 +1936,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation)
if (isnull)
{
/*
- * If we see a
publication with no column filter, it
+ * If we see a
publication with no column list, it
* means we need to
publish all columns, so reset the
* list and ignore
further ones.
*/
diff --git a/src/backend/utils/cache/relcache.c
b/src/backend/utils/cache/relcache.c
index 82e595396e..a2da72f0d4 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -5553,8 +5553,8 @@ RelationBuildPublicationDesc(Relation relation,
PublicationDesc *pubdesc)
memset(pubdesc, 0, sizeof(PublicationDesc));
pubdesc->rf_valid_for_update = true;
pubdesc->rf_valid_for_delete = true;
- pubdesc->cf_valid_for_update = true;
- pubdesc->cf_valid_for_delete = true;
+ pubdesc->cols_valid_for_update = true;
+ pubdesc->cols_valid_for_delete = true;
return;
}
@@ -5567,8 +5567,8 @@ RelationBuildPublicationDesc(Relation relation,
PublicationDesc *pubdesc)
memset(pubdesc, 0, sizeof(PublicationDesc));
pubdesc->rf_valid_for_update = true;
pubdesc->rf_valid_for_delete = true;
- pubdesc->cf_valid_for_update = true;
- pubdesc->cf_valid_for_delete = true;
+ pubdesc->cols_valid_for_update = true;
+ pubdesc->cols_valid_for_delete = true;
/* Fetch the publication membership info. */
puboids = GetRelationPublications(relid);
@@ -5620,7 +5620,7 @@ RelationBuildPublicationDesc(Relation relation,
PublicationDesc *pubdesc)
*/
if (!pubform->puballtables &&
(pubform->pubupdate || pubform->pubdelete) &&
- contain_invalid_rfcolumn(pubid, relation, ancestors,
+ pub_rf_contains_invalid_column(pubid, relation,
ancestors,
pubform->pubviaroot))
{
if (pubform->pubupdate)
@@ -5630,21 +5630,20 @@ RelationBuildPublicationDesc(Relation relation,
PublicationDesc *pubdesc)
}
/*
- * Check if all columns referenced in the column filter are
part of
- * the REPLICA IDENTITY index or not.
+ * Check if all columns are part of the REPLICA IDENTITY index
or not.
*
* If the publication is FOR ALL TABLES then it means the table
has no
- * column filters and we can skip the validation.
+ * column list and we can skip the validation.
*/
if (!pubform->puballtables &&
(pubform->pubupdate || pubform->pubdelete) &&
- contain_invalid_cfcolumn(pubid, relation, ancestors,
+ pub_collist_contains_invalid_column(pubid, relation,
ancestors,
pubform->pubviaroot))
{
if (pubform->pubupdate)
- pubdesc->cf_valid_for_update = false;
+ pubdesc->cols_valid_for_update = false;
if (pubform->pubdelete)
- pubdesc->cf_valid_for_delete = false;
+ pubdesc->cols_valid_for_delete = false;
}
ReleaseSysCache(tup);
@@ -5660,13 +5659,13 @@ RelationBuildPublicationDesc(Relation relation,
PublicationDesc *pubdesc)
break;
/*
- * If we know everything is replicated and the column filter is
invalid
+ * If we know everything is replicated and the column list is
invalid
* for update and delete, there is no point to check for other
* publications.
*/
if (pubdesc->pubactions.pubinsert &&
pubdesc->pubactions.pubupdate &&
pubdesc->pubactions.pubdelete &&
pubdesc->pubactions.pubtruncate &&
- !pubdesc->cf_valid_for_update &&
!pubdesc->cf_valid_for_delete)
+ !pubdesc->cols_valid_for_update &&
!pubdesc->cols_valid_for_delete)
break;
}
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index fb18cb82d9..e462ccfb74 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -2941,7 +2941,7 @@ describeOneTableDetails(const char *schemaname,
printfPQExpBuffer(&buf, " \"%s\"",
PQgetvalue(result, i, 0));
- /* column filter (if any) */
+ /* column list (if any) */
if (!PQgetisnull(result, i, 2))
appendPQExpBuffer(&buf, " (%s)",
PQgetvalue(result, i, 2));
diff --git a/src/include/catalog/pg_publication.h
b/src/include/catalog/pg_publication.h
index b58f85ede2..a06742a620 100644
--- a/src/include/catalog/pg_publication.h
+++ b/src/include/catalog/pg_publication.h
@@ -87,12 +87,11 @@ typedef struct PublicationDesc
bool rf_valid_for_delete;
/*
- * true if the columns referenced in column filters which are used for
UPDATE
- * or DELETE are part of the replica identity or the publication actions
+ * true if the columns are part of the replica identity or the
publication actions
* do not include UPDATE or DELETE.
*/
- bool cf_valid_for_update;
- bool cf_valid_for_delete;
+ bool cols_valid_for_update;
+ bool cols_valid_for_delete;
} PublicationDesc;
typedef struct Publication
diff --git a/src/include/commands/publicationcmds.h
b/src/include/commands/publicationcmds.h
index 08d14ca724..ae87caf089 100644
--- a/src/include/commands/publicationcmds.h
+++ b/src/include/commands/publicationcmds.h
@@ -31,9 +31,9 @@ extern void RemovePublicationSchemaById(Oid psoid);
extern ObjectAddress AlterPublicationOwner(const char *name, Oid newOwnerId);
extern void AlterPublicationOwner_oid(Oid pubid, Oid newOwnerId);
extern void InvalidatePublicationRels(List *relids);
-extern bool contain_invalid_rfcolumn(Oid pubid, Relation relation,
+extern bool pub_rf_contains_invalid_column(Oid pubid, Relation relation,
List
*ancestors, bool pubviaroot);
-extern bool contain_invalid_cfcolumn(Oid pubid, Relation relation,
+extern bool pub_collist_contains_invalid_column(Oid pubid, Relation relation,
List
*ancestors, bool pubviaroot);
#endif /* PUBLICATIONCMDS_H */
diff --git a/src/test/regress/expected/publication.out
b/src/test/regress/expected/publication.out
index 152f19fb42..80202f84ff 100644
--- a/src/test/regress/expected/publication.out
+++ b/src/test/regress/expected/publication.out
@@ -679,14 +679,14 @@ DROP TABLE rf_tbl_abcd_pk;
DROP TABLE rf_tbl_abcd_nopk;
DROP TABLE rf_tbl_abcd_part_pk;
-- ======================================================
--- fail - duplicate tables are not allowed if that table has any column filters
+-- fail - duplicate tables are not allowed if that table has any column lists
SET client_min_messages = 'ERROR';
CREATE PUBLICATION testpub_dups FOR TABLE testpub_tbl1 (a), testpub_tbl1 WITH
(publish = 'insert');
-ERROR: conflicting or redundant column filters for table "testpub_tbl1"
+ERROR: conflicting or redundant column lists for table "testpub_tbl1"
CREATE PUBLICATION testpub_dups FOR TABLE testpub_tbl1, testpub_tbl1 (a) WITH
(publish = 'insert');
-ERROR: conflicting or redundant column filters for table "testpub_tbl1"
+ERROR: conflicting or redundant column lists for table "testpub_tbl1"
RESET client_min_messages;
--- test for column filters
+-- test for column lists
SET client_min_messages = 'ERROR';
CREATE PUBLICATION testpub_fortable FOR TABLE testpub_tbl1;
CREATE PUBLICATION testpub_fortable_insert WITH (publish = 'insert');
@@ -696,16 +696,16 @@ CREATE TABLE testpub_tbl5 (a int PRIMARY KEY, b text, c
text,
-- error: column "x" does not exist
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, x);
ERROR: column "x" of relation "testpub_tbl5" does not exist
--- error: replica identity "a" not included in the column filter
+-- error: replica identity "a" not included in the column list
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (b, c);
UPDATE testpub_tbl5 SET a = 1;
ERROR: cannot update table "testpub_tbl5"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl5;
-- error: generated column "d" can't be in list
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, d);
ERROR: cannot reference generated column "d" in publication column list
--- error: system attributes "ctid" not allowed in column filter
+-- error: system attributes "ctid" not allowed in column list
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, ctid);
ERROR: cannot reference system column "ctid" in publication column list
-- ok
@@ -713,24 +713,24 @@ ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5
(a, c);
ALTER TABLE testpub_tbl5 DROP COLUMN c; -- no dice
ERROR: cannot drop column "c" because it is part of publication
"testpub_fortable"
HINT: Specify CASCADE or use ALTER PUBLICATION to remove the column from the
publication.
--- ok: for insert-only publication, the filter is arbitrary
+-- ok: for insert-only publication, the column list is arbitrary
ALTER PUBLICATION testpub_fortable_insert ADD TABLE testpub_tbl5 (b, c);
/* not all replica identities are good enough */
CREATE UNIQUE INDEX testpub_tbl5_b_key ON testpub_tbl5 (b, c);
ALTER TABLE testpub_tbl5 ALTER b SET NOT NULL, ALTER c SET NOT NULL;
ALTER TABLE testpub_tbl5 REPLICA IDENTITY USING INDEX testpub_tbl5_b_key;
--- error: replica identity (b,c) is covered by column filter (a, c)
+-- error: replica identity (b,c) is covered by column list (a, c)
UPDATE testpub_tbl5 SET a = 1;
ERROR: cannot update table "testpub_tbl5"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl5;
--- error: change the replica identity to "b", and then filter (a, c) fails
+-- error: change the replica identity to "b", and then column list (a, c) fails
ALTER TABLE testpub_tbl5 REPLICA IDENTITY USING INDEX testpub_tbl5_b_key;
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, c);
--- error: replica identity (b,c) is not covered by column filter (a,c)
+-- error: replica identity (b,c) is not covered by column list (a, c)
UPDATE testpub_tbl5 SET a = 1;
ERROR: cannot update table "testpub_tbl5"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
/* But if upd/del are not published, it works OK */
SET client_min_messages = 'ERROR';
CREATE PUBLICATION testpub_table_ins WITH (publish = 'insert, truncate');
@@ -744,21 +744,21 @@ ALTER PUBLICATION testpub_table_ins ADD TABLE
testpub_tbl5 (a); -- ok
Tables:
"public.testpub_tbl5" (a)
--- with REPLICA IDENTITY FULL, column filters are not allowed
+-- with REPLICA IDENTITY FULL, column lists are not allowed
CREATE TABLE testpub_tbl6 (a int, b text, c text);
ALTER TABLE testpub_tbl6 REPLICA IDENTITY FULL;
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl6 (a, b, c);
UPDATE testpub_tbl6 SET a = 1;
ERROR: cannot update table "testpub_tbl6"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl6;
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl6; -- ok
UPDATE testpub_tbl6 SET a = 1;
ALTER PUBLICATION testpub_fortable ALTER TABLE testpub_tbl6 SET COLUMNS (a, b,
c);
UPDATE testpub_tbl6 SET a = 1;
ERROR: cannot update table "testpub_tbl6"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
--- make sure changing the column filter is updated in SET TABLE
+DETAIL: Column list used by the publication does not cover the replica
identity.
+-- make sure changing the column list is updated in SET TABLE
CREATE TABLE testpub_tbl7 (a int primary key, b text, c text);
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl7 (a, b);
\d+ testpub_tbl7
@@ -787,7 +787,7 @@ Indexes:
Publications:
"testpub_fortable" (a, b)
--- ok: update the column filter
+-- ok: update the column list
ALTER PUBLICATION testpub_fortable SET TABLE testpub_tbl7 (a, c);
\d+ testpub_tbl7
Table "public.testpub_tbl7"
@@ -801,7 +801,7 @@ Indexes:
Publications:
"testpub_fortable" (a, c)
--- column filter for partitioned tables has to cover replica identities for
+-- column list for partitioned tables has to cover replica identities for
-- all child relations
CREATE TABLE testpub_tbl8 (a int, b text, c text) PARTITION BY HASH (a);
-- first partition has replica identity "a"
@@ -812,48 +812,48 @@ ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY USING INDEX
testpub_tbl8_0_pkey;
CREATE TABLE testpub_tbl8_1 PARTITION OF testpub_tbl8 FOR VALUES WITH (modulus
2, remainder 1);
ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (b);
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey;
--- ok: column filter covers both "a" and "b"
+-- ok: column list covers both "a" and "b"
SET client_min_messages = 'ERROR';
-CREATE PUBLICATION testpub_col_filter FOR TABLE testpub_tbl8 (a, b) WITH
(publish_via_partition_root = 'true');
+CREATE PUBLICATION testpub_col_list FOR TABLE testpub_tbl8 (a, b) WITH
(publish_via_partition_root = 'true');
RESET client_min_messages;
-- ok: the same thing, but try plain ADD TABLE
-ALTER PUBLICATION testpub_col_filter DROP TABLE testpub_tbl8;
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, b);
+ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8;
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b);
UPDATE testpub_tbl8 SET a = 1;
--- failure: column filter does not cover replica identity for the second
partition
-ALTER PUBLICATION testpub_col_filter DROP TABLE testpub_tbl8;
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, c);
+-- failure: column list does not cover replica identity for the second
partition
+ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8;
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, c);
UPDATE testpub_tbl8 SET a = 1;
ERROR: cannot update table "testpub_tbl8_1"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
-ALTER PUBLICATION testpub_col_filter DROP TABLE testpub_tbl8;
+DETAIL: Column list used by the publication does not cover the replica
identity.
+ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8;
-- failure: one of the partitions has REPLICA IDENTITY FULL
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY FULL;
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, c);
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, c);
UPDATE testpub_tbl8 SET a = 1;
ERROR: cannot update table "testpub_tbl8_1"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
-ALTER PUBLICATION testpub_col_filter DROP TABLE testpub_tbl8;
+DETAIL: Column list used by the publication does not cover the replica
identity.
+ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8;
-- add table and then try changing replica identity
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey;
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, b);
--- failure: replica identity full can't be used with a column filter
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b);
+-- failure: replica identity full can't be used with a column list
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY FULL;
UPDATE testpub_tbl8 SET a = 1;
ERROR: cannot update table "testpub_tbl8_1"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
--- failure: replica identity has to be covered by the column filter
+DETAIL: Column list used by the publication does not cover the replica
identity.
+-- failure: replica identity has to be covered by the column list
ALTER TABLE testpub_tbl8_1 DROP CONSTRAINT testpub_tbl8_1_pkey;
ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (c);
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey;
UPDATE testpub_tbl8 SET a = 1;
ERROR: cannot update table "testpub_tbl8_1"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
DROP TABLE testpub_tbl8;
--- column filter for partitioned tables has to cover replica identities for
+-- column list for partitioned tables has to cover replica identities for
-- all child relations
CREATE TABLE testpub_tbl8 (a int, b text, c text) PARTITION BY HASH (a);
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, b);
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b);
-- first partition has replica identity "a"
CREATE TABLE testpub_tbl8_0 (a int, b text, c text);
ALTER TABLE testpub_tbl8_0 ADD PRIMARY KEY (a);
@@ -862,23 +862,23 @@ ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY USING INDEX
testpub_tbl8_0_pkey;
CREATE TABLE testpub_tbl8_1 (a int, b text, c text);
ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (c);
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey;
--- ok: attaching first partition works, because (a) is in column filter
+-- ok: attaching first partition works, because (a) is in column list
ALTER TABLE testpub_tbl8 ATTACH PARTITION testpub_tbl8_0 FOR VALUES WITH
(modulus 2, remainder 0);
--- failure: second partition has replica identity (c), which si not in column
filter
+-- failure: second partition has replica identity (c), which si not in column
list
ALTER TABLE testpub_tbl8 ATTACH PARTITION testpub_tbl8_1 FOR VALUES WITH
(modulus 2, remainder 1);
UPDATE testpub_tbl8 SET a = 1;
ERROR: cannot update table "testpub_tbl8_1"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
-- failure: changing replica identity to FULL for partition fails, because
--- of the column filter on the parent
+-- of the column list on the parent
ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY FULL;
UPDATE testpub_tbl8 SET a = 1;
ERROR: cannot update table "testpub_tbl8_0"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
DROP TABLE testpub_tbl5, testpub_tbl6, testpub_tbl7, testpub_tbl8,
testpub_tbl8_1;
-DROP PUBLICATION testpub_table_ins, testpub_fortable, testpub_fortable_insert,
testpub_col_filter;
+DROP PUBLICATION testpub_table_ins, testpub_fortable, testpub_fortable_insert,
testpub_col_list;
-- ======================================================
--- Test combination of column and row filter
+-- Test combination of column list and row filter
SET client_min_messages = 'ERROR';
CREATE PUBLICATION testpub_both_filters;
RESET client_min_messages;
@@ -908,7 +908,7 @@ Publications:
DROP TABLE testpub_tbl_both_filters;
DROP PUBLICATION testpub_both_filters;
-- ======================================================
--- More column filter tests for validating column references
+-- More column list tests for validating column references
CREATE TABLE rf_tbl_abcd_nopk(a int, b int, c int, d int);
CREATE TABLE rf_tbl_abcd_pk(a int, b int, c int, d int, PRIMARY KEY(a,b));
CREATE TABLE rf_tbl_abcd_part_pk (a int PRIMARY KEY, b int) PARTITION by RANGE
(a);
@@ -925,18 +925,18 @@ ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a,
b, c);
-- ok - (a,b,c) coverts all PK cols
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a);
--- fail - "b" is missing from the column filter
+-- fail - "b" is missing from the column list
UPDATE rf_tbl_abcd_pk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_pk"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (b);
--- fail - "a" is missing from the column filter
+-- fail - "a" is missing from the column list
UPDATE rf_tbl_abcd_pk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_pk"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
-- 1b. REPLICA IDENTITY is DEFAULT and table has no PK
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a);
--- ok - there's no replica identity, so any column filter works
+-- ok - there's no replica identity, so any column list works
-- note: it fails anyway, just a bit later because UPDATE requires RI
UPDATE rf_tbl_abcd_nopk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_nopk" because it does not have a
replica identity and publishes updates
@@ -945,32 +945,32 @@ HINT: To enable updating the table, set REPLICA IDENTITY
using ALTER TABLE.
ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY FULL;
ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY FULL;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (c);
--- fail - with REPLICA IDENTITY FULL no column filter is allowed
+-- fail - with REPLICA IDENTITY FULL no column list is allowed
UPDATE rf_tbl_abcd_pk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_pk"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a, b, c, d);
--- fail - with REPLICA IDENTITY FULL no column filter is allowed
+-- fail - with REPLICA IDENTITY FULL no column list is allowed
UPDATE rf_tbl_abcd_nopk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_nopk"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
-- Case 3. REPLICA IDENTITY NOTHING
ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY NOTHING;
ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY NOTHING;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a);
--- ok - REPLICA IDENTITY NOTHING means all column filters are valid
+-- ok - REPLICA IDENTITY NOTHING means all column lists are valid
-- it still fails later because without RI we can't replicate updates
UPDATE rf_tbl_abcd_pk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_pk" because it does not have a
replica identity and publishes updates
HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE.
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a, b, c, d);
--- ok - REPLICA IDENTITY NOTHING means all column filters are valid
+-- ok - REPLICA IDENTITY NOTHING means all column lists are valid
-- it still fails later because without RI we can't replicate updates
UPDATE rf_tbl_abcd_pk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_pk" because it does not have a
replica identity and publishes updates
HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE.
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (d);
--- ok - REPLICA IDENTITY NOTHING means all column filters are valid
+-- ok - REPLICA IDENTITY NOTHING means all column lists are valid
-- it still fails later because without RI we can't replicate updates
UPDATE rf_tbl_abcd_nopk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_nopk" because it does not have a
replica identity and publishes updates
@@ -983,20 +983,20 @@ ALTER TABLE rf_tbl_abcd_nopk ALTER COLUMN c SET NOT NULL;
CREATE UNIQUE INDEX idx_abcd_nopk_c ON rf_tbl_abcd_nopk(c);
ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY USING INDEX idx_abcd_nopk_c;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a);
--- fail - column filter "a" does not cover the REPLICA IDENTITY INDEX on "c"
+-- fail - column list "a" does not cover the REPLICA IDENTITY INDEX on "c"
UPDATE rf_tbl_abcd_pk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_pk"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (c);
--- ok - column filter "c" does cover the REPLICA IDENTITY INDEX on "c"
+-- ok - column list "c" does cover the REPLICA IDENTITY INDEX on "c"
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a);
--- fail - column filter "a" does not cover the REPLICA IDENTITY INDEX on "c"
+-- fail - column list "a" does not cover the REPLICA IDENTITY INDEX on "c"
UPDATE rf_tbl_abcd_nopk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_nopk"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (c);
--- ok - column filter "c" does cover the REPLICA IDENTITY INDEX on "c"
+-- ok - column list "c" does cover the REPLICA IDENTITY INDEX on "c"
UPDATE rf_tbl_abcd_nopk SET a = 1;
-- Tests for partitioned table
-- set PUBLISH_VIA_PARTITION_ROOT to false and test row filter for partitioned
@@ -1021,7 +1021,7 @@ UPDATE rf_tbl_abcd_part_pk SET a = 1;
-- used for partitioned table
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 filter for a partitioned table
"rf_tbl_abcd_part_pk" which is not allowed when publish_via_partition_root is
false.
+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.
-- 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 (b);
@@ -1030,7 +1030,7 @@ ALTER PUBLICATION testpub6 SET
(PUBLISH_VIA_PARTITION_ROOT=0);
-- fail - "b" is not in REPLICA IDENTITY INDEX
UPDATE rf_tbl_abcd_part_pk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_part_pk_1"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
-- set PUBLISH_VIA_PARTITION_ROOT to true
-- can use row filter for partitioned table
ALTER PUBLICATION testpub6 SET (PUBLISH_VIA_PARTITION_ROOT=1);
@@ -1039,7 +1039,7 @@ ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_part_pk
(b);
-- fail - "b" is not in REPLICA IDENTITY INDEX
UPDATE rf_tbl_abcd_part_pk SET a = 1;
ERROR: cannot update table "rf_tbl_abcd_part_pk_1"
-DETAIL: Column filter used by the publication does not cover the replica
identity.
+DETAIL: Column list used by the publication does not cover the replica
identity.
DROP PUBLICATION testpub6;
DROP TABLE rf_tbl_abcd_pk;
DROP TABLE rf_tbl_abcd_nopk;
diff --git a/src/test/regress/sql/publication.sql
b/src/test/regress/sql/publication.sql
index 2203dc238d..32a810b2d2 100644
--- a/src/test/regress/sql/publication.sql
+++ b/src/test/regress/sql/publication.sql
@@ -381,13 +381,13 @@ CREATE UNIQUE INDEX idx_abcd_nopk_c ON
rf_tbl_abcd_nopk(c);
DROP TABLE rf_tbl_abcd_part_pk;
-- ======================================================
--- fail - duplicate tables are not allowed if that table has any column filters
+-- fail - duplicate tables are not allowed if that table has any column lists
SET client_min_messages = 'ERROR';
CREATE PUBLICATION testpub_dups FOR TABLE testpub_tbl1 (a), testpub_tbl1 WITH
(publish = 'insert');
CREATE PUBLICATION testpub_dups FOR TABLE testpub_tbl1, testpub_tbl1 (a) WITH
(publish = 'insert');
RESET client_min_messages;
--- test for column filters
+-- test for column lists
SET client_min_messages = 'ERROR';
CREATE PUBLICATION testpub_fortable FOR TABLE testpub_tbl1;
CREATE PUBLICATION testpub_fortable_insert WITH (publish = 'insert');
@@ -396,32 +396,32 @@ CREATE TABLE testpub_tbl5 (a int PRIMARY KEY, b text, c
text,
d int generated always as (a + length(b)) stored);
-- error: column "x" does not exist
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, x);
--- error: replica identity "a" not included in the column filter
+-- error: replica identity "a" not included in the column list
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (b, c);
UPDATE testpub_tbl5 SET a = 1;
ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl5;
-- error: generated column "d" can't be in list
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, d);
--- error: system attributes "ctid" not allowed in column filter
+-- error: system attributes "ctid" not allowed in column list
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, ctid);
-- ok
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, c);
ALTER TABLE testpub_tbl5 DROP COLUMN c; -- no dice
--- ok: for insert-only publication, the filter is arbitrary
+-- ok: for insert-only publication, the column list is arbitrary
ALTER PUBLICATION testpub_fortable_insert ADD TABLE testpub_tbl5 (b, c);
/* not all replica identities are good enough */
CREATE UNIQUE INDEX testpub_tbl5_b_key ON testpub_tbl5 (b, c);
ALTER TABLE testpub_tbl5 ALTER b SET NOT NULL, ALTER c SET NOT NULL;
ALTER TABLE testpub_tbl5 REPLICA IDENTITY USING INDEX testpub_tbl5_b_key;
--- error: replica identity (b,c) is covered by column filter (a, c)
+-- error: replica identity (b,c) is covered by column list (a, c)
UPDATE testpub_tbl5 SET a = 1;
ALTER PUBLICATION testpub_fortable DROP TABLE testpub_tbl5;
--- error: change the replica identity to "b", and then filter (a, c) fails
+-- error: change the replica identity to "b", and then column list (a, c) fails
ALTER TABLE testpub_tbl5 REPLICA IDENTITY USING INDEX testpub_tbl5_b_key;
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5 (a, c);
--- error: replica identity (b,c) is not covered by column filter (a,c)
+-- error: replica identity (b,c) is not covered by column list (a, c)
UPDATE testpub_tbl5 SET a = 1;
/* But if upd/del are not published, it works OK */
@@ -431,7 +431,7 @@ CREATE PUBLICATION testpub_table_ins WITH (publish =
'insert, truncate');
ALTER PUBLICATION testpub_table_ins ADD TABLE testpub_tbl5 (a);
-- ok
\dRp+ testpub_table_ins
--- with REPLICA IDENTITY FULL, column filters are not allowed
+-- with REPLICA IDENTITY FULL, column lists are not allowed
CREATE TABLE testpub_tbl6 (a int, b text, c text);
ALTER TABLE testpub_tbl6 REPLICA IDENTITY FULL;
@@ -445,18 +445,18 @@ CREATE TABLE testpub_tbl6 (a int, b text, c text);
ALTER PUBLICATION testpub_fortable ALTER TABLE testpub_tbl6 SET COLUMNS (a, b,
c);
UPDATE testpub_tbl6 SET a = 1;
--- make sure changing the column filter is updated in SET TABLE
+-- make sure changing the column list is updated in SET TABLE
CREATE TABLE testpub_tbl7 (a int primary key, b text, c text);
ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl7 (a, b);
\d+ testpub_tbl7
-- ok: we'll skip this table
ALTER PUBLICATION testpub_fortable SET TABLE testpub_tbl7 (a, b);
\d+ testpub_tbl7
--- ok: update the column filter
+-- ok: update the column list
ALTER PUBLICATION testpub_fortable SET TABLE testpub_tbl7 (a, c);
\d+ testpub_tbl7
--- column filter for partitioned tables has to cover replica identities for
+-- column list for partitioned tables has to cover replica identities for
-- all child relations
CREATE TABLE testpub_tbl8 (a int, b text, c text) PARTITION BY HASH (a);
-- first partition has replica identity "a"
@@ -468,37 +468,37 @@ CREATE TABLE testpub_tbl8_1 PARTITION OF testpub_tbl8 FOR
VALUES WITH (modulus 2
ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (b);
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey;
--- ok: column filter covers both "a" and "b"
+-- ok: column list covers both "a" and "b"
SET client_min_messages = 'ERROR';
-CREATE PUBLICATION testpub_col_filter FOR TABLE testpub_tbl8 (a, b) WITH
(publish_via_partition_root = 'true');
+CREATE PUBLICATION testpub_col_list FOR TABLE testpub_tbl8 (a, b) WITH
(publish_via_partition_root = 'true');
RESET client_min_messages;
-- ok: the same thing, but try plain ADD TABLE
-ALTER PUBLICATION testpub_col_filter DROP TABLE testpub_tbl8;
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, b);
+ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8;
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b);
UPDATE testpub_tbl8 SET a = 1;
--- failure: column filter does not cover replica identity for the second
partition
-ALTER PUBLICATION testpub_col_filter DROP TABLE testpub_tbl8;
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, c);
+-- failure: column list does not cover replica identity for the second
partition
+ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8;
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, c);
UPDATE testpub_tbl8 SET a = 1;
-ALTER PUBLICATION testpub_col_filter DROP TABLE testpub_tbl8;
+ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8;
-- failure: one of the partitions has REPLICA IDENTITY FULL
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY FULL;
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, c);
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, c);
UPDATE testpub_tbl8 SET a = 1;
-ALTER PUBLICATION testpub_col_filter DROP TABLE testpub_tbl8;
+ALTER PUBLICATION testpub_col_list DROP TABLE testpub_tbl8;
-- add table and then try changing replica identity
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey;
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, b);
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b);
--- failure: replica identity full can't be used with a column filter
+-- failure: replica identity full can't be used with a column list
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY FULL;
UPDATE testpub_tbl8 SET a = 1;
--- failure: replica identity has to be covered by the column filter
+-- failure: replica identity has to be covered by the column list
ALTER TABLE testpub_tbl8_1 DROP CONSTRAINT testpub_tbl8_1_pkey;
ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (c);
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey;
@@ -506,10 +506,10 @@ CREATE PUBLICATION testpub_col_filter FOR TABLE
testpub_tbl8 (a, b) WITH (publis
DROP TABLE testpub_tbl8;
--- column filter for partitioned tables has to cover replica identities for
+-- column list for partitioned tables has to cover replica identities for
-- all child relations
CREATE TABLE testpub_tbl8 (a int, b text, c text) PARTITION BY HASH (a);
-ALTER PUBLICATION testpub_col_filter ADD TABLE testpub_tbl8 (a, b);
+ALTER PUBLICATION testpub_col_list ADD TABLE testpub_tbl8 (a, b);
-- first partition has replica identity "a"
CREATE TABLE testpub_tbl8_0 (a int, b text, c text);
ALTER TABLE testpub_tbl8_0 ADD PRIMARY KEY (a);
@@ -519,22 +519,22 @@ CREATE TABLE testpub_tbl8_1 (a int, b text, c text);
ALTER TABLE testpub_tbl8_1 ADD PRIMARY KEY (c);
ALTER TABLE testpub_tbl8_1 REPLICA IDENTITY USING INDEX testpub_tbl8_1_pkey;
--- ok: attaching first partition works, because (a) is in column filter
+-- ok: attaching first partition works, because (a) is in column list
ALTER TABLE testpub_tbl8 ATTACH PARTITION testpub_tbl8_0 FOR VALUES WITH
(modulus 2, remainder 0);
--- failure: second partition has replica identity (c), which si not in column
filter
+-- failure: second partition has replica identity (c), which si not in column
list
ALTER TABLE testpub_tbl8 ATTACH PARTITION testpub_tbl8_1 FOR VALUES WITH
(modulus 2, remainder 1);
UPDATE testpub_tbl8 SET a = 1;
-- failure: changing replica identity to FULL for partition fails, because
--- of the column filter on the parent
+-- of the column list on the parent
ALTER TABLE testpub_tbl8_0 REPLICA IDENTITY FULL;
UPDATE testpub_tbl8 SET a = 1;
DROP TABLE testpub_tbl5, testpub_tbl6, testpub_tbl7, testpub_tbl8,
testpub_tbl8_1;
-DROP PUBLICATION testpub_table_ins, testpub_fortable, testpub_fortable_insert,
testpub_col_filter;
+DROP PUBLICATION testpub_table_ins, testpub_fortable, testpub_fortable_insert,
testpub_col_list;
-- ======================================================
--- Test combination of column and row filter
+-- Test combination of column list and row filter
SET client_min_messages = 'ERROR';
CREATE PUBLICATION testpub_both_filters;
RESET client_min_messages;
@@ -548,7 +548,7 @@ CREATE TABLE testpub_tbl_both_filters (a int, b int, c int,
PRIMARY KEY (a,c));
DROP PUBLICATION testpub_both_filters;
-- ======================================================
--- More column filter tests for validating column references
+-- More column list tests for validating column references
CREATE TABLE rf_tbl_abcd_nopk(a int, b int, c int, d int);
CREATE TABLE rf_tbl_abcd_pk(a int, b int, c int, d int, PRIMARY KEY(a,b));
CREATE TABLE rf_tbl_abcd_part_pk (a int PRIMARY KEY, b int) PARTITION by RANGE
(a);
@@ -567,15 +567,15 @@ CREATE PUBLICATION testpub6 FOR TABLE rf_tbl_abcd_pk (a,
b);
-- ok - (a,b,c) coverts all PK cols
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a);
--- fail - "b" is missing from the column filter
+-- fail - "b" is missing from the column list
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (b);
--- fail - "a" is missing from the column filter
+-- fail - "a" is missing from the column list
UPDATE rf_tbl_abcd_pk SET a = 1;
-- 1b. REPLICA IDENTITY is DEFAULT and table has no PK
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a);
--- ok - there's no replica identity, so any column filter works
+-- ok - there's no replica identity, so any column list works
-- note: it fails anyway, just a bit later because UPDATE requires RI
UPDATE rf_tbl_abcd_nopk SET a = 1;
@@ -583,25 +583,25 @@ CREATE PUBLICATION testpub6 FOR TABLE rf_tbl_abcd_pk (a,
b);
ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY FULL;
ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY FULL;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (c);
--- fail - with REPLICA IDENTITY FULL no column filter is allowed
+-- fail - with REPLICA IDENTITY FULL no column list is allowed
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a, b, c, d);
--- fail - with REPLICA IDENTITY FULL no column filter is allowed
+-- fail - with REPLICA IDENTITY FULL no column list is allowed
UPDATE rf_tbl_abcd_nopk SET a = 1;
-- Case 3. REPLICA IDENTITY NOTHING
ALTER TABLE rf_tbl_abcd_pk REPLICA IDENTITY NOTHING;
ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY NOTHING;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a);
--- ok - REPLICA IDENTITY NOTHING means all column filters are valid
+-- ok - REPLICA IDENTITY NOTHING means all column lists are valid
-- it still fails later because without RI we can't replicate updates
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a, b, c, d);
--- ok - REPLICA IDENTITY NOTHING means all column filters are valid
+-- ok - REPLICA IDENTITY NOTHING means all column lists are valid
-- it still fails later because without RI we can't replicate updates
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (d);
--- ok - REPLICA IDENTITY NOTHING means all column filters are valid
+-- ok - REPLICA IDENTITY NOTHING means all column lists are valid
-- it still fails later because without RI we can't replicate updates
UPDATE rf_tbl_abcd_nopk SET a = 1;
@@ -613,16 +613,16 @@ CREATE UNIQUE INDEX idx_abcd_pk_c ON rf_tbl_abcd_pk(c);
CREATE UNIQUE INDEX idx_abcd_nopk_c ON rf_tbl_abcd_nopk(c);
ALTER TABLE rf_tbl_abcd_nopk REPLICA IDENTITY USING INDEX idx_abcd_nopk_c;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a);
--- fail - column filter "a" does not cover the REPLICA IDENTITY INDEX on "c"
+-- fail - column list "a" does not cover the REPLICA IDENTITY INDEX on "c"
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (c);
--- ok - column filter "c" does cover the REPLICA IDENTITY INDEX on "c"
+-- ok - column list "c" does cover the REPLICA IDENTITY INDEX on "c"
UPDATE rf_tbl_abcd_pk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (a);
--- fail - column filter "a" does not cover the REPLICA IDENTITY INDEX on "c"
+-- fail - column list "a" does not cover the REPLICA IDENTITY INDEX on "c"
UPDATE rf_tbl_abcd_nopk SET a = 1;
ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_nopk (c);
--- ok - column filter "c" does cover the REPLICA IDENTITY INDEX on "c"
+-- ok - column list "c" does cover the REPLICA IDENTITY INDEX on "c"
UPDATE rf_tbl_abcd_nopk SET a = 1;
-- Tests for partitioned table
diff --git a/src/test/subscription/t/029_column_list.pl
b/src/test/subscription/t/029_column_list.pl
index ec2c8a789a..e5ab5d5731 100644
--- a/src/test/subscription/t/029_column_list.pl
+++ b/src/test/subscription/t/029_column_list.pl
@@ -5,7 +5,7 @@
use warnings;
use PostgreSQL::Test::Cluster;
use PostgreSQL::Test::Utils;
-use Test::More tests => 26;
+use Test::More;
# setup
@@ -290,8 +290,8 @@ sub wait_for_subscription_sync
2|22|2222),
'overlapping publications with overlapping column lists');
-# and finally, set the column filter to ALL for one of the publications,
-# which means replicating all columns (removing the column filter), but
+# and finally, set the column list to ALL for one of the publications,
+# which means replicating all columns (removing the column list), but
# first add the missing column to the table on subscriber
$node_publisher->safe_psql('postgres', qq(
ALTER PUBLICATION pub3 ALTER TABLE tab5 SET COLUMNS ALL;
@@ -314,9 +314,9 @@ sub wait_for_subscription_sync
3|33|3333|333),
'overlapping publications with overlapping column lists');
-# TEST: create a table with a column filter, then change the replica
+# TEST: create a table with a column list, then change the replica
# identity by replacing a primary key (but use a different column in
-# the column filter)
+# the column list)
$node_publisher->safe_psql('postgres', qq(
CREATE TABLE tab6 (a int PRIMARY KEY, b int, c int, d int);
CREATE PUBLICATION pub4 FOR TABLE tab6 (a, b);
@@ -377,9 +377,9 @@ sub wait_for_subscription_sync
'replication with the modified primary key');
-# TEST: create a table with a column filter, then change the replica
+# TEST: create a table with a column list, then change the replica
# identity by replacing a primary key with a key on multiple columns
-# (all of them covered by the column filter)
+# (all of them covered by the column list)
$node_publisher->safe_psql('postgres', qq(
CREATE TABLE tab7 (a int PRIMARY KEY, b int, c int, d int);
CREATE PUBLICATION pub5 FOR TABLE tab7 (a, b);
@@ -425,7 +425,7 @@ sub wait_for_subscription_sync
'replication with the modified primary key');
# now switch the primary key again to another columns not covered by the
-# column filter, but also generate writes between the drop and creation
+# column list, but also generate writes between the drop and creation
# of the new constraint
$node_publisher->safe_psql('postgres', qq(
@@ -450,11 +450,11 @@ sub wait_for_subscription_sync
# TEST: partitioned tables (with publish_via_partition_root = false)
# and replica identity. The (leaf) partitions may have different RI, so
-# we need to check the partition RI (with respect to the column filter)
+# we need to check the partition RI (with respect to the column list)
# while attaching the partition.
# First, let's create a partitioned table with two partitions, each with
-# a different RI, but a column filter not covering all those RI.
+# a different RI, but a column list not covering all those RI.
$node_publisher->safe_psql('postgres', qq(
CREATE TABLE test_part_a (a int, b int, c int) PARTITION BY LIST (a);
@@ -508,8 +508,8 @@ sub wait_for_subscription_sync
2|4),
'partitions with different replica identities not replicated correctly');
-# This time start with a column filter covering RI for all partitions, but
-# then update the column filter to not cover column "b" (needed by the
+# This time start with a column list covering RI for all partitions, but
+# then update the column list to not cover column "b" (needed by the
# second partition)
$node_publisher->safe_psql('postgres', qq(
@@ -563,9 +563,9 @@ sub wait_for_subscription_sync
'partitions with different replica identities not replicated correctly');
-# TEST: This time start with a column filter covering RI for all partitions,
+# TEST: This time start with a column list covering RI for all partitions,
# but then update RI for one of the partitions to not be covered by the
-# column filter anymore.
+# column list anymore.
$node_publisher->safe_psql('postgres', qq(
CREATE TABLE test_part_c (a int, b int, c int) PARTITION BY LIST (a);
@@ -594,7 +594,7 @@ sub wait_for_subscription_sync
# create a publication replicating data through partition root, with a column
# filter on the root, and then add the partitions one by one with separate
-# column filters (but those are not applied)
+# column lists (but those are not applied)
$node_publisher->safe_psql('postgres', qq(
CREATE PUBLICATION pub8 FOR TABLE test_part_c WITH
(publish_via_partition_root = false);
ALTER PUBLICATION pub8 ADD TABLE test_part_c_1 (a,c);
@@ -623,8 +623,8 @@ sub wait_for_subscription_sync
# create a publication not replicating data through partition root, without
-# a column filter on the root, and then add the partitions one by one with
-# separate column filters
+# a column list on the root, and then add the partitions one by one with
+# separate column lists
$node_publisher->safe_psql('postgres', qq(
DROP PUBLICATION pub8;
CREATE PUBLICATION pub8 FOR TABLE test_part_c WITH
(publish_via_partition_root = false);
@@ -703,7 +703,7 @@ sub wait_for_subscription_sync
'partitions with different replica identities not replicated correctly');
# TEST: With a table included in multiple publications, we should use a
-# union of the column filters. So with column filters (a,b) and (a,c) we
+# union of the column lists. So with column lists (a,b) and (a,c) we
# should replicate (a,b,c).
$node_publisher->safe_psql('postgres', qq(
@@ -727,11 +727,11 @@ sub wait_for_subscription_sync
is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_mix_1"),
qq(1|2|3),
- 'a mix of publications should use a union of column filter');
+ 'a mix of publications should use a union of column list');
# TEST: With a table included in multiple publications, we should use a
-# union of the column filters. If any of the publications is FOR ALL
+# union of the column lists. If any of the publications is FOR ALL
# TABLES, we should replicate all columns.
# drop unnecessary tables, so as not to interfere with the FOR ALL TABLES
@@ -762,11 +762,11 @@ sub wait_for_subscription_sync
is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_mix_2"),
qq(1|2|3),
- 'a mix of publications should use a union of column filter');
+ 'a mix of publications should use a union of column list');
# TEST: With a table included in multiple publications, we should use a
-# union of the column filters. If any of the publications is FOR ALL
+# union of the column lists. If any of the publications is FOR ALL
# TABLES IN SCHEMA, we should replicate all columns.
$node_publisher->safe_psql('postgres', qq(
@@ -790,11 +790,11 @@ sub wait_for_subscription_sync
is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_mix_3"),
qq(1|2|3),
- 'a mix of publications should use a union of column filter');
+ 'a mix of publications should use a union of column list');
# TEST: Check handling of publish_via_partition_root - if a partition is
-# published through partition root, we should only apply the column filter
+# published through partition root, we should only apply the column list
# defined for the whole table (not the partitions) - both during the initial
# sync and when replicating changes. This is what we do for row filters.
@@ -828,7 +828,7 @@ sub wait_for_subscription_sync
is($node_subscriber->safe_psql('postgres',"SELECT * FROM test_root ORDER BY a,
b, c"),
qq(1||
10||),
- 'publication via partition root applies column filter');
+ 'publication via partition root applies column list');
$node_subscriber->stop('fast');
$node_publisher->stop('fast');
--
2.35.1