-- This file and its contents are licensed under the Apache License 2.0.
-- Please see the included NOTICE for copyright information and
-- LICENSE-APACHE for a copy of the license.
-- PG13 introduced parallel VACUUM functionality. It gets invoked when a table
-- has two or more indexes on it. Read up more at
-- https://www.postgresql.org/docs/13/sql-vacuum.html#PARALLEL
CREATE TABLE vacuum_test(time timestamp NOT NULL, temp1 float, temp2 int);
-- create hypertable
-- we create chunks in public schema cause otherwise we would need
-- elevated privileges to create indexes directly
SELECT create_hypertable('vacuum_test', 'time', create_default_indexes => false, associated_schema_name => 'public');
WARNING:  column type "timestamp without time zone" used for "time" does not follow best practices
    create_hypertable     
--------------------------
 (1,public,vacuum_test,t)

-- parallel vacuum needs the index size to be larger than min_parallel_index_scan_size to kick in
SET min_parallel_index_scan_size TO 0;
INSERT INTO vacuum_test SELECT TIMESTAMP 'epoch' + (i * INTERVAL '4h'),
                i, i+1 FROM generate_series(1, 100) as T(i);
-- create indexes on the temp columns
-- we create indexes manually because otherwise vacuum verbose output
-- would be different between 13.2 and 13.3+
-- 13.2 would try to vacuum the parent table index too while 13.3+ wouldn't
CREATE INDEX ON _hyper_1_1_chunk(time);
CREATE INDEX ON _hyper_1_1_chunk(temp1);
CREATE INDEX ON _hyper_1_1_chunk(temp2);
CREATE INDEX ON _hyper_1_2_chunk(time);
CREATE INDEX ON _hyper_1_2_chunk(temp1);
CREATE INDEX ON _hyper_1_2_chunk(temp2);
CREATE INDEX ON _hyper_1_3_chunk(time);
CREATE INDEX ON _hyper_1_3_chunk(temp1);
CREATE INDEX ON _hyper_1_3_chunk(temp2);
-- INSERT only will not trigger vacuum on indexes for PG13.3+
UPDATE vacuum_test SET time = time + '1s'::interval, temp1 = random(), temp2 = random();
-- we should see two parallel workers for each chunk
VACUUM (PARALLEL 3) vacuum_test;
DROP TABLE vacuum_test;
