]> 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:01:45 +0000 (15:01 -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 1899d36c3b44cbef1b79dfc03ef2c1485ac44f5d..5960046ee4aada8d6d69dca313257126338a65aa 100644 (file)
@@ -744,6 +744,11 @@ AlterForeignDataWrapper(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 c9381bd260fc981afaf544715943596e7a5b9436..b1239c7c6c7e0120a03f004fc079411ce3e80bfd 100644 (file)
@@ -96,6 +96,13 @@ ERROR:  function invalid_fdw_handler must return type fdw_handler
 CREATE FOREIGN DATA WRAPPER test_fdw HANDLER test_fdw_handler HANDLER invalid_fdw_handler;  -- ERROR
 ERROR:  conflicting or redundant options
 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;                             -- ERROR
index f6c7a446542402b4c6daece6a773bb80917fa197..4128d6f83b7b2659b37afcf4eb398c0488e0757b 100644 (file)
@@ -56,6 +56,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