Re: [PATCH] Fix infinite recursion when foreign table references itself

From: Tomas Vondra <tomas(at)vondra(dot)me>
To: John Mikk <jomikk2706(at)gmail(dot)com>, pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: [PATCH] Fix infinite recursion when foreign table references itself
Date: 2026-05-12 14:43:48
Message-ID: edbe2a2c-b2f2-4446-b8ff-1730df1cd40f@vondra.me
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 5/12/26 16:06, John Mikk wrote:
> Hi, hackers.
>
> If you create a foreign table referencing itself on a loopback server, an unpleasant error occurs:
>
> ```sql
> create extension if not exists postgres_fdw;
>
> drop server if exists loopback cascade ;
> create server loopback
> foreign data wrapper postgres_fdw
> options (dbname 'postgres', host 'localhost');
>
> create user mapping for current_user server loopback;
>
> create foreign table test_self (id int)
> server loopback options (table_name 'test_self');
> --> Ok
>
> insert into test_self select 1;
> --> Err
> /*
> [08001] ERROR: could not connect to server "loopback"
> Detail: connection to server on socket "/tmp/.s.PGSQL.54321" failed:
> FATAL: sorry, too many clients already
> Where: remote SQL command: INSERT INTO public.test_self(id) VALUES ($1)
> remote SQL command: INSERT INTO public.test_self(id) VALUES ($1)
> remote SQL command: INSERT INTO public.test_self(id) VALUES ( ...
> */
> ```
>
> The proposed patch fixes this error.
>
> ```sql
> create foreign table test_self (id int)
> server loopback options (table_name 'test_self');
> --> Err
> /*
> [42P16] ERROR: foreign table "test_self" cannot reference itself
> Hint: Foreign table pointing to the same table on the same database
> creates circular reference
> */
> ```
>

I don't think this is a bug. There's probably a million other ways to
cause similar connection loops - consider for example two servers with
foreign tables pointing at each other. That'll trigger exactly the same
issue like your example.

The patch has a variety of other issues :-(

- The options (table_name ...) are specific to the postgres_fdw
extension. The code in src/backend/commands/foreigncmds.c should not be
checking that. There could be an arbitrary other FDW, which happens to
have the same option, or whatever.

- It checks the dbname and table_name, but there's no guarantee it
points at the same machine/instance. So it actually prevents references
to the same (dbname,table_name) on any server. I doubt that makes sense.

- It can't actually check the server in a reliable way, because it could
go through an arbitrary IP for the machine, hostname, connection pool or
whatever other proxy.

- It handles CREATE FOREIGN TABLE, but there's all kinds of ways to
adjust options for an existing table, e.g.

ALTER FOREIGN TABLE test_self OPTIONS (SET table_name '...')

The patch would have add protections in all those places.

There's probably more issues. I don't think this is feasible / worth it.
The connection failure seems like a reasonable end result.

regards

--
Tomas Vondra

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Sami Imseih 2026-05-12 14:50:18 Re: Track skipped tables during autovacuum and autoanalyze
Previous Message Tomas Vondra 2026-05-12 14:13:57 Re: Proposal: Adding compression of temporary files