timescaledb/tsl/test/sql/include/transparent_decompression_ordered_index.sql
gayyappan 87a190afcd Fix nested loop joins for compressed chunk
This change adds equivalence class members for non segment
by attributes of compressed tables. Before the change
introduced by this PR, we added equivalence members to the
compressed chunk only for segment by columns. If we
have a join condition like:
hyper.segment_col = A.col1 and hyper.compressed_attr = A.col2
The compressed rel had EM only for
compressed_chunk.segment_col = A.col1

When a parameterized path is created for the compressed chunk,
it has only 1 clause (corresponding to the segment by EM )
in its list of ppi_clauses. The other clause is missing since
it did not have an EM. A parameterized path is expected to carry
all the clauses that come from the outer_rel for the join
(table A in this case).Since the ppi_clauses did not have all
the clauses that come from table A, we ended up missing a join
condition (for table A) when we had a parameterized index path
for the compressed chunk.

Fixes #2673
2021-01-27 14:06:16 -05:00

208 lines
5.4 KiB
SQL

-- This file and its contents are licensed under the Timescale License.
-- Please see the included NOTICE for copyright information and
-- LICENSE-TIMESCALE for a copy of the license.
SET work_mem TO '50MB';
---Lets test for index backward scans instead of seq scans ------------
-- for ordered append tests on compressed chunks we need a hypertable with time as compress_orderby column
-- should not have ordered DecompressChunk path because segmentby columns are not part of pathkeys
:PREFIX
SELECT *
FROM (
SELECT *
FROM metrics_ordered_idx
ORDER BY time DESC
LIMIT 10) AS q
ORDER BY 1,
2,
3,
4;
-- should have ordered DecompressChunk path because segmentby columns have equality constraints
:PREFIX
SELECT *
FROM (
SELECT *
FROM metrics_ordered_idx
WHERE device_id = 3
AND device_id_peer = 3
ORDER BY time DESC
LIMIT 10) AS q
ORDER BY 1,
2,
3,
4;
:PREFIX SELECT DISTINCT ON (d.device_id)
*
FROM metrics_ordered_idx d
INNER JOIN LATERAL (
SELECT *
FROM metrics_ordered_idx m
WHERE m.device_id = d.device_id
AND m.device_id_peer = 3
ORDER BY time DESC
LIMIT 1) m ON m.device_id_peer = d.device_id_peer
WHERE extract(minute FROM d.time) = 0;
:PREFIX
SELECT d.device_id,
m.time,
m.time
FROM metrics_ordered_idx d
INNER JOIN LATERAL (
SELECT *
FROM metrics_ordered_idx m
WHERE m.device_id = d.device_id
AND m.device_id_peer = 3
ORDER BY time DESC
LIMIT 1) m ON m.device_id_peer = d.device_id_peer
WHERE extract(minute FROM d.time) = 0;
--github issue 1558
SET enable_seqscan = FALSE;
SET enable_bitmapscan = FALSE;
SET max_parallel_workers_per_gather = 0;
SET enable_hashjoin = FALSE;
SET enable_mergejoin = FALSE;
:PREFIX
SELECT device_id,
count(*)
FROM (
SELECT *
FROM metrics_ordered_idx mt,
nodetime nd
WHERE mt.time > nd.start_time
AND mt.device_id = nd.node
AND mt.time < nd.stop_time) AS subq
GROUP BY device_id;
:PREFIX
SELECT nd.node,
mt.*
FROM metrics_ordered_idx mt,
nodetime nd
WHERE mt.time > nd.start_time
AND mt.device_id = nd.node
AND mt.time < nd.stop_time
ORDER BY time;
SET enable_seqscan = TRUE;
SET enable_bitmapscan = TRUE;
SET enable_seqscan = TRUE;
SET enable_bitmapscan = TRUE;
SET max_parallel_workers_per_gather = 0;
SET enable_mergejoin = TRUE;
SET enable_hashjoin = FALSE;
:PREFIX
SELECT nd.node,
mt.*
FROM metrics_ordered_idx mt,
nodetime nd
WHERE mt.time > nd.start_time
AND mt.device_id = nd.node
AND mt.time < nd.stop_time
ORDER BY time;
SET enable_mergejoin = FALSE;
SET enable_hashjoin = TRUE;
:PREFIX
SELECT nd.node,
mt.*
FROM metrics_ordered_idx mt,
nodetime nd
WHERE mt.time > nd.start_time
AND mt.device_id = nd.node
AND mt.time < nd.stop_time
ORDER BY time;
--enable all joins after the tests
SET enable_mergejoin = TRUE;
SET enable_hashjoin = TRUE;
--end github issue 1558
-- github issue 2673
-- nested loop join with parameterized path
-- join condition has a segment by column and another column.
SET enable_hashjoin = false;
SET enable_mergejoin=false;
SET enable_material = false;
SET enable_seqscan = false;
-- restrict so that we select only 1 chunk.
:PREFIX
WITH lookup as ( SELECT * from (values( 3, 5) , (3, 4) ) as lu( did, version) )
SELECT met.*, lookup.*
FROM metrics_ordered_idx met join lookup
ON met.device_id = lookup.did and met.v0 = lookup.version
WHERE met.time > '2000-01-19 19:00:00-05'
and met.time < '2000-01-20 20:00:00-05';
--add filter to segment by (device_id) and compressed attr column (v0)
:PREFIX
WITH lookup as ( SELECT * from (values( 3, 5) , (3, 4) ) as lu( did, version) )
SELECT met.*, lookup.*
FROM metrics_ordered_idx met join lookup
ON met.device_id = lookup.did and met.v0 = lookup.version
WHERE met.time > '2000-01-19 19:00:00-05'
and met.time < '2000-01-20 20:00:00-05'
and met.device_id = 3 and met.v0 = 5;
:PREFIX
WITH lookup as ( SELECT * from (values( 3, 5) , (3, 4) ) as lu( did, version) )
SELECT met.*, lookup.*
FROM metrics_ordered_idx met join lookup
ON met.device_id = lookup.did and met.v0 = lookup.version
WHERE met.time = '2000-01-19 19:00:00-05'
and met.device_id = 3
and met.device_id_peer = 3 and met.v0 = 5;
-- lateral subquery
:PREFIX
WITH f1 as ( SELECT * from (values( 7, 5, 4) , (4, 5, 5) ) as lu( device_id, device_id_peer, v0) )
SELECT * FROM metrics_ordered_idx met
JOIN LATERAL
( SELECT node, f1.* from nodetime , f1
WHERE node = f1.device_id) q
ON met.device_id = q.node and met.device_id_peer = q.device_id_peer
and met.v0 = q.v0 and met.v0 > 2 and time = '2018-01-19 20:00:00-05';
-- filter on compressed attr (v0) with seqscan enabled and indexscan
-- disabled. filters on compressed attr should be above the seq scan.
SET enable_seqscan = true;
SET enable_indexscan = false;
:PREFIX
WITH lookup as ( SELECT * from (values( 3, 5) , (3, 4) ) as lu( did, version) )
SELECT met.*, lookup.*
FROM metrics_ordered_idx met join lookup
ON met.device_id = lookup.did and met.v0 = lookup.version
and met.device_id = 3
WHERE met.time > '2000-01-19 19:00:00-05'
and met.time < '2000-01-20 20:00:00-05'
and met.device_id = 3
and met.device_id_peer = 3 and met.v0 = 5;
RESET enable_hashjoin ;
RESET enable_mergejoin;
RESET enable_material ;
RESET enable_indexscan ;
--end github issue 2673