Re: Support TRUNCATE triggers on foreign tables

Ian Lawrence Barwick <barwick@gmail.com>

From: Ian Lawrence Barwick <barwick@gmail.com>
To: Fujii Masao <masao.fujii@oss.nttdata.com>
Cc: Yugo NAGATA <nagata@sraoss.co.jp>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2022-07-08T07:50:10Z
Lists: pgsql-hackers
2022年7月8日(金) 14:06 Fujii Masao <masao.fujii@oss.nttdata.com>:
> On 2022/07/08 11:19, Yugo NAGATA wrote:
> >> You added "foreign tables" for BEFORE statement-level trigger as the above, but ISTM that you also needs to do that for AFTER statement-level trigger. No?
> >
> > Oops, I forgot it. I attached the updated patch.
>
> Thanks for updating the patch! LGTM.
> Barring any objection, I will commit the patch.

An observation: as-is the patch would make it possible to create a truncate
trigger for a foreign table whose FDW doesn't support truncation, which seems
somewhat pointless, possible source of confusion etc.:

    postgres=# CREATE TRIGGER ft_trigger
      AFTER TRUNCATE ON fb_foo
      EXECUTE FUNCTION fb_foo_trg();
    CREATE TRIGGER

    postgres=# TRUNCATE fb_foo;
    ERROR:  cannot truncate foreign table "fb_foo"

It would be easy enough to check for this, e.g.:

    else if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE)
    {
        FdwRoutine *fdwroutine = GetFdwRoutineForRelation(rel, false);

        if (!fdwroutine->ExecForeignTruncate)
            ereport(ERROR,
                    (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                     errmsg("foreign data wrapper does not support
table truncation")));
        ...

which results in:

    postgres=# CREATE TRIGGER ft_trigger
      AFTER TRUNCATE ON fb_foo
      EXECUTE FUNCTION fb_foo_trg();
    ERROR:  foreign data wrapper does not support table truncation

which IMO is preferable to silently accepting DDL which will never
actually do anything.


Regards

Ian Barwick



Commits

  1. Support TRUNCATE triggers on foreign tables.