Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PG16: Regression Tests #6139

Merged
merged 1 commit into from
Oct 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,444 changes: 2,444 additions & 0 deletions test/expected/append-16.out

Large diffs are not rendered by default.

168 changes: 168 additions & 0 deletions test/expected/cluster-16.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
-- 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.
CREATE TABLE cluster_test(time timestamptz, temp float, location int);
SELECT create_hypertable('cluster_test', 'time', chunk_time_interval => interval '1 day');
NOTICE: adding not-null constraint to column "time"
create_hypertable
---------------------------
(1,public,cluster_test,t)
(1 row)

-- Show default indexes
SELECT * FROM test.show_indexes('cluster_test');
Index | Columns | Expr | Unique | Primary | Exclusion | Tablespace
-----------------------+---------+------+--------+---------+-----------+------------
cluster_test_time_idx | {time} | | f | f | f |
(1 row)

-- Create two chunks
INSERT INTO cluster_test VALUES ('2017-01-20T09:00:01', 23.4, 1),
('2017-01-21T09:00:01', 21.3, 2);
-- Run cluster
CLUSTER VERBOSE cluster_test USING cluster_test_time_idx;
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using index scan on "_hyper_1_1_chunk_cluster_test_time_idx"
INFO: "_timescaledb_internal._hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using index scan on "_hyper_1_2_chunk_cluster_test_time_idx"
INFO: "_timescaledb_internal._hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
-- Create a third chunk
INSERT INTO cluster_test VALUES ('2017-01-22T09:00:01', 19.5, 3);
-- Show clustered indexes
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true ORDER BY 1;
indexrelid | indisclustered
--------------------------------------------------------------+----------------
cluster_test_time_idx | t
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_2_chunk_cluster_test_time_idx | t
(3 rows)

-- Reorder just our table
CLUSTER VERBOSE cluster_test;
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_3_chunk" using index scan on "_hyper_1_3_chunk_cluster_test_time_idx"
INFO: "_timescaledb_internal._hyper_1_3_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
-- Show clustered indexes, including new chunk
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true ORDER BY 1;
indexrelid | indisclustered
--------------------------------------------------------------+----------------
cluster_test_time_idx | t
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_2_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_3_chunk_cluster_test_time_idx | t
(4 rows)

-- Reorder all tables (although will only be our test table)
CLUSTER VERBOSE;
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "public.cluster_test" using sequential scan and sort
INFO: "public.cluster_test": found 0 removable, 0 nonremovable row versions in 0 pages
INFO: clustering "_timescaledb_internal._hyper_1_3_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_3_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
-- Change the clustered index
CREATE INDEX ON cluster_test (time, location);
CLUSTER VERBOSE cluster_test using cluster_test_time_location_idx;
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_3_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_3_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
-- Show updated clustered indexes
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true ORDER BY 1;
indexrelid | indisclustered
-----------------------------------------------------------------------+----------------
cluster_test_time_location_idx | t
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_location_idx | t
_timescaledb_internal._hyper_1_2_chunk_cluster_test_time_location_idx | t
_timescaledb_internal._hyper_1_3_chunk_cluster_test_time_location_idx | t
(4 rows)

--check the setting of cluster indexes on hypertables and chunks
ALTER TABLE cluster_test CLUSTER ON cluster_test_time_idx;
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true
ORDER BY 1,2;
indexrelid | indisclustered
--------------------------------------------------------------+----------------
cluster_test_time_idx | t
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_2_chunk_cluster_test_time_idx | t
_timescaledb_internal._hyper_1_3_chunk_cluster_test_time_idx | t
(4 rows)

CLUSTER VERBOSE cluster_test;
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_2_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_2_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
INFO: clustering "_timescaledb_internal._hyper_1_3_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_3_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
ALTER TABLE cluster_test SET WITHOUT CLUSTER;
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true
ORDER BY 1,2;
indexrelid | indisclustered
------------+----------------
(0 rows)

\set ON_ERROR_STOP 0
CLUSTER VERBOSE cluster_test;
ERROR: there is no previously clustered index for table "cluster_test"
\set ON_ERROR_STOP 1
ALTER TABLE _timescaledb_internal._hyper_1_1_chunk CLUSTER ON _hyper_1_1_chunk_cluster_test_time_idx;
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true
ORDER BY 1,2;
indexrelid | indisclustered
--------------------------------------------------------------+----------------
_timescaledb_internal._hyper_1_1_chunk_cluster_test_time_idx | t
(1 row)

