On 11/18/24 22:15, Tomas Vondra wrote: > ... > > So I think the correct solution is to not pass any expressions with > RestrictInfo to deparse_expression(). Either by stripping the nodes, or > by not adding them at all. > > The patch tries to do the stripping by maybe_extract_actual_clauses(), > but that only looks at the top node, and that is not sufficient here. > Maybe it would be possible to walk the whole tree, and remove all the > RestrictInfos nodes - including intermediate ones, not just the top. But > I'm not quite sure it wouldn't cause issues elsewhere (assuming it > modifies the existing nodes). It still feels a bit like fixing a problem > we shouldn't really have ... >
To make this idea a bit more concrete, here's a patch removing all RestrictInfo nodes in show_stat_qual(). But still, it feels wrong. regards -- Tomas Vondra
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 40c8462d680..bf2faa6d9f2 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -2738,6 +2738,25 @@ deparse_stat_expression(Node *node, return deparse_expression(node, context, false, false); } +static Node * +strip_restrict_info_nodes(Node *node, void *context) +{ + if (node == NULL) + return NULL; + + switch (nodeTag(node)) + { + case T_RestrictInfo: + return (Node *) ((RestrictInfo *) node)->clause; + + default: + break; + } + + return expression_tree_mutator(node, strip_restrict_info_nodes, + (void *) context); +} + /* * Show a qualifier expression (which is a List with implicit AND semantics) */ @@ -2752,6 +2771,10 @@ show_stat_qual(List *qual, int is_or, if (qual == NIL) return NULL; + /* remove all RestrictInfo nodes, which are not expected by deparsing */ + qual = (List *) expression_tree_mutator((Node *) qual, + strip_restrict_info_nodes, NULL); + /* Convert AND list to explicit AND */ switch (is_or) {