8000 fix evaluation of expressions with PARAMs in handle_modification_query() · postgrespro/pg_pathman@0dc040b · GitHub
[go: up one dir, main page]

Skip to content

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

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)
0