CLUSTER VERBOSE _timescaledb_internal._hyper_1_1_chunk;
INFO: clustering "_timescaledb_internal._hyper_1_1_chunk" using sequential scan and sort
INFO: "_timescaledb_internal._hyper_1_1_chunk": found 0 removable, 1 nonremovable row versions in 1 pages
ALTER TABLE _timescaledb_internal._hyper_1_1_chunk SET WITHOUT CLUSTER;
SELECT indexrelid::regclass, indisclustered
FROM pg_index
WHERE indisclustered = true
ORDER BY 1,2;
indexrelid | indisclustered
------------+----------------
(0 rows)

\set ON_ERROR_STOP 0
CLUSTER VERBOSE _timescaledb_internal._hyper_1_1_chunk;
ERROR: there is no previously clustered index for table "_hyper_1_1_chunk"
\set ON_ERROR_STOP 1
-- test alter column type on hypertable with clustering
CREATE TABLE cluster_alter(time timestamp, id text, val int);
CREATE INDEX idstuff ON cluster_alter USING btree (id ASC NULLS LAST, time);
SELECT table_name FROM create_hypertable('cluster_alter', 'time');
WARNING: column type "timestamp without time zone" used for "time" does not follow best practices
NOTICE: adding not-null constraint to column "time"
table_name
---------------
cluster_alter
(1 row)

INSERT INTO cluster_alter VALUES('2020-01-01', '123', 1);
CLUSTER cluster_alter using idstuff;
--attempt the alter table
ALTER TABLE cluster_alter ALTER COLUMN id TYPE int USING id::int;
CLUSTER cluster_alter;
CLUSTER cluster_alter using idstuff;
52 changes: 52 additions & 0 deletions test/expected/cursor-16.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
-- 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.
CREATE TABLE cursor_test(time timestamptz, device_id int, temp float);
SELECT create_hypertable('cursor_test','time');
NOTICE: adding not-null constraint to column "time"
create_hypertable
--------------------------
(1,public,cursor_test,t)
(1 row)

INSERT INTO cursor_test SELECT '2000-01-01',1,0.5;
INSERT INTO cursor_test SELECT '2001-01-01',1,0.5;
INSERT INTO cursor_test SELECT '2002-01-01',1,0.5;
\set ON_ERROR_STOP 0
BEGIN;
DECLARE c1 SCROLL CURSOR FOR SELECT * FROM cursor_test;
FETCH NEXT FROM c1;
time | device_id | temp
------------------------------+-----------+------
Sat Jan 01 00:00:00 2000 PST | 1 | 0.5
(1 row)

-- this will produce an error on PG < 14 because PostgreSQL checks
-- for the existence of a scan node with the relation id for every relation
-- used in the update plan in the plan of the cursor.
UPDATE cursor_test SET temp = 0.7 WHERE CURRENT OF c1;
COMMIT;
-- test cursor with no chunks left after runtime exclusion
BEGIN;
DECLARE c1 SCROLL CURSOR FOR SELECT * FROM cursor_test WHERE time > now();
UPDATE cursor_test SET temp = 0.7 WHERE CURRENT OF c1;
ERROR: cursor "c1" is not a simply updatable scan of table "_hyper_1_1_chunk"
COMMIT;
-- test cursor with no chunks left after planning exclusion
BEGIN;
DECLARE c1 SCROLL CURSOR FOR SELECT * FROM cursor_test WHERE time > '2010-01-01';
UPDATE cursor_test SET temp = 0.7 WHERE CURRENT OF c1;
ERROR: cursor "c1" is not a simply updatable scan of table "_hyper_1_1_chunk"
COMMIT;
\set ON_ERROR_STOP 1
SET timescaledb.enable_constraint_exclusion TO off;
BEGIN;
DECLARE c1 SCROLL CURSOR FOR SELECT * FROM cursor_test;
FETCH NEXT FROM c1;
time | device_id | temp
------------------------------+-----------+------
Sat Jan 01 00:00:00 2000 PST | 1 | 0.7
(1 row)

UPDATE cursor_test SET temp = 0.7 WHERE CURRENT OF c1;
COMMIT;
Loading