Skip to content

Commit 0dc040b

Browse files
committed
fix evaluation of expressions with PARAMs in handle_modification_query()
1 parent d0d128d commit 0dc040b

File tree

3 files changed

+76
-6
lines changed

3 files changed

+76
-6
lines changed

expected/pathman_param_upd_del.out

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,64 @@ EXPLAIN (COSTS OFF) EXECUTE upd(11);
6868
Filter: (key = 11)
6969
(3 rows)
7070

71+
DEALLOCATE upd;
72+
PREPARE upd(INT4) AS UPDATE param_upd_del.test SET val = val + 1 WHERE key = ($1 + 3) * 2;
73+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
74+
QUERY PLAN
75+
----------------------------
76+
Update on test_7
77+
-> Seq Scan on test_7
78+
Filter: (key = 16)
79+
(3 rows)
80+
81+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
82+
QUERY PLAN
83+
----------------------------
84+
Update on test_7
85+
-> Seq Scan on test_7
86+
Filter: (key = 16)
87+
(3 rows)
88+
89+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
90+
QUERY PLAN
91+
----------------------------
92+
Update on test_7
93+
-> Seq Scan on test_7
94+
Filter: (key = 16)
95+
(3 rows)
96+
97+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
98+
QUERY PLAN
99+
----------------------------
100+
Update on test_7
101+
-> Seq Scan on test_7
102+
Filter: (key = 16)
103+
(3 rows)
104+
105+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
106+
QUERY PLAN
107+
----------------------------
108+
Update on test_7
109+
-> Seq Scan on test_7
110+
Filter: (key = 16)
111+
(3 rows)
112+
113+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
114+
QUERY PLAN
115+
----------------------------
116+
Update on test_7
117+
-> Seq Scan on test_7
118+
Filter: (key = 16)
119+
(3 rows)
120+
121+
EXPLAIN (COSTS OFF) EXECUTE upd(6);
122+
QUERY PLAN
123+
----------------------------
124+
Update on test_3
125+
-> Seq Scan on test_3
126+
Filter: (key = 18)
127+
(3 rows)
128+
71129
DEALLOCATE upd;
72130
PREPARE del(INT4) AS DELETE FROM param_upd_del.test WHERE key = $1;
73131
EXPLAIN (COSTS OFF) EXECUTE del(10);

sql/pathman_param_upd_del.sql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@ EXPLAIN (COSTS OFF) EXECUTE upd(11);
2323
DEALLOCATE upd;
2424

2525

26+
PREPARE upd(INT4) AS UPDATE param_upd_del.test SET val = val + 1 WHERE key = ($1 + 3) * 2;
27+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
28+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
29+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
30+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
31+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
32+
EXPLAIN (COSTS OFF) EXECUTE upd(5);
33+
EXPLAIN (COSTS OFF) EXECUTE upd(6);
34+
DEALLOCATE upd;
35+
36+
2637
PREPARE del(INT4) AS DELETE FROM param_upd_del.test WHERE key = $1;
2738
EXPLAIN (COSTS OFF) EXECUTE del(10);
2839
EXPLAIN (COSTS OFF) EXECUTE del(10);

src/planner_tree_modification.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,8 @@ static void
374374
handle_modification_query(Query *parse, transform_query_cxt *context)
375375
{
376376
RangeTblEntry *rte;
377-
Expr *quals;
378377
Oid child;
378+
Node *quals = parse->jointree->quals;
379379
Index result_rti = parse->resultRelation;
380380
ParamListInfo params = context->query_params;
381381

@@ -390,14 +390,15 @@ handle_modification_query(Query *parse, transform_query_cxt *context)
390390
if (!rte->inh)
391391
return;
392392

393-
quals = (Expr *) eval_const_expressions(NULL, parse->jointree->quals);
394-
395393
/* Check if we can replace PARAMs with CONSTs */
396-
if (params && clause_contains_params((Node *) quals))
397-
quals = (Expr *) eval_extern_params_mutator((Node *) quals, params);
394+
if (params && clause_contains_params(quals))
395+
quals = eval_extern_params_mutator(quals, params);
396+
397+
/* Evaluate constaint expressions */
398+
quals = eval_const_expressions(NULL, quals);
398399

399400
/* Parse syntax tree and extract deepest partition if possible */
400-
child = find_deepest_partition(rte->relid, result_rti, quals);
401+
child = find_deepest_partition(rte->relid, result_rti, (Expr *) quals);
401402

402403
/* Substitute parent table with partition */
403404
if (OidIsValid(child))

0 commit comments

Comments
 (0)