timescaledb/test/expected/create_chunks.out
Sven Klemm a9751ccd5e Move partitioning functions to _timescaledb_functions schema
To increase schema security we do not want to mix our own internal
objects with user objects. Since chunks are created in the
_timescaledb_internal schema our internal functions should live in
a different dedicated schema. This patch make the necessary
adjustments for the following functions:

- get_partition_for_key(val anyelement)
- get_partition_hash(val anyelement)
2023-08-29 12:55:22 +02:00

224 lines
10 KiB
Plaintext

-- 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.
--
-- This test will create chunks in two dimenisions, time (x) and
-- space (y), where the time dimension is aligned. The figure below
-- shows the expected result. The chunk number in the figure
-- indicates the creation order.
--
-- +
-- +
-- + +-----+ +-----+
-- + | 2 | | 3 |
-- + | +---+-+ |
-- + +-----+ 5 |6+-----+
-- + | 1 +---+-+-----+ +---------+
-- + | | |4| 7 | | 8 |
-- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
-- 0 5 10 15 20
--
-- Partitioning:
--
-- Chunk # | time | space
-- 1 | 3 | 2
-- 4 | 1 | 3
-- 5 | 5 | 3
--
CREATE TABLE chunk_test(time integer, temp float8, tag integer, color integer);
SELECT create_hypertable('chunk_test', 'time', 'tag', 2, chunk_time_interval => 3);
NOTICE: adding not-null constraint to column "time"
create_hypertable
-------------------------
(1,public,chunk_test,t)
(1 row)
INSERT INTO chunk_test VALUES (4, 24.3, 1, 1);
SELECT * FROM _timescaledb_catalog.dimension_slice;
id | dimension_id | range_start | range_end
----+--------------+----------------------+------------
1 | 1 | 3 | 6
2 | 2 | -9223372036854775808 | 1073741823
(2 rows)
INSERT INTO chunk_test VALUES (4, 24.3, 2, 1);
INSERT INTO chunk_test VALUES (10, 24.3, 2, 1);
SELECT c.table_name AS chunk_name, d.id AS dimension_id, ds.id AS slice_id, range_start, range_end FROM _timescaledb_catalog.chunk c
LEFT JOIN _timescaledb_catalog.chunk_constraint cc ON (c.id = cc.chunk_id)
LEFT JOIN _timescaledb_catalog.dimension_slice ds ON (ds.id = cc.dimension_slice_id)
LEFT JOIN _timescaledb_catalog.dimension d ON (d.id = ds.dimension_id)
LEFT JOIN _timescaledb_catalog.hypertable h ON (d.hypertable_id = h.id)
WHERE h.schema_name = 'public' AND h.table_name = 'chunk_test'
ORDER BY c.id, d.id;
chunk_name | dimension_id | slice_id | range_start | range_end
------------------+--------------+----------+----------------------+---------------------
_hyper_1_1_chunk | 1 | 1 | 3 | 6
_hyper_1_1_chunk | 2 | 2 | -9223372036854775808 | 1073741823
_hyper_1_2_chunk | 1 | 1 | 3 | 6
_hyper_1_2_chunk | 2 | 3 | 1073741823 | 9223372036854775807
_hyper_1_3_chunk | 1 | 4 | 9 | 12
_hyper_1_3_chunk | 2 | 3 | 1073741823 | 9223372036854775807
(6 rows)
\c :TEST_DBNAME :ROLE_SUPERUSER
SELECT set_number_partitions('chunk_test', 3);
set_number_partitions
-----------------------
(1 row)
\c :TEST_DBNAME :ROLE_DEFAULT_PERM_USER
SELECT set_chunk_time_interval('chunk_test', 1::bigint);
set_chunk_time_interval
-------------------------
(1 row)
INSERT INTO chunk_test VALUES (8, 24.3, 11233, 1);
SELECT set_chunk_time_interval('chunk_test', 5::bigint);
set_chunk_time_interval
-------------------------
(1 row)
SELECT * FROM _timescaledb_catalog.dimension;
id | hypertable_id | column_name | column_type | aligned | num_slices | partitioning_func_schema | partitioning_func | interval_length | compress_interval_length | integer_now_func_schema | integer_now_func
----+---------------+-------------+-------------+---------+------------+--------------------------+--------------------+-----------------+--------------------------+-------------------------+------------------
2 | 1 | tag | integer | f | 3 | _timescaledb_functions | get_partition_hash | | | |
1 | 1 | time | integer | t | | | | 5 | | |
(2 rows)
INSERT INTO chunk_test VALUES (7, 24.3, 79669, 1);
INSERT INTO chunk_test VALUES (8, 24.3, 79669, 1);
INSERT INTO chunk_test VALUES (10, 24.3, 11233, 1);
INSERT INTO chunk_test VALUES (16, 24.3, 11233, 1);
SELECT c.table_name AS chunk_name, d.id AS dimension_id, ds.id AS slice_id, range_start, range_end FROM _timescaledb_catalog.chunk c
LEFT JOIN _timescaledb_catalog.chunk_constraint cc ON (c.id = cc.chunk_id)
LEFT JOIN _timescaledb_catalog.dimension_slice ds ON (ds.id = cc.dimension_slice_id)
LEFT JOIN _timescaledb_catalog.dimension d ON (d.id = ds.dimension_id)
LEFT JOIN _timescaledb_catalog.hypertable h ON (d.hypertable_id = h.id)
WHERE h.schema_name = 'public' AND h.table_name = 'chunk_test'
ORDER BY c.id, d.id;
chunk_name | dimension_id | slice_id | range_start | range_end
------------------+--------------+----------+----------------------+---------------------
_hyper_1_1_chunk | 1 | 1 | 3 | 6
_hyper_1_1_chunk | 2 | 2 | -9223372036854775808 | 1073741823
_hyper_1_2_chunk | 1 | 1 | 3 | 6
_hyper_1_2_chunk | 2 | 3 | 1073741823 | 9223372036854775807
_hyper_1_3_chunk | 1 | 4 | 9 | 12
_hyper_1_3_chunk | 2 | 3 | 1073741823 | 9223372036854775807
_hyper_1_4_chunk | 1 | 5 | 8 | 9
_hyper_1_4_chunk | 2 | 6 | -9223372036854775808 | 715827882
_hyper_1_5_chunk | 1 | 7 | 6 | 8
_hyper_1_5_chunk | 2 | 8 | 715827882 | 1431655764
_hyper_1_6_chunk | 1 | 5 | 8 | 9
_hyper_1_6_chunk | 2 | 8 | 715827882 | 1431655764
_hyper_1_7_chunk | 1 | 4 | 9 | 12
_hyper_1_7_chunk | 2 | 6 | -9223372036854775808 | 715827882
_hyper_1_8_chunk | 1 | 9 | 15 | 20
_hyper_1_8_chunk | 2 | 6 | -9223372036854775808 | 715827882
(16 rows)
--test the edges of an open partition -- INT_64_MAX and INT_64_MIN.
CREATE TABLE chunk_test_ends(time bigint, temp float8, tag integer, color integer);
SELECT create_hypertable('chunk_test_ends', 'time', chunk_time_interval => 5);
NOTICE: adding not-null constraint to column "time"
create_hypertable
------------------------------
(2,public,chunk_test_ends,t)
(1 row)
INSERT INTO chunk_test_ends VALUES ((-9223372036854775808)::bigint, 23.1, 11233, 1);
INSERT INTO chunk_test_ends VALUES (9223372036854775807::bigint, 24.1, 11233, 1);
--try to hit cache
INSERT INTO chunk_test_ends VALUES (9223372036854775807::bigint, 24.2, 11233, 1);
INSERT INTO chunk_test_ends VALUES (9223372036854775807::bigint, 24.3, 11233, 1), (9223372036854775807::bigint, 24.4, 11233, 1);
INSERT INTO chunk_test_ends VALUES ((-9223372036854775808)::bigint, 23.2, 11233, 1);
INSERT INTO chunk_test_ends VALUES ((-9223372036854775808)::bigint, 23.3, 11233, 1), ((-9223372036854775808)::bigint, 23.4, 11233, 1);
SELECT * FROM chunk_test_ends ORDER BY time asc, tag, temp;
time | temp | tag | color
----------------------+------+-------+-------
-9223372036854775808 | 23.1 | 11233 | 1
-9223372036854775808 | 23.2 | 11233 | 1
-9223372036854775808 | 23.3 | 11233 | 1
-9223372036854775808 | 23.4 | 11233 | 1
9223372036854775807 | 24.1 | 11233 | 1
9223372036854775807 | 24.2 | 11233 | 1
9223372036854775807 | 24.3 | 11233 | 1
9223372036854775807 | 24.4 | 11233 | 1
(8 rows)
--further tests of set_chunk_time_interval
CREATE TABLE chunk_test2(time TIMESTAMPTZ, temp float8, tag integer, color integer);
SELECT create_hypertable('chunk_test2', 'time', 'tag', 2, chunk_time_interval => 3);
WARNING: unexpected interval: smaller than one second
NOTICE: adding not-null constraint to column "time"
create_hypertable
--------------------------
(3,public,chunk_test2,t)
(1 row)
SELECT interval_length
FROM _timescaledb_catalog.dimension d
LEFT JOIN _timescaledb_catalog.hypertable h ON (d.hypertable_id = h.id)
WHERE h.schema_name = 'public' AND h.table_name = 'chunk_test2'
ORDER BY d.id;
interval_length
-----------------
3
(2 rows)
-- should work since time column is non-INT
SELECT set_chunk_time_interval('chunk_test2', INTERVAL '1 minute');
set_chunk_time_interval
-------------------------
(1 row)
SELECT interval_length
FROM _timescaledb_catalog.dimension d
LEFT JOIN _timescaledb_catalog.hypertable h ON (d.hypertable_id = h.id)
WHERE h.schema_name = 'public' AND h.table_name = 'chunk_test2'
ORDER BY d.id;
interval_length
-----------------
60000000
(2 rows)
-- should still work for non-INT time columns
SELECT set_chunk_time_interval('chunk_test2', 1000000);
set_chunk_time_interval
-------------------------
(1 row)
SELECT interval_length
FROM _timescaledb_catalog.dimension d
LEFT JOIN _timescaledb_catalog.hypertable h ON (d.hypertable_id = h.id)
WHERE h.schema_name = 'public' AND h.table_name = 'chunk_test2'
ORDER BY d.id;
interval_length
-----------------
1000000
(2 rows)
\set ON_ERROR_STOP 0
select set_chunk_time_interval(NULL,NULL::interval);
ERROR: hypertable cannot be NULL
-- should fail since time column is an int
SELECT set_chunk_time_interval('chunk_test', INTERVAL '1 minute');
ERROR: invalid interval type for integer dimension
-- should fail since its not a valid way to represent time
SELECT set_chunk_time_interval('chunk_test', 'foo'::TEXT);
ERROR: invalid interval type for integer dimension
SELECT set_chunk_time_interval('chunk_test', NULL::BIGINT);
ERROR: invalid interval: an explicit interval must be specified
SELECT set_chunk_time_interval('chunk_test2', NULL::BIGINT);
ERROR: invalid interval: an explicit interval must be specified
SELECT set_chunk_time_interval('chunk_test2', NULL::INTERVAL);
ERROR: invalid interval: an explicit interval must be specified
\set ON_ERROR_STOP 1