mirror of https://github.com/citusdata/citus.git
Columnar: always disable parallel paths. (#4617)
Previously, if columnar.enable_custom_scan was false, parallel paths could remain, leading to an unexpected error. Also, ensure that cheapest_parameterized_paths is cleared if a custom scan is used. Co-authored-by: Jeff Davis <jefdavi@microsoft.com>pull/4619/head
parent
3ca0b6146b
commit
e195af7e72
|
@ -139,11 +139,12 @@ columnar_customscan_init()
|
||||||
static void
|
static void
|
||||||
clear_paths(RelOptInfo *rel)
|
clear_paths(RelOptInfo *rel)
|
||||||
{
|
{
|
||||||
rel->pathlist = NULL;
|
rel->pathlist = NIL;
|
||||||
rel->partial_pathlist = NULL;
|
rel->partial_pathlist = NIL;
|
||||||
rel->cheapest_startup_path = NULL;
|
rel->cheapest_startup_path = NULL;
|
||||||
rel->cheapest_total_path = NULL;
|
rel->cheapest_total_path = NULL;
|
||||||
rel->cheapest_unique_path = NULL;
|
rel->cheapest_unique_path = NULL;
|
||||||
|
rel->cheapest_parameterized_paths = NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -157,12 +158,6 @@ ColumnarSetRelPathlistHook(PlannerInfo *root, RelOptInfo *rel, Index rti,
|
||||||
PreviousSetRelPathlistHook(root, rel, rti, rte);
|
PreviousSetRelPathlistHook(root, rel, rti, rte);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!EnableColumnarCustomScan)
|
|
||||||
{
|
|
||||||
/* custon scans are disabled, use normal table access method api instead */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!OidIsValid(rte->relid) || rte->rtekind != RTE_RELATION)
|
if (!OidIsValid(rte->relid) || rte->rtekind != RTE_RELATION)
|
||||||
{
|
{
|
||||||
/* some calls to the pathlist hook don't have a valid relation set. Do nothing */
|
/* some calls to the pathlist hook don't have a valid relation set. Do nothing */
|
||||||
|
@ -183,6 +178,11 @@ ColumnarSetRelPathlistHook(PlannerInfo *root, RelOptInfo *rel, Index rti,
|
||||||
errmsg("sample scans not supported on columnar tables")));
|
errmsg("sample scans not supported on columnar tables")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* columnar doesn't support parallel paths */
|
||||||
|
rel->partial_pathlist = NIL;
|
||||||
|
|
||||||
|
if (EnableColumnarCustomScan)
|
||||||
|
{
|
||||||
Path *customPath = CreateColumnarScanPath(root, rel, rte);
|
Path *customPath = CreateColumnarScanPath(root, rel, rte);
|
||||||
|
|
||||||
ereport(DEBUG1, (errmsg("pathlist hook for columnar table am")));
|
ereport(DEBUG1, (errmsg("pathlist hook for columnar table am")));
|
||||||
|
@ -191,6 +191,7 @@ ColumnarSetRelPathlistHook(PlannerInfo *root, RelOptInfo *rel, Index rti,
|
||||||
clear_paths(rel);
|
clear_paths(rel);
|
||||||
add_path(rel, customPath);
|
add_path(rel, customPath);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
RelationClose(relation);
|
RelationClose(relation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ test: am_query
|
||||||
test: am_analyze
|
test: am_analyze
|
||||||
test: am_data_types
|
test: am_data_types
|
||||||
test: am_drop
|
test: am_drop
|
||||||
|
test: columnar_fallback_scan
|
||||||
test: am_empty
|
test: am_empty
|
||||||
test: am_insert
|
test: am_insert
|
||||||
test: am_update_delete
|
test: am_update_delete
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
--
|
||||||
|
-- columnar_fallback_scan.sql
|
||||||
|
--
|
||||||
|
-- Test columnar.enable_custom_scan = false, which will use an
|
||||||
|
-- ordinary sequential scan. It won't benefit from projection pushdown
|
||||||
|
-- or qual pushdown, but it should return the correct results.
|
||||||
|
--
|
||||||
|
set columnar.enable_custom_scan = false;
|
||||||
|
create table fallback_scan(i int) using columnar;
|
||||||
|
-- large enough to test parallel_workers > 1
|
||||||
|
select alter_columnar_table_set('fallback_scan', compression => 'none');
|
||||||
|
alter_columnar_table_set
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
insert into fallback_scan select generate_series(1,150000);
|
||||||
|
vacuum analyze fallback_scan;
|
||||||
|
select count(*), min(i), max(i), avg(i) from fallback_scan;
|
||||||
|
count | min | max | avg
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
150000 | 1 | 150000 | 75000.500000000000
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Negative test: try to force a parallel plan with at least two
|
||||||
|
-- workers, but columnar should reject it and use a non-parallel scan.
|
||||||
|
--
|
||||||
|
set force_parallel_mode = regress;
|
||||||
|
set min_parallel_table_scan_size = 1;
|
||||||
|
set parallel_tuple_cost = 0;
|
||||||
|
set max_parallel_workers = 4;
|
||||||
|
set max_parallel_workers_per_gather = 4;
|
||||||
|
explain (costs off) select count(*), min(i), max(i), avg(i) from fallback_scan;
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
Aggregate
|
||||||
|
-> Seq Scan on fallback_scan
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
select count(*), min(i), max(i), avg(i) from fallback_scan;
|
||||||
|
count | min | max | avg
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
150000 | 1 | 150000 | 75000.500000000000
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
set force_parallel_mode to default;
|
||||||
|
set min_parallel_table_scan_size to default;
|
||||||
|
set parallel_tuple_cost to default;
|
||||||
|
set max_parallel_workers to default;
|
||||||
|
set max_parallel_workers_per_gather to default;
|
||||||
|
set columnar.enable_custom_scan to default;
|
||||||
|
drop table fallback_scan;
|
|
@ -0,0 +1,39 @@
|
||||||
|
--
|
||||||
|
-- columnar_fallback_scan.sql
|
||||||
|
--
|
||||||
|
-- Test columnar.enable_custom_scan = false, which will use an
|
||||||
|
-- ordinary sequential scan. It won't benefit from projection pushdown
|
||||||
|
-- or qual pushdown, but it should return the correct results.
|
||||||
|
--
|
||||||
|
|
||||||
|
set columnar.enable_custom_scan = false;
|
||||||
|
|
||||||
|
create table fallback_scan(i int) using columnar;
|
||||||
|
-- large enough to test parallel_workers > 1
|
||||||
|
select alter_columnar_table_set('fallback_scan', compression => 'none');
|
||||||
|
insert into fallback_scan select generate_series(1,150000);
|
||||||
|
vacuum analyze fallback_scan;
|
||||||
|
|
||||||
|
select count(*), min(i), max(i), avg(i) from fallback_scan;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Negative test: try to force a parallel plan with at least two
|
||||||
|
-- workers, but columnar should reject it and use a non-parallel scan.
|
||||||
|
--
|
||||||
|
set force_parallel_mode = regress;
|
||||||
|
set min_parallel_table_scan_size = 1;
|
||||||
|
set parallel_tuple_cost = 0;
|
||||||
|
set max_parallel_workers = 4;
|
||||||
|
set max_parallel_workers_per_gather = 4;
|
||||||
|
explain (costs off) select count(*), min(i), max(i), avg(i) from fallback_scan;
|
||||||
|
select count(*), min(i), max(i), avg(i) from fallback_scan;
|
||||||
|
|
||||||
|
set force_parallel_mode to default;
|
||||||
|
set min_parallel_table_scan_size to default;
|
||||||
|
set parallel_tuple_cost to default;
|
||||||
|
set max_parallel_workers to default;
|
||||||
|
set max_parallel_workers_per_gather to default;
|
||||||
|
|
||||||
|
set columnar.enable_custom_scan to default;
|
||||||
|
|
||||||
|
drop table fallback_scan;
|
Loading…
Reference in New Issue