Thanks for the feedback Gilles! On Mon, Jun 28, 2021 at 04:06:54PM +0200, Gilles Darold wrote: > > If we could at least call get_query_def()through an extension if we didn't > have a functionit would be ideal for DBAs.I agree this is unusual but when > it does happen to you being able to call get_query_def () helps a lot.
Since at least 2 other persons seems to be interested in that feature, I can take care of writing and maintaining such an extension, provided that the required infrastructure is available in core. PFA v2 of the patch which only adds the required alias and expose get_query_def().
>From d93ea00f3a63f0799538b08208439c01bf7a8aba Mon Sep 17 00:00:00 2001 From: Julien Rouhaud <julien.rouh...@free.fr> Date: Tue, 29 Jun 2021 00:07:04 +0800 Subject: [PATCH v2] Expose get_query_def() This function can be useful for external module, for instance if they want to display a statement after the rewrite stage. In order to emit valid SQL, ApplyRetrieveRule now also adds an alias using the original rule name if no alias were present. Author: Julien Rouhaud Discussion: https://postgr.es/m/20210627041138.zklczwmu3ms4ufnk@nol --- src/backend/rewrite/rewriteHandler.c | 2 ++ src/backend/utils/adt/ruleutils.c | 5 +---- src/include/utils/ruleutils.h | 3 +++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 88a9e95e33..f01b4531bf 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -1815,6 +1815,8 @@ ApplyRetrieveRule(Query *parsetree, rte->rtekind = RTE_SUBQUERY; rte->subquery = rule_action; rte->security_barrier = RelationIsSecurityView(relation); + if (!rte->alias) + rte->alias = makeAlias(get_rel_name(rte->relid), NULL); /* Clear fields that should not be set in a subquery RTE */ rte->relid = InvalidOid; rte->relkind = 0; diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 3719755a0d..2844239daa 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -387,9 +387,6 @@ static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, int prettyFlags); static void make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, int prettyFlags, int wrapColumn); -static void get_query_def(Query *query, StringInfo buf, List *parentnamespace, - TupleDesc resultDesc, - int prettyFlags, int wrapColumn, int startIndent); static void get_values_def(List *values_lists, deparse_context *context); static void get_with_clause(Query *query, deparse_context *context); static void get_select_query_def(Query *query, deparse_context *context, @@ -5251,7 +5248,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, * the view represented by a SELECT query. * ---------- */ -static void +void get_query_def(Query *query, StringInfo buf, List *parentnamespace, TupleDesc resultDesc, int prettyFlags, int wrapColumn, int startIndent) diff --git a/src/include/utils/ruleutils.h b/src/include/utils/ruleutils.h index d333e5e8a5..384cbc101a 100644 --- a/src/include/utils/ruleutils.h +++ b/src/include/utils/ruleutils.h @@ -39,6 +39,9 @@ extern List *select_rtable_names_for_explain(List *rtable, Bitmapset *rels_used); extern char *generate_collation_name(Oid collid); extern char *generate_opclass_name(Oid opclass); +void get_query_def(Query *query, StringInfo buf, List *parentnamespace, + TupleDesc resultDesc, + int prettyFlags, int wrapColumn, int startIndent); extern char *get_range_partbound_string(List *bound_datums); extern char *pg_get_statisticsobjdef_string(Oid statextid); -- 2.31.1