Add comment about NOT_EXPR. Treat it as invalid constraint for safety.

pull/3486/head
Markus Sintonen 2020-02-15 16:54:38 +02:00
parent 7382c8be00
commit 3d3d615040
4 changed files with 87 additions and 0 deletions

View File

@ -559,6 +559,13 @@ BuildPruningTree(Node *node, PruningTreeBuildContext *context)
if (boolExpr->boolop == NOT_EXPR) if (boolExpr->boolop == NOT_EXPR)
{ {
/*
* We should not encounter NOT_EXPR nodes.
* Postgres standard planner applies De Morgan's laws to remove them.
* But if we encounter one, we treat it as invalid constraint for pruning.
*/
context->current->hasInvalidConstraints = true;
return false; return false;
} }
else if (context->current->boolop != boolExpr->boolop) else if (context->current->boolop != boolExpr->boolop)

View File

@ -995,4 +995,65 @@ DEBUG: assigned task to node localhost:xxxxx
4 4
(1 row) (1 row)
-- Check that NOT is handled with NEQs ORed
SELECT count(*) FROM orders_hash_partitioned
WHERE NOT (o_orderkey != 2 OR o_orderkey != 3);
DEBUG: Creating router plan
DEBUG: Plan is router executable
count
---------------------------------------------------------------------
0
(1 row)
-- Check that NOT is handled with EQs ORed
SELECT count(*) FROM orders_hash_partitioned
WHERE NOT (o_orderkey = 2 OR o_orderkey = 3);
DEBUG: no valid constraints found
DEBUG: shard count: 4
DEBUG: Router planner cannot handle multi-shard select queries
DEBUG: no valid constraints found
DEBUG: shard count: 4
DEBUG: assigned task to node localhost:xxxxx
DEBUG: assigned task to node localhost:xxxxx
DEBUG: assigned task to node localhost:xxxxx
DEBUG: assigned task to node localhost:xxxxx
count
---------------------------------------------------------------------
2
(1 row)
-- Check that NOT is handled with NEQs ANDed
SELECT count(*) FROM orders_hash_partitioned
WHERE NOT (o_orderkey != 2 AND o_orderkey != 3);
DEBUG: constraint value: 2
DEBUG: constraint value: 3
DEBUG: shard count: 2
DEBUG: Router planner cannot handle multi-shard select queries
DEBUG: constraint value: 2
DEBUG: constraint value: 3
DEBUG: shard count: 2
DEBUG: assigned task to node localhost:xxxxx
DEBUG: assigned task to node localhost:xxxxx
count
---------------------------------------------------------------------
2
(1 row)
-- Check that NOT is handled with EQs ANDed
SELECT count(*) FROM orders_hash_partitioned
WHERE NOT (o_orderkey = 2 AND o_orderkey = 3);
DEBUG: no valid constraints found
DEBUG: shard count: 4
DEBUG: Router planner cannot handle multi-shard select queries
DEBUG: no valid constraints found
DEBUG: shard count: 4
DEBUG: assigned task to node localhost:xxxxx
DEBUG: assigned task to node localhost:xxxxx
DEBUG: assigned task to node localhost:xxxxx
DEBUG: assigned task to node localhost:xxxxx
count
---------------------------------------------------------------------
4
(1 row)
SET client_min_messages TO DEFAULT; SET client_min_messages TO DEFAULT;

View File

@ -1429,6 +1429,9 @@ DEBUG: Deferred pruning for a fast-path router query
DEBUG: Creating router plan DEBUG: Creating router plan
DEBUG: Plan is router executable DEBUG: Plan is router executable
EXECUTE null_update_on_text_param_and_in(NULL); EXECUTE null_update_on_text_param_and_in(NULL);
DEBUG: Deferred pruning for a fast-path router query
DEBUG: Creating router plan
DEBUG: Plan is router executable
PREPARE null_update_on_text_param_and_in_2(text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1, 'test'); PREPARE null_update_on_text_param_and_in_2(text) AS UPDATE text_dist_column SET value = '' WHERE key IN ($1, 'test');
EXECUTE null_update_on_text_param_and_in_2(NULL); EXECUTE null_update_on_text_param_and_in_2(NULL);
DEBUG: Creating router plan DEBUG: Creating router plan

View File

@ -258,4 +258,20 @@ SELECT count(*) FROM orders_hash_partitioned
SELECT count(*) FROM orders_hash_partitioned SELECT count(*) FROM orders_hash_partitioned
WHERE o_orderkey = 1 OR o_orderkey IS NOT NULL; WHERE o_orderkey = 1 OR o_orderkey IS NOT NULL;
-- Check that NOT is handled with NEQs ORed
SELECT count(*) FROM orders_hash_partitioned
WHERE NOT (o_orderkey != 2 OR o_orderkey != 3);
-- Check that NOT is handled with EQs ORed
SELECT count(*) FROM orders_hash_partitioned
WHERE NOT (o_orderkey = 2 OR o_orderkey = 3);
-- Check that NOT is handled with NEQs ANDed
SELECT count(*) FROM orders_hash_partitioned
WHERE NOT (o_orderkey != 2 AND o_orderkey != 3);
-- Check that NOT is handled with EQs ANDed
SELECT count(*) FROM orders_hash_partitioned
WHERE NOT (o_orderkey = 2 AND o_orderkey = 3);
SET client_min_messages TO DEFAULT; SET client_min_messages TO DEFAULT;