From 403bd6a18b8ec5aeee51c08360441c3c3c239d8f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 16 May 2013 16:47:26 -0400 Subject: [PATCH] Fix crash when trying to display a NOTIFY rule action. Fixes oversight in commit 2ffa740be9d96a3743ecb7e42391c53d0760c65a. Per report from Josh Kupershmidt. I think we've broken this case before, so let's add a regression test this time. --- src/backend/utils/adt/ruleutils.c | 19 ++++++++++++------- src/test/regress/expected/rules.out | 4 ++++ src/test/regress/sql/rules.sql | 1 + 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index af04b05160..043baf3c79 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -2564,14 +2564,19 @@ set_deparse_for_query(deparse_namespace *dpns, Query *query, dpns->rtable_columns = lappend(dpns->rtable_columns, palloc0(sizeof(deparse_columns))); - /* Detect whether global uniqueness of USING names is needed */ - dpns->unique_using = has_unnamed_full_join_using((Node *) query->jointree); + /* If it's a utility query, it won't have a jointree */ + if (query->jointree) + { + /* Detect whether global uniqueness of USING names is needed */ + dpns->unique_using = + has_unnamed_full_join_using((Node *) query->jointree); - /* - * Select names for columns merged by USING, via a recursive pass over the - * query jointree. - */ - set_using_names(dpns, (Node *) query->jointree); + /* + * Select names for columns merged by USING, via a recursive pass over + * the query jointree. + */ + set_using_names(dpns, (Node *) query->jointree); + } /* * Now assign remaining column aliases for each RTE. We do this in a diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index dc3c8a8381..57ae8427ec 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -2573,6 +2573,7 @@ select * from rules_log; 11 | 13 | new (12 rows) +create rule r3 as on delete to rules_src do notify rules_src_deletion; \d+ rules_src Table "public.rules_src" Column | Type | Modifiers | Storage | Stats target | Description @@ -2584,6 +2585,9 @@ Rules: ON UPDATE TO rules_src DO INSERT INTO rules_log (f1, f2, tag) VALUES (old.f1,old.f2,'old'::text), (new.f1,new.f2,'new'::text) r2 AS ON UPDATE TO rules_src DO VALUES (old.f1,old.f2,'old'::text), (new.f1,new.f2,'new'::text) + r3 AS + ON DELETE TO rules_src DO + NOTIFY rules_src_deletion Has OIDs: no -- diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index 4f49a0deca..d5a3571087 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -970,6 +970,7 @@ create rule r2 as on update to rules_src do also update rules_src set f2 = f2 / 10; select * from rules_src; select * from rules_log; +create rule r3 as on delete to rules_src do notify rules_src_deletion; \d+ rules_src -- -- GitLab