Re: Skipping schema changes in publication

Amit Kapila <amit.kapila16@gmail.com>

From: Amit Kapila <amit.kapila16@gmail.com>
To: vignesh C <vignesh21@gmail.com>
Cc: Andrei Lepikhov <lepihov@gmail.com>, shveta malik <shveta.malik@gmail.com>, Shlok Kyal <shlok.kyal.oss@gmail.com>, Nisha Moond <nisha.moond412@gmail.com>, Ashutosh Sharma <ashu.coek88@gmail.com>, "David G. Johnston" <david.g.johnston@gmail.com>, Dilip Kumar <dilipbalaut@gmail.com>, Peter Smith <smithpb2250@gmail.com>, "Zhijie Hou (Fujitsu)" <houzj.fnst@fujitsu.com>, YeXiu <1518981153@qq.com>, Ian Lawrence Barwick <barwick@gmail.com>, Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2026-03-10T04:54:48Z
Lists: pgsql-hackers
On Mon, Mar 9, 2026 at 4:23 PM vignesh C <vignesh21@gmail.com> wrote:
>
> This is addressed in the v60 version patch attached.
> Also Nisha's comments from [1] and Shveta's comments from [2] are
> handled in the v60 version.
>

*
+ /* Check that user is allowed to manipulate the publication. */
+ if (excepttables && !pubform->puballtables)
+ ereport(ERROR,
+ errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("publication \"%s\" is not defined as FOR ALL TABLES",
+    NameStr(pubform->pubname)),
+ errdetail("Except tables cannot be added to or dropped from
publications that are not defined as FOR ALL TABLES."));
+
+ /*
+ * SET ALL TABLES is allowed only for publications defined as FOR ALL
+ * TABLES.
+ */
+ if (stmt->action == AP_SetObjects && !pubform->puballtables &&
+ !tables && !excepttables && !schemaidlist)
+ ereport(ERROR,
+ errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
+ errmsg("publication \"%s\" is not defined as FOR ALL TABLES",
+    NameStr(pubform->pubname)));
+
+ /* Only a superuser can add or remove EXCEPT tables */
+ if (stmt->action == AP_SetObjects &&
+ (excepttables || (!tables && !excepttables && !schemaidlist)) &&
+ !superuser())
+ ereport(ERROR,
+ errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ errmsg("must be superuser to add or drop except tables"));

All the above checks are trying to drive the answer to whether the new
Alter statement is for_all_tables via indirect checks. Why not keep
for_all_tables boolean variable in AlterPublicationStmt similar to
CreatePublicationStmt? That should simplify the above checks.

* Also, the superuser check should be earlier in the code, say just
after following existing check:
if ((stmt->action == AP_AddObjects || stmt->action == AP_SetObjects) &&
schemaidlist && !superuser())
ereport(ERROR,
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
errmsg("must be superuser to add or set schemas")));

-- 
With Regards,
Amit Kapila.



Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Fix miscellaneous issues in EXCEPT publication clause.

  2. Change syntax of EXCEPT TABLE clause in publication commands.

  3. Add support for EXCEPT TABLE in ALTER PUBLICATION.

  4. Allow table exclusions in publications via EXCEPT TABLE.

  5. Add wait_for_subscription_sync for TAP tests.