]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix dependency on FDW's connection function.
authorJeff Davis <jdavis@postgresql.org>
Fri, 20 Mar 2026 19:42:59 +0000 (12:42 -0700)
committerJeff Davis <jdavis@postgresql.org>
Fri, 20 Mar 2026 19:42:59 +0000 (12:42 -0700)
Missed in commit 8185bb5347.

Catalog version bump.

Discussion: https://postgr.es/m/fd49b44dc65da8e71ab20c1cf1ec7e65921c20f5.camel@j-davis.com

src/backend/commands/foreigncmds.c
src/include/catalog/catversion.h
src/test/regress/expected/foreign_data.out
src/test/regress/expected/subscription.out
src/test/regress/sql/foreign_data.sql
src/test/regress/sql/subscription.sql

index 0b31afd8a796a5ce0495adacdb17498f4bb21a74..c4852be2eb29c31a586e62e8cc5d4e1a6c6efbdb 100644 (file)
@@ -707,6 +707,14 @@ CreateForeignDataWrapper(ParseState *pstate, CreateFdwStmt *stmt)
                recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
        }
 
+       if (OidIsValid(fdwconnection))
+       {
+               referenced.classId = ProcedureRelationId;
+               referenced.objectId = fdwconnection;
+               referenced.objectSubId = 0;
+               recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+       }
+
        recordDependencyOnOwner(ForeignDataWrapperRelationId, fdwId, ownerId);
 
        /* dependency on extension */
@@ -819,6 +827,28 @@ AlterForeignDataWrapper(ParseState *pstate, AlterFdwStmt *stmt)
        {
                repl_val[Anum_pg_foreign_data_wrapper_fdwconnection - 1] = ObjectIdGetDatum(fdwconnection);
                repl_repl[Anum_pg_foreign_data_wrapper_fdwconnection - 1] = true;
+
+               /*
+                * If the connection function is changed, behavior of dependent
+                * subscriptions can change.  If NO CONNECTION, dependent
+                * subscriptions will fail.
+                */
+               if (OidIsValid(fdwForm->fdwconnection))
+               {
+                       if (OidIsValid(fdwconnection))
+                               ereport(WARNING,
+                                               (errmsg("changing the foreign-data wrapper connection function can cause "
+                                                               "the options for dependent objects to become invalid")));
+                       else
+                               ereport(WARNING,
+                                               (errmsg("removing the foreign-data wrapper connection function will cause "
+                                                               "dependent subscriptions to fail")));
+               }
+       }
+       else
+       {
+               /* connection function unchanged */
+               fdwconnection = fdwForm->fdwconnection;
        }
 
        /*
@@ -859,7 +889,7 @@ AlterForeignDataWrapper(ParseState *pstate, AlterFdwStmt *stmt)
        ObjectAddressSet(myself, ForeignDataWrapperRelationId, fdwId);
 
        /* Update function dependencies if we changed them */
-       if (handler_given || validator_given)
+       if (handler_given || validator_given || connection_given)
        {
                ObjectAddress referenced;
 
@@ -889,6 +919,14 @@ AlterForeignDataWrapper(ParseState *pstate, AlterFdwStmt *stmt)
                        referenced.objectSubId = 0;
                        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
                }
+
+               if (OidIsValid(fdwconnection))
+               {
+                       referenced.classId = ProcedureRelationId;
+                       referenced.objectId = fdwconnection;
+                       referenced.objectSubId = 0;
+                       recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+               }
        }
 
        InvokeObjectPostAlterHook(ForeignDataWrapperRelationId, fdwId, 0);
index fd8472cb5a57431702dd296bc977ab63d7d7ded7..420850293f8b337c5e6d72a9c8991445e918a3fe 100644 (file)
@@ -57,6 +57,6 @@
  */
 
 /*                                                     yyyymmddN */
-#define CATALOG_VERSION_NO     202603191
+#define CATALOG_VERSION_NO     202603201
 
 #endif
index 35d75180dffb1db1a4dd9f51c1b40c0895bb43b4..305a9f9e54e31410bc0c84ce2391927795dc5549 100644 (file)
@@ -9,6 +9,10 @@ CREATE FUNCTION test_fdw_handler()
     RETURNS fdw_handler
     AS :'regresslib', 'test_fdw_handler'
     LANGUAGE C;
+CREATE FUNCTION test_fdw_connection(oid, oid, internal)
+    RETURNS text
+    AS :'regresslib', 'test_fdw_connection'
+    LANGUAGE C;
 -- Clean up in case a prior regression run failed
 -- Suppress NOTICE messages when roles don't exist
 SET client_min_messages TO 'warning';
@@ -106,13 +110,18 @@ ERROR:  conflicting or redundant options
 LINE 1: ...GN DATA WRAPPER test_fdw HANDLER test_fdw_handler HANDLER in...
                                                              ^
 CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler;
