0001-fix-null-deref-in-subscription-refresh-on-concurrent-drop.patch
application/octet-stream
Filename: 0001-fix-null-deref-in-subscription-refresh-on-concurrent-drop.patch
Type: application/octet-stream
Part: 0
diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c
index 523959ba0ce..a72fc91509d 100644
--- a/src/backend/commands/subscriptioncmds.c
+++ b/src/backend/commands/subscriptioncmds.c
@@ -2782,10 +2782,25 @@ check_publications_origin_tables(WalReceiverConn *wrconn, List *publications,
for (i = 0; i < subrel_count; i++)
{
Oid relid = subrel_local_oids[i];
- char *schemaname = get_namespace_name(get_rel_namespace(relid));
- char *tablename = get_rel_name(relid);
- char *schemaname_lit = quote_literal_cstr(schemaname);
- char *tablename_lit = quote_literal_cstr(tablename);
+ char *schemaname;
+ char *tablename;
+ char *schemaname_lit;
+ char *tablename_lit;
+
+ /*
+ * The table may have been dropped concurrently. Since we don't
+ * hold a lock on it, just skip if it's gone.
+ */
+ tablename = get_rel_name(relid);
+ if (tablename == NULL)
+ continue;
+
+ schemaname = get_namespace_name(get_rel_namespace(relid));
+ if (schemaname == NULL)
+ continue;
+
+ schemaname_lit = quote_literal_cstr(schemaname);
+ tablename_lit = quote_literal_cstr(tablename);
appendStringInfo(&cmd, "AND NOT (N.nspname = %s AND C.relname = %s)\n",
schemaname_lit, tablename_lit);
@@ -2909,10 +2924,22 @@ check_publications_origin_sequences(WalReceiverConn *wrconn, List *publications,
for (int i = 0; i < subrel_count; i++)
{
Oid relid = subrel_local_oids[i];
- char *schemaname = get_namespace_name(get_rel_namespace(relid));
- char *seqname = get_rel_name(relid);
- char *schemaname_lit = quote_literal_cstr(schemaname);
- char *seqname_lit = quote_literal_cstr(seqname);
+ char *schemaname;
+ char *seqname;
+ char *schemaname_lit;
+ char *seqname_lit;
+
+ /* The sequence may have been dropped concurrently; skip if gone. */
+ seqname = get_rel_name(relid);
+ if (seqname == NULL)
+ continue;
+
+ schemaname = get_namespace_name(get_rel_namespace(relid));
+ if (schemaname == NULL)
+ continue;
+
+ schemaname_lit = quote_literal_cstr(schemaname);
+ seqname_lit = quote_literal_cstr(seqname);
appendStringInfo(&cmd,
"AND NOT (N.nspname = %s AND C.relname = %s)\n",