From db5db35a329e2f303fb9bcbf0e0141d108d5e82b Mon Sep 17 00:00:00 2001 From: Jan Nidzwetzki Date: Sun, 17 Sep 2023 23:00:44 +0200 Subject: [PATCH] Propagate parameter changed to child nodes This patch ensures that changed parameters are propagated to the child nodes of the decompression nodes before a rescan is executed. Fixes: #6069 --- tsl/src/nodes/decompress_chunk/exec.c | 3 + tsl/test/expected/compression.out | 149 ++++++++++++++++++++++++++ tsl/test/sql/compression.sql | 83 ++++++++++++++ 3 files changed, 235 insertions(+) diff --git a/tsl/src/nodes/decompress_chunk/exec.c b/tsl/src/nodes/decompress_chunk/exec.c index cd09df47a87..38c05b03503 100644 --- a/tsl/src/nodes/decompress_chunk/exec.c +++ b/tsl/src/nodes/decompress_chunk/exec.c @@ -528,6 +528,9 @@ decompress_chunk_rescan(CustomScanState *node) Assert(bms_num_members(chunk_state->unused_batch_states) == chunk_state->n_batch_states); + if (node->ss.ps.chgParam != NULL) + UpdateChangedParamSet(linitial(node->custom_ps), node->ss.ps.chgParam); + ExecReScan(linitial(node->custom_ps)); } diff --git a/tsl/test/expected/compression.out b/tsl/test/expected/compression.out index f368f96a112..adfe262594d 100644 --- a/tsl/test/expected/compression.out +++ b/tsl/test/expected/compression.out @@ -2008,3 +2008,152 @@ SELECT * FROM ht_metrics_partially_compressed ORDER BY time DESC, device LIMIT 1 Output: _hyper_41_75_chunk."time", _hyper_41_75_chunk.device, _hyper_41_75_chunk.value (28 rows) +-- Test parameter change on rescan +-- issue 6069 +CREATE TABLE IF NOT EXISTS i6069 ( + timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL, + attr_id SMALLINT NOT NULL, + number_val DOUBLE PRECISION DEFAULT NULL +); +SELECT create_hypertable( + 'i6069', 'timestamp', + create_default_indexes => FALSE, if_not_exists => TRUE, chunk_time_interval => INTERVAL '1 day' +); +WARNING: column type "timestamp without time zone" used for "timestamp" does not follow best practices + create_hypertable +--------------------- + (43,public,i6069,t) +(1 row) + + +ALTER TABLE i6069 SET ( + timescaledb.compress, + timescaledb.compress_segmentby = 'attr_id' +); +INSERT INTO i6069 VALUES('2023-07-01', 1, 1),('2023-07-03', 2, 1),('2023-07-05', 3, 1), + ('2023-07-01', 4, 1),('2023-07-03', 5, 1),('2023-07-05', 6, 1), + ('2023-07-01', 7, 1),('2023-07-03', 8, 1),('2023-07-05', 9, 1), + ('2023-07-01', 10, 1),('2023-07-03', 11, 1),('2023-07-05', 12, 1), + ('2023-07-01', 13, 1),('2023-07-03', 14, 1),('2023-07-05', 15, 1), + ('2023-07-01', 16, 1),('2023-07-03', 17, 1),('2023-07-05', 18, 1), + ('2023-07-01', 19, 1),('2023-07-03', 20, 1),('2023-07-05', 21, 1), + ('2023-07-01', 22, 1),('2023-07-03', 23, 1),('2023-07-05', 24, 1), + ('2023-07-01', 25, 1),('2023-07-03', 26, 1),('2023-07-05', 27, 1), + ('2023-07-01', 28, 1),('2023-07-03', 29, 1),('2023-07-05', 30, 1), + ('2023-07-01', 31, 1),('2023-07-03', 32, 1),('2023-07-05', 33, 1), + ('2023-07-01', 34, 1),('2023-07-03', 35, 1),('2023-07-05', 36, 1), + ('2023-07-01', 37, 1),('2023-07-03', 38, 1),('2023-07-05', 39, 1), + ('2023-07-01', 40, 1),('2023-07-03', 41, 1),('2023-07-05', 42, 1), + ('2023-07-01', 43, 1),('2023-07-03', 44, 1),('2023-07-05', 45, 1), + ('2023-07-01', 46, 1),('2023-07-03', 47, 1),('2023-07-05', 48, 1), + ('2023-07-01', 49, 1),('2023-07-03', 50, 1),('2023-07-05', 51, 1), + ('2023-07-01', 52, 1),('2023-07-03', 53, 1),('2023-07-05', 54, 1), + ('2023-07-01', 55, 1),('2023-07-03', 56, 1),('2023-07-05', 57, 1), + ('2023-07-01', 58, 1),('2023-07-03', 59, 1),('2023-07-05', 60, 1), + ('2023-07-01', 61, 1),('2023-07-03', 62, 1),('2023-07-05', 63, 1), + ('2023-07-01', 64, 1),('2023-07-03', 65, 1),('2023-07-05', 66, 1), + ('2023-07-01', 67, 1),('2023-07-03', 68, 1),('2023-07-05', 69, 1), + ('2023-07-01', 70, 1),('2023-07-03', 71, 1),('2023-07-05', 72, 1), + ('2023-07-01', 73, 1),('2023-07-03', 74, 1),('2023-07-05', 75, 1), + ('2023-07-01', 76, 1),('2023-07-03', 77, 1),('2023-07-05', 78, 1), + ('2023-07-01', 79, 1),('2023-07-03', 80, 1),('2023-07-05', 81, 1), + ('2023-07-01', 82, 1),('2023-07-03', 83, 1),('2023-07-05', 84, 1), + ('2023-07-01', 85, 1),('2023-07-03', 86, 1),('2023-07-05', 87, 1), + ('2023-07-01', 88, 1),('2023-07-03', 89, 1),('2023-07-05', 90, 1), + ('2023-07-01', 91, 1),('2023-07-03', 92, 1),('2023-07-05', 93, 1), + ('2023-07-01', 94, 1),('2023-07-03', 95, 1),('2023-07-05', 96, 1), + ('2023-07-01', 97, 1),('2023-07-03', 98, 1),('2023-07-05', 99, 1), + ('2023-07-01', 100, 1),('2023-07-03', 101, 1),('2023-07-05', 102, 1), + ('2023-07-01', 103, 1),('2023-07-03', 104, 1),('2023-07-05', 105, 1), + ('2023-07-01', 106, 1),('2023-07-03', 107, 1),('2023-07-05', 108, 1), + ('2023-07-01', 109, 1),('2023-07-03', 110, 1),('2023-07-05', 111, 1), + ('2023-07-01', 112, 1),('2023-07-03', 113, 1),('2023-07-05', 114, 1), + ('2023-07-01', 115, 1),('2023-07-03', 116, 1),('2023-07-05', 117, 1), + ('2023-07-01', 118, 1),('2023-07-03', 119, 1),('2023-07-05', 120, 1); +SELECT compress_chunk(i, if_not_compressed => true) FROM show_chunks('i6069') i; + compress_chunk +------------------------------------------ + _timescaledb_internal._hyper_43_79_chunk + _timescaledb_internal._hyper_43_80_chunk + _timescaledb_internal._hyper_43_81_chunk +(3 rows) + +SET enable_indexscan = ON; +SET enable_seqscan = OFF; +:explain +SELECT * FROM ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) AS attr_ids(attr_id) +INNER JOIN LATERAL ( + SELECT * FROM i6069 + WHERE i6069.attr_id = attr_ids.attr_id AND + timestamp > '2023-06-30' AND timestamp < '2023-07-06' +ORDER BY timestamp desc LIMIT 1 ) a ON true; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop + Output: "*VALUES*".column1, i6069."timestamp", i6069.attr_id, i6069.number_val + -> Values Scan on "*VALUES*" + Output: "*VALUES*".column1 + -> Limit + Output: i6069."timestamp", i6069.attr_id, i6069.number_val + -> Custom Scan (ChunkAppend) on public.i6069 + Output: i6069."timestamp", i6069.attr_id, i6069.number_val + Order: i6069."timestamp" DESC + Startup Exclusion: false + Runtime Exclusion: true + -> Custom Scan (DecompressChunk) on _timescaledb_internal._hyper_43_81_chunk + Output: _hyper_43_81_chunk."timestamp", _hyper_43_81_chunk.attr_id, _hyper_43_81_chunk.number_val + Filter: ((_hyper_43_81_chunk."timestamp" > 'Fri Jun 30 00:00:00 2023'::timestamp without time zone) AND (_hyper_43_81_chunk."timestamp" < 'Thu Jul 06 00:00:00 2023'::timestamp without time zone)) + Sorted merge append: true + -> Sort + Output: compress_hyper_44_84_chunk."timestamp", compress_hyper_44_84_chunk.attr_id, compress_hyper_44_84_chunk.number_val, compress_hyper_44_84_chunk._ts_meta_count, compress_hyper_44_84_chunk._ts_meta_sequence_num, compress_hyper_44_84_chunk._ts_meta_min_1, compress_hyper_44_84_chunk._ts_meta_max_1 + Sort Key: compress_hyper_44_84_chunk._ts_meta_max_1 DESC + -> Index Scan using compress_hyper_44_84_chunk__compressed_hypertable_44_attr_id__t on _timescaledb_internal.compress_hyper_44_84_chunk + Output: compress_hyper_44_84_chunk."timestamp", compress_hyper_44_84_chunk.attr_id, compress_hyper_44_84_chunk.number_val, compress_hyper_44_84_chunk._ts_meta_count, compress_hyper_44_84_chunk._ts_meta_sequence_num, compress_hyper_44_84_chunk._ts_meta_min_1, compress_hyper_44_84_chunk._ts_meta_max_1 + Index Cond: (compress_hyper_44_84_chunk.attr_id = "*VALUES*".column1) + Filter: ((compress_hyper_44_84_chunk._ts_meta_max_1 > 'Fri Jun 30 00:00:00 2023'::timestamp without time zone) AND (compress_hyper_44_84_chunk._ts_meta_min_1 < 'Thu Jul 06 00:00:00 2023'::timestamp without time zone)) + -> Custom Scan (DecompressChunk) on _timescaledb_internal._hyper_43_80_chunk + Output: _hyper_43_80_chunk."timestamp", _hyper_43_80_chunk.attr_id, _hyper_43_80_chunk.number_val + Filter: ((_hyper_43_80_chunk."timestamp" > 'Fri Jun 30 00:00:00 2023'::timestamp without time zone) AND (_hyper_43_80_chunk."timestamp" < 'Thu Jul 06 00:00:00 2023'::timestamp without time zone)) + Sorted merge append: true + -> Sort + Output: compress_hyper_44_83_chunk."timestamp", compress_hyper_44_83_chunk.attr_id, compress_hyper_44_83_chunk.number_val, compress_hyper_44_83_chunk._ts_meta_count, compress_hyper_44_83_chunk._ts_meta_sequence_num, compress_hyper_44_83_chunk._ts_meta_min_1, compress_hyper_44_83_chunk._ts_meta_max_1 + Sort Key: compress_hyper_44_83_chunk._ts_meta_max_1 DESC + -> Index Scan using compress_hyper_44_83_chunk__compressed_hypertable_44_attr_id__t on _timescaledb_internal.compress_hyper_44_83_chunk + Output: compress_hyper_44_83_chunk."timestamp", compress_hyper_44_83_chunk.attr_id, compress_hyper_44_83_chunk.number_val, compress_hyper_44_83_chunk._ts_meta_count, compress_hyper_44_83_chunk._ts_meta_sequence_num, compress_hyper_44_83_chunk._ts_meta_min_1, compress_hyper_44_83_chunk._ts_meta_max_1 + Index Cond: (compress_hyper_44_83_chunk.attr_id = "*VALUES*".column1) + Filter: ((compress_hyper_44_83_chunk._ts_meta_max_1 > 'Fri Jun 30 00:00:00 2023'::timestamp without time zone) AND (compress_hyper_44_83_chunk._ts_meta_min_1 < 'Thu Jul 06 00:00:00 2023'::timestamp without time zone)) + -> Custom Scan (DecompressChunk) on _timescaledb_internal._hyper_43_79_chunk + Output: _hyper_43_79_chunk."timestamp", _hyper_43_79_chunk.attr_id, _hyper_43_79_chunk.number_val + Filter: ((_hyper_43_79_chunk."timestamp" > 'Fri Jun 30 00:00:00 2023'::timestamp without time zone) AND (_hyper_43_79_chunk."timestamp" < 'Thu Jul 06 00:00:00 2023'::timestamp without time zone)) + Sorted merge append: true + -> Sort + Output: compress_hyper_44_82_chunk."timestamp", compress_hyper_44_82_chunk.attr_id, compress_hyper_44_82_chunk.number_val, compress_hyper_44_82_chunk._ts_meta_count, compress_hyper_44_82_chunk._ts_meta_sequence_num, compress_hyper_44_82_chunk._ts_meta_min_1, compress_hyper_44_82_chunk._ts_meta_max_1 + Sort Key: compress_hyper_44_82_chunk._ts_meta_max_1 DESC + -> Index Scan using compress_hyper_44_82_chunk__compressed_hypertable_44_attr_id__t on _timescaledb_internal.compress_hyper_44_82_chunk + Output: compress_hyper_44_82_chunk."timestamp", compress_hyper_44_82_chunk.attr_id, compress_hyper_44_82_chunk.number_val, compress_hyper_44_82_chunk._ts_meta_count, compress_hyper_44_82_chunk._ts_meta_sequence_num, compress_hyper_44_82_chunk._ts_meta_min_1, compress_hyper_44_82_chunk._ts_meta_max_1 + Index Cond: (compress_hyper_44_82_chunk.attr_id = "*VALUES*".column1) + Filter: ((compress_hyper_44_82_chunk._ts_meta_max_1 > 'Fri Jun 30 00:00:00 2023'::timestamp without time zone) AND (compress_hyper_44_82_chunk._ts_meta_min_1 < 'Thu Jul 06 00:00:00 2023'::timestamp without time zone)) +(44 rows) + +SELECT * FROM ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) AS attr_ids(attr_id) +INNER JOIN LATERAL ( + SELECT * FROM i6069 + WHERE i6069.attr_id = attr_ids.attr_id AND + timestamp > '2023-06-30' AND timestamp < '2023-07-06' +ORDER BY timestamp desc LIMIT 1 ) a ON true; + attr_id | timestamp | attr_id | number_val +---------+--------------------------+---------+------------ + 1 | Sat Jul 01 00:00:00 2023 | 1 | 1 + 2 | Mon Jul 03 00:00:00 2023 | 2 | 1 + 3 | Wed Jul 05 00:00:00 2023 | 3 | 1 + 4 | Sat Jul 01 00:00:00 2023 | 4 | 1 + 5 | Mon Jul 03 00:00:00 2023 | 5 | 1 + 6 | Wed Jul 05 00:00:00 2023 | 6 | 1 + 7 | Sat Jul 01 00:00:00 2023 | 7 | 1 + 8 | Mon Jul 03 00:00:00 2023 | 8 | 1 + 9 | Wed Jul 05 00:00:00 2023 | 9 | 1 + 10 | Sat Jul 01 00:00:00 2023 | 10 | 1 +(10 rows) + +RESET enable_indexscan; +RESET enable_seqscan; diff --git a/tsl/test/sql/compression.sql b/tsl/test/sql/compression.sql index f33cff6c1f8..3d624de9204 100644 --- a/tsl/test/sql/compression.sql +++ b/tsl/test/sql/compression.sql @@ -915,3 +915,86 @@ INSERT INTO ht_metrics_partially_compressed VALUES ('2020-01-01'::timestamptz, 1 :explain SELECT * FROM ht_metrics_partially_compressed ORDER BY time DESC, device LIMIT 1; + +-- Test parameter change on rescan +-- issue 6069 +CREATE TABLE IF NOT EXISTS i6069 ( + timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL, + attr_id SMALLINT NOT NULL, + number_val DOUBLE PRECISION DEFAULT NULL +); + +SELECT create_hypertable( + 'i6069', 'timestamp', + create_default_indexes => FALSE, if_not_exists => TRUE, chunk_time_interval => INTERVAL '1 day' +); + +ALTER TABLE i6069 SET ( + timescaledb.compress, + timescaledb.compress_segmentby = 'attr_id' +); + +INSERT INTO i6069 VALUES('2023-07-01', 1, 1),('2023-07-03', 2, 1),('2023-07-05', 3, 1), + ('2023-07-01', 4, 1),('2023-07-03', 5, 1),('2023-07-05', 6, 1), + ('2023-07-01', 7, 1),('2023-07-03', 8, 1),('2023-07-05', 9, 1), + ('2023-07-01', 10, 1),('2023-07-03', 11, 1),('2023-07-05', 12, 1), + ('2023-07-01', 13, 1),('2023-07-03', 14, 1),('2023-07-05', 15, 1), + ('2023-07-01', 16, 1),('2023-07-03', 17, 1),('2023-07-05', 18, 1), + ('2023-07-01', 19, 1),('2023-07-03', 20, 1),('2023-07-05', 21, 1), + ('2023-07-01', 22, 1),('2023-07-03', 23, 1),('2023-07-05', 24, 1), + ('2023-07-01', 25, 1),('2023-07-03', 26, 1),('2023-07-05', 27, 1), + ('2023-07-01', 28, 1),('2023-07-03', 29, 1),('2023-07-05', 30, 1), + ('2023-07-01', 31, 1),('2023-07-03', 32, 1),('2023-07-05', 33, 1), + ('2023-07-01', 34, 1),('2023-07-03', 35, 1),('2023-07-05', 36, 1), + ('2023-07-01', 37, 1),('2023-07-03', 38, 1),('2023-07-05', 39, 1), + ('2023-07-01', 40, 1),('2023-07-03', 41, 1),('2023-07-05', 42, 1), + ('2023-07-01', 43, 1),('2023-07-03', 44, 1),('2023-07-05', 45, 1), + ('2023-07-01', 46, 1),('2023-07-03', 47, 1),('2023-07-05', 48, 1), + ('2023-07-01', 49, 1),('2023-07-03', 50, 1),('2023-07-05', 51, 1), + ('2023-07-01', 52, 1),('2023-07-03', 53, 1),('2023-07-05', 54, 1), + ('2023-07-01', 55, 1),('2023-07-03', 56, 1),('2023-07-05', 57, 1), + ('2023-07-01', 58, 1),('2023-07-03', 59, 1),('2023-07-05', 60, 1), + ('2023-07-01', 61, 1),('2023-07-03', 62, 1),('2023-07-05', 63, 1), + ('2023-07-01', 64, 1),('2023-07-03', 65, 1),('2023-07-05', 66, 1), + ('2023-07-01', 67, 1),('2023-07-03', 68, 1),('2023-07-05', 69, 1), + ('2023-07-01', 70, 1),('2023-07-03', 71, 1),('2023-07-05', 72, 1), + ('2023-07-01', 73, 1),('2023-07-03', 74, 1),('2023-07-05', 75, 1), + ('2023-07-01', 76, 1),('2023-07-03', 77, 1),('2023-07-05', 78, 1), + ('2023-07-01', 79, 1),('2023-07-03', 80, 1),('2023-07-05', 81, 1), + ('2023-07-01', 82, 1),('2023-07-03', 83, 1),('2023-07-05', 84, 1), + ('2023-07-01', 85, 1),('2023-07-03', 86, 1),('2023-07-05', 87, 1), + ('2023-07-01', 88, 1),('2023-07-03', 89, 1),('2023-07-05', 90, 1), + ('2023-07-01', 91, 1),('2023-07-03', 92, 1),('2023-07-05', 93, 1), + ('2023-07-01', 94, 1),('2023-07-03', 95, 1),('2023-07-05', 96, 1), + ('2023-07-01', 97, 1),('2023-07-03', 98, 1),('2023-07-05', 99, 1), + ('2023-07-01', 100, 1),('2023-07-03', 101, 1),('2023-07-05', 102, 1), + ('2023-07-01', 103, 1),('2023-07-03', 104, 1),('2023-07-05', 105, 1), + ('2023-07-01', 106, 1),('2023-07-03', 107, 1),('2023-07-05', 108, 1), + ('2023-07-01', 109, 1),('2023-07-03', 110, 1),('2023-07-05', 111, 1), + ('2023-07-01', 112, 1),('2023-07-03', 113, 1),('2023-07-05', 114, 1), + ('2023-07-01', 115, 1),('2023-07-03', 116, 1),('2023-07-05', 117, 1), + ('2023-07-01', 118, 1),('2023-07-03', 119, 1),('2023-07-05', 120, 1); + +SELECT compress_chunk(i, if_not_compressed => true) FROM show_chunks('i6069') i; + +SET enable_indexscan = ON; +SET enable_seqscan = OFF; + +:explain +SELECT * FROM ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) AS attr_ids(attr_id) +INNER JOIN LATERAL ( + SELECT * FROM i6069 + WHERE i6069.attr_id = attr_ids.attr_id AND + timestamp > '2023-06-30' AND timestamp < '2023-07-06' +ORDER BY timestamp desc LIMIT 1 ) a ON true; + +SELECT * FROM ( VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ) AS attr_ids(attr_id) +INNER JOIN LATERAL ( + SELECT * FROM i6069 + WHERE i6069.attr_id = attr_ids.attr_id AND + timestamp > '2023-06-30' AND timestamp < '2023-07-06' +ORDER BY timestamp desc LIMIT 1 ) a ON true; + +RESET enable_indexscan; +RESET enable_seqscan; +