]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix dependency on FDW handler.
authorJeff Davis <jdavis@postgresql.org>
Thu, 19 Mar 2026 21:59:07 +0000 (14:59 -0700)
committerJeff Davis <jdavis@postgresql.org>
Thu, 19 Mar 2026 22:07:43 +0000 (15:07 -0700)
ALTER FOREIGN DATA WRAPPER could drop the dependency on the handler
function if it wasn't explicitly specified.

Reviewed-by: Nathan Bossart <nathandbossart@gmail.com>
Discussion: https://postgr.es/m/35c44a4b7fb76d35418c4d66b775a88f4ce60c86.camel@j-davis.com
Backpatch-through: 14

src/backend/commands/foreigncmds.c
src/test/regress/expected/foreign_data.out
src/test/regress/sql/foreign_data.sql

index 45681235782aa31df10b102c0b4304cfe8f191d2..0b31afd8a796a5ce0495adacdb17498f4bb21a74 100644 (file)
@@ -786,6 +786,11 @@ AlterForeignDataWrapper(ParseState *pstate, AlterFdwStmt *stmt)
                ereport(WARNING,
                                (errmsg("changing the foreign-data wrapper handler can change behavior of existing foreign tables")));
        }
+       else
+       {
+               /* handler unchanged */
+               fdwhandler = fdwForm->fdwhandler;
+       }
 
        if (validator_given)
        {
index 6af54d9803f6db313d5f12cac41a07cfcfd88197..35d75180dffb1db1a4dd9f51c1b40c0895bb43b4 100644 (file)
@@ -106,6 +106,13 @@ 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
+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 FOREIGN DATA WRAPPER test_fdw;
 -- ALTER FOREIGN DATA WRAPPER
 ALTER FOREIGN DATA WRAPPER foo OPTIONS (nonexistent 'fdw');         -- ERROR
index 084d5559e098e3e6b57fd8359ca0b57bfd783abb..0080bfb8856fc8210b13de9a48b3cb3076fca8f3 100644 (file)
@@ -67,6 +67,11 @@ CREATE FUNCTION invalid_fdw_handler() RETURNS int LANGUAGE SQL AS 'SELECT 1;';
 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
+ALTER FOREIGN DATA WRAPPER test_fdw VALIDATOR postgresql_fdw_validator;
+DROP FUNCTION test_fdw_handler(); -- ERROR
+
 DROP FOREIGN DATA WRAPPER test_fdw;
 
 -- ALTER FOREIGN DATA WRAPPER