2022年7月8日(金) 14:06 Fujii Masao <masao.fu...@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


Reply via email to