--- should preserve dependency on test_fdw_handler
+-- should preserve dependencies on test_fdw_handler and test_fdw_connection
+ALTER FOREIGN DATA WRAPPER test_fdw CONNECTION test_fdw_connection;
 ALTER FOREIGN DATA WRAPPER test_fdw VALIDATOR postgresql_fdw_validator;
 WARNING:  changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid
 DROP FUNCTION test_fdw_handler(); -- ERROR
 ERROR:  cannot drop function test_fdw_handler() because other objects depend on it
 DETAIL:  foreign-data wrapper test_fdw depends on function test_fdw_handler()
 HINT:  Use DROP ... CASCADE to drop the dependent objects too.
+DROP FUNCTION test_fdw_connection(oid, oid, internal); -- ERROR
+ERROR:  cannot drop function test_fdw_connection(oid,oid,internal) because other objects depend on it
+DETAIL:  foreign-data wrapper test_fdw depends on function test_fdw_connection(oid,oid,internal)
+HINT:  Use DROP ... CASCADE to drop the dependent objects too.
 DROP FOREIGN DATA WRAPPER test_fdw;
 -- ALTER FOREIGN DATA WRAPPER
 ALTER FOREIGN DATA WRAPPER foo OPTIONS (nonexistent 'fdw');         -- ERROR
index f57f359127be3e94b54cbfcbe36a6f65a938f1f9..7e3cabdb93f5242c4e228f051532d207081297d9 100644 (file)
@@ -185,6 +185,15 @@ DROP SUBSCRIPTION regress_testsub6;
 SET SESSION AUTHORIZATION regress_subscription_user;
 REVOKE CREATE ON DATABASE REGRESSION FROM regress_subscription_user3;
 DROP SERVER test_server;
+-- fail, FDW is dependent
+DROP FUNCTION test_fdw_connection(oid, oid, internal);
+ERROR:  cannot drop function test_fdw_connection(oid,oid,internal) because other objects depend on it
+DETAIL:  foreign-data wrapper test_fdw depends on function test_fdw_connection(oid,oid,internal)
+HINT:  Use DROP ... CASCADE to drop the dependent objects too.
+-- warn
+ALTER FOREIGN DATA WRAPPER test_fdw NO CONNECTION;
+WARNING:  removing the foreign-data wrapper connection function will cause dependent subscriptions to fail
+DROP FUNCTION test_fdw_connection(oid, oid, internal);
 DROP FOREIGN DATA WRAPPER test_fdw;
 -- fail - invalid connection string during ALTER
 ALTER SUBSCRIPTION regress_testsub CONNECTION 'foobar';
index 0080bfb8856fc8210b13de9a48b3cb3076fca8f3..ed78052b1e25319e221d8823287bc6700c4518ea 100644 (file)
@@ -13,6 +13,11 @@ CREATE FUNCTION test_fdw_handler()
     AS :'regresslib', 'test_fdw_handler'
     LANGUAGE C;
 
+CREATE FUNCTION test_fdw_connection(oid, oid, internal)
+    RETURNS text
+    AS :'regresslib', 'test_fdw_connection'
+    LANGUAGE C;
+
 -- Clean up in case a prior regression run failed
 
 -- Suppress NOTICE messages when roles don't exist
@@ -68,9 +73,11 @@ CREATE FOREIGN DATA WRAPPER test_fdw HANDLER invalid_fdw_handler;  -- ERROR
 CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler HANDLER invalid_fdw_handler;  -- ERROR
 CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler;
 
--- should preserve dependency on test_fdw_handler
+-- should preserve dependencies on test_fdw_handler and test_fdw_connection
+ALTER FOREIGN DATA WRAPPER test_fdw CONNECTION test_fdw_connection;
 ALTER FOREIGN DATA WRAPPER test_fdw VALIDATOR postgresql_fdw_validator;
 DROP FUNCTION test_fdw_handler(); -- ERROR
+DROP FUNCTION test_fdw_connection(oid, oid, internal); -- ERROR
 
 DROP FOREIGN DATA WRAPPER test_fdw;
 
index a642b3681837537801a236696923f2b5f30df993..6c3d9632e8a3a9e7beb2dd62a5599f0b51531738 100644 (file)
@@ -138,6 +138,14 @@ SET SESSION AUTHORIZATION regress_subscription_user;
 REVOKE CREATE ON DATABASE REGRESSION FROM regress_subscription_user3;
 
 DROP SERVER test_server;
+
+-- fail, FDW is dependent
+DROP FUNCTION test_fdw_connection(oid, oid, internal);
+-- warn
+ALTER FOREIGN DATA WRAPPER test_fdw NO CONNECTION;
+
+DROP FUNCTION test_fdw_connection(oid, oid, internal);
+
 DROP FOREIGN DATA WRAPPER test_fdw;
 
 -- fail - invalid connection string during ALTER