timescaledb/tsl/test/shared/sql/include/ordered_append_join.sql
Sven Klemm a218532941 Fix cross-platform explain output differences
Enforce index scan for queries that would produce different output
between 32bit and 64bit platform to make explain output for
constraint_exclusion_prepared, ordered_append and ordered_append_join
test output consistent across platforms.
2020-09-10 19:26:40 +02:00

285 lines
6.1 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.
-- test LATERAL with ordered append in the outer query
:PREFIX
SELECT time,
pg_typeof(l)
FROM :TEST_TABLE,
LATERAL (
SELECT *
FROM (
VALUES (1),
(2)) v) l
ORDER BY time DESC
LIMIT 2;
-- test LATERAL with ordered append in the lateral query
:PREFIX
SELECT time,
pg_typeof(v)
FROM (
VALUES (1),
(2)) v,
LATERAL (
SELECT *
FROM :TEST_TABLE
ORDER BY time DESC
LIMIT 2) l;
-- test plan with best index is chosen
-- this should use device_id, time index
:PREFIX
SELECT time,
device_id
FROM :TEST_TABLE
WHERE device_id = 1
ORDER BY time DESC
LIMIT 1;
-- test plan with best index is chosen
-- this should use time index
:PREFIX
SELECT time
FROM :TEST_TABLE
ORDER BY time DESC
LIMIT 1;
-- test LATERAL with correlated query
-- only last chunk should be executed
:PREFIX
SELECT g.time,
l.time
FROM generate_series('2000-01-01'::timestamptz, '2000-01-03', '1d') AS g (time)
LEFT OUTER JOIN LATERAL (
SELECT *
FROM :TEST_TABLE o
WHERE o.time >= g.time
AND o.time < g.time + '1d'::interval
ORDER BY time DESC
LIMIT 1) l ON TRUE;
-- test LATERAL with correlated query
-- only 2nd chunk should be executed
:PREFIX
SELECT g.time,
l.time
FROM generate_series('2000-01-10'::timestamptz, '2000-01-11', '1d') AS g (time)
LEFT OUTER JOIN LATERAL (
SELECT *
FROM :TEST_TABLE o
WHERE o.time >= g.time
AND o.time < g.time + '1d'::interval
ORDER BY time
LIMIT 1) l ON TRUE;
-- test startup and runtime exclusion together
:PREFIX
SELECT g.time,
l.time
FROM generate_series('2000-01-01'::timestamptz, '2000-01-03', '1d') AS g (time)
LEFT OUTER JOIN LATERAL (
SELECT *
FROM :TEST_TABLE o
WHERE o.time >= g.time
AND o.time < g.time + '1d'::interval
AND o.time < now()
ORDER BY time DESC
LIMIT 1) l ON TRUE;
-- test startup and runtime exclusion together
-- all chunks should be filtered
:PREFIX
SELECT g.time,
l.time
FROM generate_series('2000-01-01'::timestamptz, '2000-01-03', '1d') AS g (time)
LEFT OUTER JOIN LATERAL (
SELECT *
FROM :TEST_TABLE o
WHERE o.time >= g.time
AND o.time < g.time + '1d'::interval
AND o.time > now()
ORDER BY time DESC
LIMIT 1) l ON TRUE;
-- test JOIN
-- no exclusion on joined table because quals are not propagated yet
:PREFIX
SELECT o1.time,
o2.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 ON o1.time = o2.time
WHERE o1.time < '2000-02-01'
AND o1.device_id = 1
AND o2.device_id = 2
ORDER BY o1.time;
-- test JOIN
-- last chunk of o2 should not be executed
:PREFIX
SELECT o1.time,
o2.time
FROM :TEST_TABLE o1
INNER JOIN (
SELECT *
FROM :TEST_TABLE o2
ORDER BY time) o2 ON o1.time = o2.time
WHERE o1.time < '2000-01-08'
ORDER BY o1.time
LIMIT 10;
-- test join against max query
-- not ChunkAppend so no chunk exclusion
SET enable_hashjoin = FALSE;
:PREFIX
SELECT o1.time,
o2.*
FROM :TEST_TABLE o1
INNER JOIN (
SELECT max(time) AS max_time
FROM :TEST_TABLE) o2 ON o1.time = o2.max_time
WHERE o1.device_id = 1
ORDER BY time;
RESET enable_hashjoin;
SET enable_seqscan TO false;
-- test JOIN on time column
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 ON o1.time = o2.time
WHERE o1.device_id = 1
AND o2.device_id = 2
ORDER BY o1.time
LIMIT 100;
-- test JOIN on time column with USING
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 USING (time)
WHERE o1.device_id = 1
AND o2.device_id = 2
ORDER BY o1.time
LIMIT 100;
-- test NATURAL JOIN on time column
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
NATURAL INNER JOIN :TEST_TABLE o2
WHERE o1.device_id = 1
AND o2.device_id = 2
ORDER BY o1.time
LIMIT 100;
-- test LEFT JOIN on time column
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
LEFT JOIN :TEST_TABLE o2 ON o1.time = o2.time
WHERE o1.device_id = 1
AND o2.device_id = 2
ORDER BY o1.time
LIMIT 100;
-- test RIGHT JOIN on time column
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
RIGHT JOIN :TEST_TABLE o2 ON o1.time = o2.time
WHERE o1.device_id = 1
AND o2.device_id = 2
ORDER BY o2.time
LIMIT 100;
-- test JOIN on time column with ON clause expression order switched
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 ON o2.time = o1.time
WHERE o1.device_id = 1
AND o2.device_id = 2
ORDER BY o1.time
LIMIT 100;
-- test JOIN on time column with equality condition in WHERE clause
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 ON TRUE
WHERE o1.time = o2.time
AND o1.device_id = 1
AND o2.device_id = 2
ORDER BY o1.time
LIMIT 100;
-- test JOIN on time column with ORDER BY 2nd hypertable
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 ON o1.time = o2.time
WHERE o1.device_id = 1
AND o2.device_id = 2
ORDER BY o2.time
LIMIT 100;
-- test JOIN on time column and device_id
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 ON o1.device_id = o2.device_id
AND o1.time = o2.time
ORDER BY o1.time
LIMIT 100;
-- test JOIN on device_id
-- should not use ordered append for 2nd hypertable
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 ON o1.device_id = o2.device_id
WHERE o1.device_id = 1
ORDER BY o1.time
LIMIT 100;
-- test JOIN on time column with implicit join
-- should use 2 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1,
:TEST_TABLE o2
WHERE o1.time = o2.time
AND o1.device_id = 1
AND o2.device_id = 2
ORDER BY o1.time
LIMIT 100;
-- test JOIN on time column with 3 hypertables
-- should use 3 ChunkAppend
:PREFIX
SELECT o1.time
FROM :TEST_TABLE o1
INNER JOIN :TEST_TABLE o2 ON o1.time = o2.time
INNER JOIN :TEST_TABLE o3 ON o1.time = o3.time
WHERE o1.device_id = 1
AND o2.device_id = 2
AND o3.device_id = 3
ORDER BY o1.time
LIMIT 100;
RESET enable_seqscan;