Hi,

While testing event triggers support for CREATE RULE, I noticed that
existing code does not deparse whole-row references correctly:

postgres=# create table f (a int);
CREATE TABLE
postgres=# create table g (other f);
CREATE TABLE
postgres=# create rule f as on insert to f do also (insert into g values (new));
CREATE RULE
postgres=# \d f
         Tabla «public.f»
 Columna |  Tipo   | Modificadores 
---------+---------+---------------
 a       | integer | 
Reglas:
    f AS
    ON INSERT TO f DO  INSERT INTO g (other)
  VALUES (new.*)


Note that my rule had "values (new)" but the deparsed version uses
"VALUES (new.*)" which doesn't work on input: pg_dump will fail with
this output:

$ pg_dump postgres -t f -t g | LC_ALL=C PGOPTIONS="-c lc_messages=C" psql 
postgres2
SET
SET
SET
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
ERROR:  column "other" is of type f but expression is of type integer
LINE 3:   VALUES (new.*);
                  ^
HINT:  You will need to rewrite or cast the expression.


My sample session with event triggers is a neat example of that
functionality at work BTW (or so I think anyway):

alvherre=# CREATE  RULE "F" AS ON INSERT TO public.f  DO also (insert into g 
values (new); insert into h values (new); insert into i values (new));
NOTICE:  Trigger has been executed. ddl_command_end -- CREATE RULE  
NOTICE:  JSON blob: {
    "actions": [
        "INSERT INTO public.g (duh) VALUES (new.*)", 
        "INSERT INTO public.h (duh) VALUES (new.*)", 
        "INSERT INTO public.i (duh) VALUES (new.*)"
    ], 
    "event": "INSERT", 
    "fmt": "CREATE %{or_replace}s RULE %{identity}I AS ON %{event}s TO 
%{table}D %{where_clause}s DO %{instead}s (%{actions:; }s)", 
    "identity": "F", 
    "instead": "ALSO", 
    "or_replace": "", 
    "table": {
        "objname": "f", 
        "schemaname": "public"
    }, 
    "where_clause": {
        "clause": null, 
        "fmt": "WHERE %{clause}s", 
        "present": false
    }
}
NOTICE:  expanded: CREATE  RULE "F" AS ON INSERT TO public.f  DO ALSO (INSERT 
INTO public.g (duh) VALUES (new.*); INSERT INTO public.h (duh) VALUES (new.*); 
INSERT INTO public.i (duh) VALUES (new.*))
CREATE RULE
alvherre=# \d f
         Tabla «public.f»
 Columna |  Tipo   | Modificadores 
---------+---------+---------------
 a       | integer | 
Reglas:
    "F" AS
    ON INSERT TO f DO ( INSERT INTO g (duh)
  VALUES (new.*);
 INSERT INTO h (duh)
  VALUES (new.*);
 INSERT INTO i (duh)
  VALUES (new.*);
)


I'm switching to the multixact bug now, but I wanted to report this
before I forgot it.

-- 
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to