summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2024-01-10 13:36:34 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2024-01-10 13:36:34 -0500
commitc3f52fd5d7160733e6b78fc8957e8990a3341bda (patch)
tree6929c9bd9cb6cb45862bdf34e396d2c1de72f58e
parentc74aad093d096fdec6d39eb2cad544274b919a93 (diff)
Handle WindowClause.runCondition in tree walker/mutator functions.
Commit 9d9c02ccd, which added the notion of a "run condition" for window functions, neglected to teach nodeFuncs.c to process the new field. Remarkably, that doesn't seem to have had any ill effects before we invented Var.varnullingrels, but now it can cause visible failures in join-removal scenarios. I have no faith that there's not reachable problems in v15 too, so back-patch the code change to v15 where 9d9c02ccd came in. The test case seems irrelevant to v15, though. Per bug #18277 from Zuming Jiang. Diagnosis and patch by Richard Guo. Discussion: https://postgr.es/m/18277-089ead83b329a2fd@postgresql.org
-rw-r--r--src/backend/nodes/nodeFuncs.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
index a7080f5cb24..675041f9c96 100644
--- a/src/backend/nodes/nodeFuncs.c
+++ b/src/backend/nodes/nodeFuncs.c
@@ -2180,6 +2180,8 @@ expression_tree_walker(Node *node,
return true;
if (walker(wc->endOffset, context))
return true;
+ if (walker(wc->runCondition, context))
+ return true;
}
break;
case T_CTECycleClause:
@@ -2457,6 +2459,8 @@ query_tree_walker(Query *query,
return true;
if (walker(wc->endOffset, context))
return true;
+ if (walker(wc->runCondition, context))
+ return true;
}
}
@@ -3094,6 +3098,7 @@ expression_tree_mutator(Node *node,
MUTATE(newnode->orderClause, wc->orderClause, List *);
MUTATE(newnode->startOffset, wc->startOffset, Node *);
MUTATE(newnode->endOffset, wc->endOffset, Node *);
+ MUTATE(newnode->runCondition, wc->runCondition, List *);
return (Node *) newnode;
}
break;
@@ -3423,6 +3428,7 @@ query_tree_mutator(Query *query,
FLATCOPY(newnode, wc, WindowClause);
MUTATE(newnode->startOffset, wc->startOffset, Node *);
MUTATE(newnode->endOffset, wc->endOffset, Node *);
+ MUTATE(newnode->runCondition, wc->runCondition, List *);
resultlist = lappend(resultlist, (Node *) newnode);
}