Add a helper function to check explain has a single task

In order to avoid adding an alternative output, a function to check if a
given explan plan has a single task added. This doesn't change what the
changed tests intend to do.
pull/5209/head
Sait Talha Nisanci 2021-08-24 09:06:29 +03:00
parent e0faf34417
commit e7607b6bed
4 changed files with 101 additions and 70 deletions

View File

@ -226,78 +226,55 @@ EXPLAIN (COSTS FALSE) INSERT INTO sensors_2003 VALUES (3, '2003-01-01', row_to_j
-> Result -> Result
(7 rows) (7 rows)
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors WHERE measureid = 3 AND eventdatetime = '2000-02-02'; EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors WHERE measureid = 3 AND eventdatetime = '2000-02-02';
QUERY PLAN $$
);
explain_has_single_task
--------------------------------------------------------------------- ---------------------------------------------------------------------
Custom Scan (Citus Adaptive) t
Task Count: 1 (1 row)
Tasks Shown: All
-> Task
Node: host=localhost port=xxxxx dbname=regression
-> Aggregate
-> Index Only Scan using sensors_2000_pkey_2580005 on sensors_2000_2580005 sensors
Index Cond: ((measureid = 3) AND (eventdatetime = '2000-02-02'::date))
(8 rows)
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2000 WHERE measureid = 3;
QUERY PLAN
---------------------------------------------------------------------
Custom Scan (Citus Adaptive)
Task Count: 1
Tasks Shown: All
-> Task
Node: host=localhost port=xxxxx dbname=regression
-> Aggregate
-> Bitmap Heap Scan on sensors_2000_2580005 sensors_xxx
Recheck Cond: (measureid = 3)
-> Bitmap Index Scan on sensors_2000_pkey_2580005
Index Cond: (measureid = 3)
(10 rows)
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2001 WHERE measureid = 3;
QUERY PLAN
---------------------------------------------------------------------
Custom Scan (Citus Adaptive)
Task Count: 1
Tasks Shown: All
-> Task
Node: host=localhost port=xxxxx dbname=regression
-> Aggregate
-> Bitmap Heap Scan on sensors_2001_2580009 sensors_xxx
Recheck Cond: (measureid = 3)
-> Bitmap Index Scan on sensors_2001_pkey_2580009
Index Cond: (measureid = 3)
(10 rows)
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2002 WHERE measureid = 3;
QUERY PLAN
---------------------------------------------------------------------
Custom Scan (Citus Adaptive)
Task Count: 1
Tasks Shown: All
-> Task
Node: host=localhost port=xxxxx dbname=regression
-> Aggregate
-> Bitmap Heap Scan on sensors_2002_2580013 sensors_xxx
Recheck Cond: (measureid = 3)
-> Bitmap Index Scan on sensors_2002_pkey_2580013
Index Cond: (measureid = 3)
(10 rows)
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2003 WHERE measureid = 3; EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2003 WHERE measureid = 3;
QUERY PLAN $$
);
explain_has_single_task
--------------------------------------------------------------------- ---------------------------------------------------------------------
Custom Scan (Citus Adaptive) t
Task Count: 1 (1 row)
Tasks Shown: All
-> Task SELECT public.explain_has_single_task(
Node: host=localhost port=xxxxx dbname=regression $$
-> Aggregate EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2000 WHERE measureid = 3;
-> Bitmap Heap Scan on sensors_2003_2580017 sensors_xxx $$
Recheck Cond: (measureid = 3) );
-> Bitmap Index Scan on sensors_2003_pkey_2580017 explain_has_single_task
Index Cond: (measureid = 3) ---------------------------------------------------------------------
(10 rows) t
(1 row)
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2001 WHERE measureid = 3;
$$
);
explain_has_single_task
---------------------------------------------------------------------
t
(1 row)
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2002 WHERE measureid = 3;
$$
);
explain_has_single_task
---------------------------------------------------------------------
t
(1 row)
-- execute 7 times to make sure it is re-cached -- execute 7 times to make sure it is re-cached
EXECUTE drop_col_prepare_insert(3, '2000-10-01', row_to_json(row(1))); EXECUTE drop_col_prepare_insert(3, '2000-10-01', row_to_json(row(1)));

