diff --git a/src/test/regress/expected/multi_null_minmax_value_pruning.out b/src/test/regress/expected/multi_null_minmax_value_pruning.out index fe294b5ae..852215fef 100644 --- a/src/test/regress/expected/multi_null_minmax_value_pruning.out +++ b/src/test/regress/expected/multi_null_minmax_value_pruning.out @@ -3,14 +3,6 @@ -- -- This test checks that we can handle null min/max values in shard statistics -- and that we don't partition or join prune shards that have null values. --- print major version number for version-specific tests -SHOW server_version \gset -SELECT substring(:'server_version', '\d+')::int > 10 AS server_version_above_ten; - server_version_above_ten --------------------------- - t -(1 row) - SET client_min_messages TO DEBUG2; SET citus.explain_all_tasks TO on; -- to avoid differing explain output - executor doesn't matter, @@ -33,34 +25,19 @@ SELECT shardminvalue, shardmaxvalue from pg_dist_shard WHERE shardid = 290001; -- Check that partition and join pruning works when min/max values exist -- Adding l_orderkey = 1 to make the query not router executable +SELECT coordinator_plan($Q$ EXPLAIN (COSTS FALSE) SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030 or l_orderkey = 1; +$Q$); DEBUG: Router planner does not support append-partitioned tables. +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement LOG: join order: [ "lineitem" ] - QUERY PLAN ------------------------------------------------------------------------ +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement + coordinator_plan +------------------------------ Custom Scan (Citus Adaptive) Task Count: 2 - Tasks Shown: All - -> Task - Node: host=localhost port=57637 dbname=regression - -> Bitmap Heap Scan on lineitem_290001 lineitem - Recheck Cond: ((l_orderkey = 9030) OR (l_orderkey = 1)) - -> BitmapOr - -> Bitmap Index Scan on lineitem_pkey_290001 - Index Cond: (l_orderkey = 9030) - -> Bitmap Index Scan on lineitem_pkey_290001 - Index Cond: (l_orderkey = 1) - -> Task - Node: host=localhost port=57638 dbname=regression - -> Bitmap Heap Scan on lineitem_290000 lineitem - Recheck Cond: ((l_orderkey = 9030) OR (l_orderkey = 1)) - -> BitmapOr - -> Bitmap Index Scan on lineitem_pkey_290000 - Index Cond: (l_orderkey = 9030) - -> Bitmap Index Scan on lineitem_pkey_290000 - Index Cond: (l_orderkey = 1) -(21 rows) +(2 rows) EXPLAIN (COSTS FALSE) SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders @@ -97,24 +74,19 @@ DEBUG: join prunable for intervals [8997,14947] and [1,5986] -- partition or join pruning for the shard with null min value. Since it is not -- supported with single-repartition join, dual-repartition has been used. UPDATE pg_dist_shard SET shardminvalue = NULL WHERE shardid = 290000; +SELECT coordinator_plan($Q$ EXPLAIN (COSTS FALSE) SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; +$Q$); DEBUG: Router planner does not support append-partitioned tables. +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement LOG: join order: [ "lineitem" ] - QUERY PLAN -------------------------------------------------------------------------------- +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement + coordinator_plan +------------------------------ Custom Scan (Citus Adaptive) Task Count: 2 - Tasks Shown: All - -> Task - Node: host=localhost port=57637 dbname=regression - -> Index Scan using lineitem_pkey_290001 on lineitem_290001 lineitem - Index Cond: (l_orderkey = 9030) - -> Task - Node: host=localhost port=57638 dbname=regression - -> Index Scan using lineitem_pkey_290000 on lineitem_290000 lineitem - Index Cond: (l_orderkey = 9030) -(11 rows) +(2 rows) EXPLAIN (COSTS FALSE) SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders @@ -169,24 +141,19 @@ HINT: Since you enabled citus.enable_repartition_joins Citus chose to use task- -- don't apply partition or join pruning for this other shard either. Since it -- is not supported with single-repartition join, dual-repartition has been used. UPDATE pg_dist_shard SET shardmaxvalue = NULL WHERE shardid = 290001; +SELECT coordinator_plan($Q$ EXPLAIN (COSTS FALSE) SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; +$Q$); DEBUG: Router planner does not support append-partitioned tables. +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement LOG: join order: [ "lineitem" ] - QUERY PLAN -------------------------------------------------------------------------------- +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement + coordinator_plan +------------------------------ Custom Scan (Citus Adaptive) Task Count: 2 - Tasks Shown: All - -> Task - Node: host=localhost port=57637 dbname=regression - -> Index Scan using lineitem_pkey_290001 on lineitem_290001 lineitem - Index Cond: (l_orderkey = 9030) - -> Task - Node: host=localhost port=57638 dbname=regression - -> Index Scan using lineitem_pkey_290000 on lineitem_290000 lineitem - Index Cond: (l_orderkey = 9030) -(11 rows) +(2 rows) EXPLAIN (COSTS FALSE) SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders @@ -241,21 +208,21 @@ HINT: Since you enabled citus.enable_repartition_joins Citus chose to use task- -- should apply partition and join pruning for this shard now. Since it is not -- supported with single-repartition join, dual-repartition has been used. UPDATE pg_dist_shard SET shardminvalue = '0' WHERE shardid = 290000; +SELECT coordinator_plan($Q$ EXPLAIN (COSTS FALSE) SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; +$Q$); DEBUG: Router planner does not support append-partitioned tables. +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement LOG: join order: [ "lineitem" ] +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement DEBUG: Plan is router executable - QUERY PLAN -------------------------------------------------------------------------------- +CONTEXT: PL/pgSQL function coordinator_plan(text) line 3 at FOR over EXECUTE statement + coordinator_plan +------------------------------ Custom Scan (Citus Adaptive) Task Count: 1 - Tasks Shown: All - -> Task - Node: host=localhost port=57637 dbname=regression - -> Index Scan using lineitem_pkey_290001 on lineitem_290001 lineitem - Index Cond: (l_orderkey = 9030) -(7 rows) +(2 rows) EXPLAIN (COSTS FALSE) SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders diff --git a/src/test/regress/expected/multi_null_minmax_value_pruning_0.out b/src/test/regress/expected/multi_null_minmax_value_pruning_0.out deleted file mode 100644 index a047dd7c2..000000000 --- a/src/test/regress/expected/multi_null_minmax_value_pruning_0.out +++ /dev/null @@ -1,312 +0,0 @@ --- --- MULTI_NULL_MINMAX_VALUE_PRUNING --- --- This test checks that we can handle null min/max values in shard statistics --- and that we don't partition or join prune shards that have null values. --- print major version number for version-specific tests -SHOW server_version \gset -SELECT substring(:'server_version', '\d+')::int > 10 AS server_version_above_ten; - server_version_above_ten --------------------------- - f -(1 row) - -SET client_min_messages TO DEBUG2; -SET citus.explain_all_tasks TO on; --- to avoid differing explain output - executor doesn't matter, --- because were testing pruning here. -RESET citus.task_executor_type; --- Change configuration to treat lineitem and orders tables as large -SET citus.log_multi_join_order to true; -SET citus.enable_repartition_joins to ON; -SELECT shardminvalue, shardmaxvalue from pg_dist_shard WHERE shardid = 290000; - shardminvalue | shardmaxvalue ----------------+--------------- - 1 | 5986 -(1 row) - -SELECT shardminvalue, shardmaxvalue from pg_dist_shard WHERE shardid = 290001; - shardminvalue | shardmaxvalue ----------------+--------------- - 8997 | 14947 -(1 row) - --- Check that partition and join pruning works when min/max values exist --- Adding l_orderkey = 1 to make the query not router executable -EXPLAIN (COSTS FALSE) -SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030 or l_orderkey = 1; -DEBUG: Router planner does not support append-partitioned tables. -LOG: join order: [ "lineitem" ] - QUERY PLAN ------------------------------------------------------------------------ - Custom Scan (Citus Adaptive) - Task Count: 2 - Tasks Shown: All - -> Task - Node: host=localhost port=57637 dbname=regression - -> Bitmap Heap Scan on lineitem_290001 lineitem - Recheck Cond: ((l_orderkey = 9030) OR (l_orderkey = 1)) - -> BitmapOr - -> Bitmap Index Scan on lineitem_pkey_290001 - Index Cond: (l_orderkey = 9030) - -> Bitmap Index Scan on lineitem_pkey_290001 - Index Cond: (l_orderkey = 1) - -> Task - Node: host=localhost port=57638 dbname=regression - -> Bitmap Heap Scan on lineitem_290000 lineitem - Recheck Cond: ((l_orderkey = 9030) OR (l_orderkey = 1)) - -> BitmapOr - -> Bitmap Index Scan on lineitem_pkey_290000 - Index Cond: (l_orderkey = 9030) - -> Bitmap Index Scan on lineitem_pkey_290000 - Index Cond: (l_orderkey = 1) -(21 rows) - -EXPLAIN (COSTS FALSE) -SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders - WHERE l_orderkey = o_orderkey; -DEBUG: Router planner does not support append-partitioned tables. -LOG: join order: [ "lineitem" ][ local partition join "orders" ] -DEBUG: join prunable for intervals [1,5986] and [8997,14947] -DEBUG: join prunable for intervals [8997,14947] and [1,5986] - QUERY PLAN --------------------------------------------------------------------------------- - Aggregate - -> Custom Scan (Citus Adaptive) - Task Count: 2 - Tasks Shown: All - -> Task - Node: host=localhost port=57638 dbname=regression - -> Aggregate - -> Hash Join - Hash Cond: (lineitem.l_orderkey = orders.o_orderkey) - -> Seq Scan on lineitem_290000 lineitem - -> Hash - -> Seq Scan on orders_290002 orders - -> Task - Node: host=localhost port=57637 dbname=regression - -> Aggregate - -> Hash Join - Hash Cond: (lineitem.l_orderkey = orders.o_orderkey) - -> Seq Scan on lineitem_290001 lineitem - -> Hash - -> Seq Scan on orders_290003 orders -(20 rows) - --- Now set the minimum value for a shard to null. Then check that we don't apply --- partition or join pruning for the shard with null min value. Since it is not --- supported with single-repartition join, dual-repartition has been used. -UPDATE pg_dist_shard SET shardminvalue = NULL WHERE shardid = 290000; -EXPLAIN (COSTS FALSE) -SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; -DEBUG: Router planner does not support append-partitioned tables. -LOG: join order: [ "lineitem" ] - QUERY PLAN -------------------------------------------------------------------------------- - Custom Scan (Citus Adaptive) - Task Count: 2 - Tasks Shown: All - -> Task - Node: host=localhost port=57637 dbname=regression - -> Index Scan using lineitem_pkey_290001 on lineitem_290001 lineitem - Index Cond: (l_orderkey = 9030) - -> Task - Node: host=localhost port=57638 dbname=regression - -> Index Scan using lineitem_pkey_290000 on lineitem_290000 lineitem - Index Cond: (l_orderkey = 9030) -(11 rows) - -EXPLAIN (COSTS FALSE) -SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders - WHERE l_partkey = o_custkey; -DEBUG: Router planner does not support append-partitioned tables. -LOG: join order: [ "lineitem" ][ dual partition join "orders" ] -DEBUG: join prunable for task partitionId 0 and 1 -DEBUG: join prunable for task partitionId 0 and 2 -DEBUG: join prunable for task partitionId 0 and 3 -DEBUG: join prunable for task partitionId 1 and 0 -DEBUG: join prunable for task partitionId 1 and 2 -DEBUG: join prunable for task partitionId 1 and 3 -DEBUG: join prunable for task partitionId 2 and 0 -DEBUG: join prunable for task partitionId 2 and 1 -DEBUG: join prunable for task partitionId 2 and 3 -DEBUG: join prunable for task partitionId 3 and 0 -DEBUG: join prunable for task partitionId 3 and 1 -DEBUG: join prunable for task partitionId 3 and 2 -DEBUG: pruning merge fetch taskId 1 -DETAIL: Creating dependency on merge taskId 3 -DEBUG: pruning merge fetch taskId 2 -DETAIL: Creating dependency on merge taskId 3 -DEBUG: pruning merge fetch taskId 4 -DETAIL: Creating dependency on merge taskId 6 -DEBUG: pruning merge fetch taskId 5 -DETAIL: Creating dependency on merge taskId 6 -DEBUG: pruning merge fetch taskId 7 -DETAIL: Creating dependency on merge taskId 9 -DEBUG: pruning merge fetch taskId 8 -DETAIL: Creating dependency on merge taskId 9 -DEBUG: pruning merge fetch taskId 10 -DETAIL: Creating dependency on merge taskId 12 -DEBUG: pruning merge fetch taskId 11 -DETAIL: Creating dependency on merge taskId 12 -DEBUG: cannot use real time executor with repartition jobs -HINT: Since you enabled citus.enable_repartition_joins Citus chose to use task-tracker. - QUERY PLAN -------------------------------------------------------------------- - Aggregate - -> Custom Scan (Citus Task-Tracker) - Task Count: 4 - Tasks Shown: None, not supported for re-partition queries - -> MapMergeJob - Map Task Count: 2 - Merge Task Count: 4 - -> MapMergeJob - Map Task Count: 2 - Merge Task Count: 4 -(10 rows) - --- Next, set the maximum value for another shard to null. Then check that we --- don't apply partition or join pruning for this other shard either. Since it --- is not supported with single-repartition join, dual-repartition has been used. -UPDATE pg_dist_shard SET shardmaxvalue = NULL WHERE shardid = 290001; -EXPLAIN (COSTS FALSE) -SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; -DEBUG: Router planner does not support append-partitioned tables. -LOG: join order: [ "lineitem" ] - QUERY PLAN -------------------------------------------------------------------------------- - Custom Scan (Citus Adaptive) - Task Count: 2 - Tasks Shown: All - -> Task - Node: host=localhost port=57638 dbname=regression - -> Index Scan using lineitem_pkey_290000 on lineitem_290000 lineitem - Index Cond: (l_orderkey = 9030) - -> Task - Node: host=localhost port=57637 dbname=regression - -> Index Scan using lineitem_pkey_290001 on lineitem_290001 lineitem - Index Cond: (l_orderkey = 9030) -(11 rows) - -EXPLAIN (COSTS FALSE) -SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders - WHERE l_partkey = o_custkey; -DEBUG: Router planner does not support append-partitioned tables. -LOG: join order: [ "lineitem" ][ dual partition join "orders" ] -DEBUG: join prunable for task partitionId 0 and 1 -DEBUG: join prunable for task partitionId 0 and 2 -DEBUG: join prunable for task partitionId 0 and 3 -DEBUG: join prunable for task partitionId 1 and 0 -DEBUG: join prunable for task partitionId 1 and 2 -DEBUG: join prunable for task partitionId 1 and 3 -DEBUG: join prunable for task partitionId 2 and 0 -DEBUG: join prunable for task partitionId 2 and 1 -DEBUG: join prunable for task partitionId 2 and 3 -DEBUG: join prunable for task partitionId 3 and 0 -DEBUG: join prunable for task partitionId 3 and 1 -DEBUG: join prunable for task partitionId 3 and 2 -DEBUG: pruning merge fetch taskId 1 -DETAIL: Creating dependency on merge taskId 3 -DEBUG: pruning merge fetch taskId 2 -DETAIL: Creating dependency on merge taskId 3 -DEBUG: pruning merge fetch taskId 4 -DETAIL: Creating dependency on merge taskId 6 -DEBUG: pruning merge fetch taskId 5 -DETAIL: Creating dependency on merge taskId 6 -DEBUG: pruning merge fetch taskId 7 -DETAIL: Creating dependency on merge taskId 9 -DEBUG: pruning merge fetch taskId 8 -DETAIL: Creating dependency on merge taskId 9 -DEBUG: pruning merge fetch taskId 10 -DETAIL: Creating dependency on merge taskId 12 -DEBUG: pruning merge fetch taskId 11 -DETAIL: Creating dependency on merge taskId 12 -DEBUG: cannot use real time executor with repartition jobs -HINT: Since you enabled citus.enable_repartition_joins Citus chose to use task-tracker. - QUERY PLAN -------------------------------------------------------------------- - Aggregate - -> Custom Scan (Citus Task-Tracker) - Task Count: 4 - Tasks Shown: None, not supported for re-partition queries - -> MapMergeJob - Map Task Count: 2 - Merge Task Count: 4 - -> MapMergeJob - Map Task Count: 2 - Merge Task Count: 4 -(10 rows) - --- Last, set the minimum value to 0 and check that we don't treat it as null. We --- should apply partition and join pruning for this shard now. Since it is not --- supported with single-repartition join, dual-repartition has been used. -UPDATE pg_dist_shard SET shardminvalue = '0' WHERE shardid = 290000; -EXPLAIN (COSTS FALSE) -SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; -DEBUG: Router planner does not support append-partitioned tables. -LOG: join order: [ "lineitem" ] -DEBUG: Plan is router executable - QUERY PLAN -------------------------------------------------------------------------------- - Custom Scan (Citus Adaptive) - Task Count: 1 - Tasks Shown: All - -> Task - Node: host=localhost port=57637 dbname=regression - -> Index Scan using lineitem_pkey_290001 on lineitem_290001 lineitem - Index Cond: (l_orderkey = 9030) -(7 rows) - -EXPLAIN (COSTS FALSE) -SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders - WHERE l_partkey = o_custkey; -DEBUG: Router planner does not support append-partitioned tables. -LOG: join order: [ "lineitem" ][ dual partition join "orders" ] -DEBUG: join prunable for task partitionId 0 and 1 -DEBUG: join prunable for task partitionId 0 and 2 -DEBUG: join prunable for task partitionId 0 and 3 -DEBUG: join prunable for task partitionId 1 and 0 -DEBUG: join prunable for task partitionId 1 and 2 -DEBUG: join prunable for task partitionId 1 and 3 -DEBUG: join prunable for task partitionId 2 and 0 -DEBUG: join prunable for task partitionId 2 and 1 -DEBUG: join prunable for task partitionId 2 and 3 -DEBUG: join prunable for task partitionId 3 and 0 -DEBUG: join prunable for task partitionId 3 and 1 -DEBUG: join prunable for task partitionId 3 and 2 -DEBUG: pruning merge fetch taskId 1 -DETAIL: Creating dependency on merge taskId 3 -DEBUG: pruning merge fetch taskId 2 -DETAIL: Creating dependency on merge taskId 3 -DEBUG: pruning merge fetch taskId 4 -DETAIL: Creating dependency on merge taskId 6 -DEBUG: pruning merge fetch taskId 5 -DETAIL: Creating dependency on merge taskId 6 -DEBUG: pruning merge fetch taskId 7 -DETAIL: Creating dependency on merge taskId 9 -DEBUG: pruning merge fetch taskId 8 -DETAIL: Creating dependency on merge taskId 9 -DEBUG: pruning merge fetch taskId 10 -DETAIL: Creating dependency on merge taskId 12 -DEBUG: pruning merge fetch taskId 11 -DETAIL: Creating dependency on merge taskId 12 -DEBUG: cannot use real time executor with repartition jobs -HINT: Since you enabled citus.enable_repartition_joins Citus chose to use task-tracker. - QUERY PLAN -------------------------------------------------------------------- - Aggregate - -> Custom Scan (Citus Task-Tracker) - Task Count: 4 - Tasks Shown: None, not supported for re-partition queries - -> MapMergeJob - Map Task Count: 2 - Merge Task Count: 4 - -> MapMergeJob - Map Task Count: 2 - Merge Task Count: 4 -(10 rows) - --- Set minimum and maximum values for two shards back to their original values -UPDATE pg_dist_shard SET shardminvalue = '1' WHERE shardid = 290000; -UPDATE pg_dist_shard SET shardmaxvalue = '14947' WHERE shardid = 290001; -SET client_min_messages TO NOTICE; diff --git a/src/test/regress/sql/multi_null_minmax_value_pruning.sql b/src/test/regress/sql/multi_null_minmax_value_pruning.sql index 89fc26731..843898daa 100644 --- a/src/test/regress/sql/multi_null_minmax_value_pruning.sql +++ b/src/test/regress/sql/multi_null_minmax_value_pruning.sql @@ -6,10 +6,6 @@ -- and that we don't partition or join prune shards that have null values. --- print major version number for version-specific tests -SHOW server_version \gset -SELECT substring(:'server_version', '\d+')::int > 10 AS server_version_above_ten; - SET client_min_messages TO DEBUG2; SET citus.explain_all_tasks TO on; -- to avoid differing explain output - executor doesn't matter, @@ -26,8 +22,10 @@ SELECT shardminvalue, shardmaxvalue from pg_dist_shard WHERE shardid = 290001; -- Check that partition and join pruning works when min/max values exist -- Adding l_orderkey = 1 to make the query not router executable +SELECT coordinator_plan($Q$ EXPLAIN (COSTS FALSE) SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030 or l_orderkey = 1; +$Q$); EXPLAIN (COSTS FALSE) SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders @@ -39,8 +37,10 @@ SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders UPDATE pg_dist_shard SET shardminvalue = NULL WHERE shardid = 290000; +SELECT coordinator_plan($Q$ EXPLAIN (COSTS FALSE) SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; +$Q$); EXPLAIN (COSTS FALSE) SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders @@ -52,8 +52,10 @@ SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders UPDATE pg_dist_shard SET shardmaxvalue = NULL WHERE shardid = 290001; +SELECT coordinator_plan($Q$ EXPLAIN (COSTS FALSE) SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; +$Q$); EXPLAIN (COSTS FALSE) SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders @@ -65,8 +67,10 @@ SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders UPDATE pg_dist_shard SET shardminvalue = '0' WHERE shardid = 290000; +SELECT coordinator_plan($Q$ EXPLAIN (COSTS FALSE) SELECT l_orderkey, l_linenumber, l_shipdate FROM lineitem WHERE l_orderkey = 9030; +$Q$); EXPLAIN (COSTS FALSE) SELECT sum(l_linenumber), avg(l_linenumber) FROM lineitem, orders