mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-17 02:53:51 +08:00
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.
298 lines
4.9 KiB
SQL
298 lines
4.9 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 ASC for ordered chunks
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
ORDER BY time ASC
|
|
LIMIT 1;
|
|
|
|
-- test DESC for ordered chunks
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
ORDER BY time DESC
|
|
LIMIT 1;
|
|
|
|
-- test query with ORDER BY column not in targetlist
|
|
:PREFIX
|
|
SELECT pg_typeof(device_id),
|
|
pg_typeof(v2)
|
|
FROM :TEST_TABLE
|
|
ORDER BY time ASC
|
|
LIMIT 1;
|
|
|
|
-- ORDER BY may include other columns after time column
|
|
:PREFIX
|
|
SELECT time,
|
|
device_id,
|
|
v0
|
|
FROM :TEST_TABLE
|
|
WHERE device_id = 1
|
|
ORDER BY time DESC,
|
|
device_id
|
|
LIMIT 1;
|
|
|
|
-- test RECORD in targetlist
|
|
:PREFIX
|
|
SELECT (time,
|
|
device_id,
|
|
v0)
|
|
FROM :TEST_TABLE
|
|
WHERE device_id = 1
|
|
ORDER BY time DESC,
|
|
device_id
|
|
LIMIT 1;
|
|
|
|
-- test sort column not in targetlist
|
|
:PREFIX
|
|
SELECT time_bucket('1h', time)
|
|
FROM :TEST_TABLE
|
|
ORDER BY time DESC
|
|
LIMIT 1;
|
|
|
|
-- queries with ORDER BY non-time column shouldn't use ordered append
|
|
:PREFIX
|
|
SELECT device_id
|
|
FROM :TEST_TABLE
|
|
ORDER BY device_id
|
|
LIMIT 1;
|
|
|
|
-- time column must be primary sort order
|
|
:PREFIX
|
|
SELECT time,
|
|
device_id
|
|
FROM :TEST_TABLE
|
|
WHERE device_id IN (1, 2)
|
|
ORDER BY device_id,
|
|
time
|
|
LIMIT 1;
|
|
|
|
-- test equality constraint on ORDER BY prefix
|
|
-- currently not optimized
|
|
SET enable_seqscan TO false;
|
|
:PREFIX
|
|
SELECT time,
|
|
device_id
|
|
FROM :TEST_TABLE
|
|
WHERE device_id = 1
|
|
ORDER BY device_id,
|
|
time
|
|
LIMIT 10;
|
|
RESET enable_seqscan;
|
|
|
|
-- queries without LIMIT should use ordered append
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE device_id IN (1, 2)
|
|
ORDER BY time ASC;
|
|
|
|
-- queries without ORDER BY shouldnt use ordered append
|
|
:PREFIX
|
|
SELECT pg_typeof(time)
|
|
FROM :TEST_TABLE
|
|
LIMIT 1;
|
|
|
|
-- test interaction with constraint exclusion
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time > '2000-01-07'
|
|
ORDER BY time ASC
|
|
LIMIT 1;
|
|
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time > '2000-01-07'
|
|
ORDER BY time DESC
|
|
LIMIT 1;
|
|
|
|
-- test interaction with runtime exclusion
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time > '2000-01-08'::text::timestamptz
|
|
ORDER BY time ASC
|
|
LIMIT 1;
|
|
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time < '2000-01-08'::text::timestamptz
|
|
ORDER BY time ASC
|
|
LIMIT 1;
|
|
|
|
-- test constraint exclusion
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time > '2000-01-08'::text::timestamptz
|
|
AND time < '2000-01-10'
|
|
ORDER BY time ASC
|
|
LIMIT 1;
|
|
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time < '2000-01-08'::text::timestamptz
|
|
AND time > '2000-01-07'
|
|
ORDER BY time ASC
|
|
LIMIT 1;
|
|
|
|
-- min/max queries
|
|
:PREFIX
|
|
SELECT max(time)
|
|
FROM :TEST_TABLE;
|
|
|
|
:PREFIX
|
|
SELECT min(time)
|
|
FROM :TEST_TABLE;
|
|
|
|
-- test first/last (doesn't use ordered append yet)
|
|
:PREFIX
|
|
SELECT first(time, time)
|
|
FROM :TEST_TABLE;
|
|
|
|
:PREFIX
|
|
SELECT last(time, time)
|
|
FROM :TEST_TABLE;
|
|
|
|
-- test query with time_bucket
|
|
:PREFIX
|
|
SELECT time_bucket('1d', time)
|
|
FROM :TEST_TABLE
|
|
ORDER BY time ASC
|
|
LIMIT 1;
|
|
|
|
-- test query with ORDER BY time_bucket
|
|
:PREFIX
|
|
SELECT time_bucket('1d', time)
|
|
FROM :TEST_TABLE
|
|
ORDER BY 1
|
|
LIMIT 1;
|
|
|
|
-- test query with ORDER BY time_bucket, device_id
|
|
-- must not use ordered append
|
|
:PREFIX
|
|
SELECT time_bucket('1d', time),
|
|
device_id,
|
|
v0
|
|
FROM :TEST_TABLE
|
|
WHERE device_id IN (1, 2)
|
|
ORDER BY time_bucket('1d', time),
|
|
device_id
|
|
LIMIT 1;
|
|
|
|
-- test query with ORDER BY date_trunc
|
|
:PREFIX
|
|
SELECT time_bucket('1d', time)
|
|
FROM :TEST_TABLE
|
|
ORDER BY date_trunc('day', time)
|
|
LIMIT 1;
|
|
|
|
-- test query with ORDER BY date_trunc
|
|
:PREFIX
|
|
SELECT date_trunc('day', time)
|
|
FROM :TEST_TABLE
|
|
ORDER BY 1
|
|
LIMIT 1;
|
|
|
|
-- test query with ORDER BY date_trunc, device_id
|
|
-- must not use ordered append
|
|
:PREFIX
|
|
SELECT date_trunc('day', time),
|
|
device_id,
|
|
v0
|
|
FROM :TEST_TABLE
|
|
WHERE device_id IN (1, 2)
|
|
ORDER BY 1,
|
|
2
|
|
LIMIT 1;
|
|
|
|
-- test query with now() should result in ordered ChunkAppend
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time < now() + '1 month'
|
|
ORDER BY time DESC
|
|
LIMIT 1;
|
|
|
|
-- test CTE
|
|
:PREFIX WITH i AS (
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time < now()
|
|
ORDER BY time DESC
|
|
LIMIT 100
|
|
)
|
|
SELECT *
|
|
FROM i;
|
|
|
|
-- test CTE
|
|
-- no chunk exclusion for CTE because cte query is not pulled up
|
|
:PREFIX WITH cte AS (
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE device_id = 1
|
|
ORDER BY time
|
|
)
|
|
SELECT *
|
|
FROM cte
|
|
WHERE time < '2000-02-01'::timestamptz;
|
|
|
|
-- test subquery
|
|
-- not ChunkAppend so no chunk exclusion
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
WHERE time = (
|
|
SELECT max(time)
|
|
FROM :TEST_TABLE)
|
|
ORDER BY time;
|
|
|
|
-- test ordered append with limit expression
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
ORDER BY time
|
|
LIMIT (
|
|
SELECT length('four'));
|
|
|
|
-- test with ordered guc disabled
|
|
SET timescaledb.enable_ordered_append TO OFF;
|
|
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
ORDER BY time
|
|
LIMIT 3;
|
|
|
|
RESET timescaledb.enable_ordered_append;
|
|
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
ORDER BY time
|
|
LIMIT 3;
|
|
|
|
-- test with chunk append disabled
|
|
SET timescaledb.enable_chunk_append TO OFF;
|
|
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
ORDER BY time
|
|
LIMIT 3;
|
|
|
|
RESET timescaledb.enable_chunk_append;
|
|
|
|
:PREFIX
|
|
SELECT time
|
|
FROM :TEST_TABLE
|
|
ORDER BY time
|
|
LIMIT 3;
|