View File

@ -57,6 +57,20 @@ BEGIN
END LOOP; END LOOP;
RETURN false; RETURN false;
END; $$ language plpgsql; END; $$ language plpgsql;
--helper function to check there is a single task
CREATE OR REPLACE FUNCTION explain_has_single_task(explain_command text)
RETURNS BOOLEAN AS $$
DECLARE
query_plan text;
BEGIN
FOR query_plan IN EXECUTE explain_command LOOP
IF query_plan ILIKE '%Task Count: 1%'
THEN
RETURN true;
END IF;
END LOOP;
RETURN false;
END; $$ language plpgsql;
-- helper function to quickly run SQL on the whole cluster -- helper function to quickly run SQL on the whole cluster
CREATE OR REPLACE FUNCTION run_command_on_coordinator_and_workers(p_sql text) CREATE OR REPLACE FUNCTION run_command_on_coordinator_and_workers(p_sql text)
RETURNS void LANGUAGE plpgsql AS $$ RETURNS void LANGUAGE plpgsql AS $$

View File

@ -111,11 +111,36 @@ EXPLAIN (COSTS FALSE) INSERT INTO sensors_2001 VALUES (3, '2001-01-01', row_to_j
EXPLAIN (COSTS FALSE) INSERT INTO sensors_2002 VALUES (3, '2002-01-01', row_to_json(row(1))); EXPLAIN (COSTS FALSE) INSERT INTO sensors_2002 VALUES (3, '2002-01-01', row_to_json(row(1)));
EXPLAIN (COSTS FALSE) INSERT INTO sensors_2003 VALUES (3, '2003-01-01', row_to_json(row(1))); EXPLAIN (COSTS FALSE) INSERT INTO sensors_2003 VALUES (3, '2003-01-01', row_to_json(row(1)));
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors WHERE measureid = 3 AND eventdatetime = '2000-02-02'; EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors WHERE measureid = 3 AND eventdatetime = '2000-02-02';
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2000 WHERE measureid = 3; $$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2001 WHERE measureid = 3; );
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2002 WHERE measureid = 3;
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2003 WHERE measureid = 3; EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2003 WHERE measureid = 3;
$$
);
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2000 WHERE measureid = 3;
$$
);
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2001 WHERE measureid = 3;
$$
);
SELECT public.explain_has_single_task(
$$
EXPLAIN (COSTS FALSE) SELECT count(*) FROM sensors_2002 WHERE measureid = 3;
$$
);
-- execute 7 times to make sure it is re-cached -- execute 7 times to make sure it is re-cached
EXECUTE drop_col_prepare_insert(3, '2000-10-01', row_to_json(row(1))); EXECUTE drop_col_prepare_insert(3, '2000-10-01', row_to_json(row(1)));

View File

@ -63,6 +63,21 @@ BEGIN
RETURN false; RETURN false;
END; $$ language plpgsql; END; $$ language plpgsql;
--helper function to check there is a single task
CREATE OR REPLACE FUNCTION explain_has_single_task(explain_command text)
RETURNS BOOLEAN AS $$
DECLARE
query_plan text;
BEGIN
FOR query_plan IN EXECUTE explain_command LOOP
IF query_plan ILIKE '%Task Count: 1%'
THEN
RETURN true;
END IF;
END LOOP;
RETURN false;
END; $$ language plpgsql;
-- helper function to quickly run SQL on the whole cluster -- helper function to quickly run SQL on the whole cluster
CREATE OR REPLACE FUNCTION run_command_on_coordinator_and_workers(p_sql text) CREATE OR REPLACE FUNCTION run_command_on_coordinator_and_workers(p_sql text)
RETURNS void LANGUAGE plpgsql AS $$ RETURNS void LANGUAGE plpgsql AS $$