Skip to content

Commit fabba24

Browse files
Merge pull request #392 from diffix/cristian/bugfix
Fixed handling of IN (subquery) expressions.
2 parents 505004d + 919f82f commit fabba24

File tree

8 files changed

+25
-7
lines changed

8 files changed

+25
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- Allow casts between `int4` and `int8`.
55
- Allow more metadata discovery queries.
66
- Allow more statement types.
7+
- Fixed handling of `IN (subquery)` expressions.
78

89
## Version 1.0.1
910
- Fixed some docs links.

pg_diffix/query/anonymization.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,13 @@ typedef struct AnonQueryLinks AnonQueryLinks;
1818
*/
1919
extern AnonQueryLinks *compile_query(Query *query, List *personal_relations);
2020

21+
/*
22+
* Calls `rewrite_plan` for each item in a list of Plan nodes.
23+
*/
24+
extern void rewrite_plan_list(List *plans, AnonQueryLinks *links);
25+
2126
/*
2227
* Wraps anonymizing Agg nodes with BucketScan nodes. Does nothing if links is NULL.
23-
* Frees memory associated with links after rewriting.
2428
*/
2529
extern Plan *rewrite_plan(Plan *plan, AnonQueryLinks *links);
2630

src/hooks.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,11 @@ static PlannedStmt *pg_diffix_planner(
9090

9191
AnonQueryLinks *links = prepare_query(query);
9292

93-
PlannedStmt *plan;
94-
if (prev_planner_hook)
95-
plan = prev_planner_hook(query, query_string, cursorOptions, boundParams);
96-
else
97-
plan = standard_planner(query, query_string, cursorOptions, boundParams);
93+
planner_hook_type planner = (prev_planner_hook ? prev_planner_hook : standard_planner);
94+
PlannedStmt *plan = planner(query, query_string, cursorOptions, boundParams);
9895

9996
plan->planTree = rewrite_plan(plan->planTree, links);
97+
rewrite_plan_list(plan->subplans, links);
10098

10199
return plan;
102100
}

src/query/anonymization.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ static void unwrap_having_qual(Plan *plan)
901901
plan->qual = make_ands_implicit(having_qual);
902902
}
903903

904-
static void rewrite_plan_list(List *plans, AnonQueryLinks *links)
904+
void rewrite_plan_list(List *plans, AnonQueryLinks *links)
905905
{
906906
ListCell *cell;
907907
foreach (cell, plans)

test/expected/misc.out

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ HAVING age IS NULL OR age > 40;
5151
64 | 2
5252
(3 rows)
5353

54+
SELECT 'London' IN (SELECT city FROM test_customers);
55+
?column?
56+
----------
57+
f
58+
(1 row)
59+
5460
-- Prevent post-processing filters from being pushed down
5561
EXPLAIN SELECT age, count(*)
5662
FROM test_patients

test/expected/validation.out

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,12 @@ SELECT 1 WHERE EXISTS (SELECT city FROM test_validation);
169169
----------
170170
(0 rows)
171171

172+
SELECT 'London' IN (SELECT city FROM test_validation);
173+
?column?
174+
----------
175+
f
176+
(1 row)
177+
172178
-- Anonymizing leaf subqueries are supported.
173179
SELECT * FROM ( SELECT COUNT(*) FROM test_validation ) x;
174180
count

test/sql/misc.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ FROM test_patients
3535
GROUP BY age
3636
HAVING age IS NULL OR age > 40;
3737

38+
SELECT 'London' IN (SELECT city FROM test_customers);
39+
3840
-- Prevent post-processing filters from being pushed down
3941
EXPLAIN SELECT age, count(*)
4042
FROM test_patients

test/sql/validation.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ SELECT city FROM test_validation UNION SELECT city FROM test_validation;
105105
-- Anonymizing sublinks are supported.
106106
SELECT EXISTS (SELECT city FROM test_validation);
107107
SELECT 1 WHERE EXISTS (SELECT city FROM test_validation);
108+
SELECT 'London' IN (SELECT city FROM test_validation);
108109

109110
-- Anonymizing leaf subqueries are supported.
110111
SELECT * FROM ( SELECT COUNT(*) FROM test_validation ) x;

0 commit comments

Comments
 (0)