Обсуждение: wrong output in dump of rules with old values of row type columns
for example
create table test(a int);
create table test_log(old test);
create rule del as on delete to test do insert into test_log values(old);
it works as intended
postgres=# insert into test values(1);
INSERT 0 1
postgres=# delete from test;
DELETE 1
postgres=# select * from test_log
postgres-# ;
old
-----
(1)
(1 row)
BUT
\d test shows
postgres=# \d test
Table "public.test"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | |
Rules:
del AS
ON DELETE TO test DO INSERT INTO test_log (old)
VALUES (old.*)
and pg_dump makes wrong rule
--
-- Name: test del; Type: RULE; Schema: public; Owner: postgres
--
CREATE RULE del AS
ON DELETE TO public.test DO INSERT INTO public.test_log (old)
VALUES (old.*);
when i try to recreate it from dump
drop rule del on test ;
CREATE RULE del AS
ON DELETE TO public.test DO INSERT INTO public.test_log (old)
VALUES (old.*);
ERROR: column "old" is of type test but expression is of type integer
LINE 3: VALUES (old.*);
^
HINT: You will need to rewrite or cast the expression.
if i remove .* part - all OK
postgres=# CREATE RULE del AS
ON DELETE TO public.test DO INSERT INTO public.test_log (old)
VALUES (old);
CREATE RULE
So i think it's bug, and both \d and pg_dump should return
VALUES (old) instead of VALUES (old.*) in this case
'new' instead of 'old' makes same result
postgres=# CREATE RULE ins AS
ON INSERT TO public.test DO INSERT INTO public.test_log (old)
VALUES (new);
CREATE RULE
postgres=# \d test
Table "public.test"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | |
Rules:
del AS
ON DELETE TO test DO INSERT INTO test_log (old)
VALUES (old.*)
ins AS
ON INSERT TO test DO INSERT INTO test_log (old)
VALUES (new.*)
it same on ver 11 and 14, don't tried other versions
--
Homo Homini Dominus est
Timur Khanjanov <intel@intrans.baku.az> writes:
> create table test(a int);
> create table test_log(old test);
> create rule del as on delete to test do insert into test_log values(old);
As a workaround you could write it as
create rule del as on delete to test do insert into test_log select old;
which will reverse-list as
ON DELETE TO test DO INSERT INTO test_log (old) SELECT old.*::test AS old
Looks like we need to apply the same hack in VALUES lists.
regards, tom lane
On 12.01.2022 19:08, Tom Lane wrote: > Timur Khanjanov <intel@intrans.baku.az> writes: >> create table test(a int); >> create table test_log(old test); >> create rule del as on delete to test do insert into test_log values(old); > > As a workaround you could write it as > > create rule del as on delete to test do insert into test_log select old; > > which will reverse-list as > > ON DELETE TO test DO INSERT INTO test_log (old) SELECT old.*::test AS old > > Looks like we need to apply the same hack in VALUES lists. > > regards, tom lane thank you for workaround, I'm already find another workaround (just script, modyfing dump, not universal, but works for me ;) Hope that in next version it 'll be fixed. -- Homo Homini Dominus est