\ir include/create_single_db.sql CREATE TABLE index_test(time timestamptz, temp float); SELECT create_hypertable('index_test', 'time'); -- Default indexes created \d+ index_test DROP TABLE index_test; CREATE TABLE index_test(time timestamptz, device integer, temp float); -- Create index before create_hypertable() CREATE UNIQUE INDEX index_test_time_idx ON index_test (time); \set ON_ERROR_STOP 0 -- Creating a hypertable from a table with an index that doesn't cover -- all partitioning columns should fail SELECT create_hypertable('index_test', 'time', 'device', 2); \set ON_ERROR_STOP 1 -- Partitioning on only time should work SELECT create_hypertable('index_test', 'time'); INSERT INTO index_test VALUES ('2017-01-20T09:00:01', 1, 17.5); -- Check that index is also created on chunk \d+ index_test \d+ _timescaledb_internal._hyper*_chunk SELECT * FROM _timescaledb_catalog.chunk_index; -- Create another chunk INSERT INTO index_test VALUES ('2017-05-20T09:00:01', 3, 17.5); \d+ _timescaledb_internal._hyper*_chunk SELECT * FROM _timescaledb_catalog.chunk_index; -- Delete the index on only one chunk DROP INDEX _timescaledb_internal._hyper_3_1_chunk_index_test_time_idx; \d+ _timescaledb_internal._hyper*_chunk SELECT * FROM _timescaledb_catalog.chunk_index; -- Recreate table with new partitioning DROP TABLE index_test; CREATE TABLE index_test(time timestamptz, device integer, temp float); -- No pre-existing UNIQUE index, so partitioning on two columns should work SELECT create_hypertable('index_test', 'time', 'device', 2); INSERT INTO index_test VALUES ('2017-01-20T09:00:01', 1, 17.5); \set ON_ERROR_STOP 0 -- Create unique index without all partitioning columns should fail CREATE UNIQUE INDEX index_test_time_device_idx ON index_test (time); \set ON_ERROR_STOP 1 CREATE UNIQUE INDEX index_test_time_device_idx ON index_test (time, device); -- Regular index need not cover all partitioning columns CREATE INDEX ON index_test (time, temp); -- New index should have been recursed to chunk \d+ index_test \d+ _timescaledb_internal._hyper*_chunk SELECT * FROM _timescaledb_catalog.chunk_index; ALTER INDEX index_test_time_idx RENAME TO index_test_time_idx2; -- Metadata and index should have changed name \d+ index_test \d+ _timescaledb_internal._hyper*_chunk SELECT * FROM _timescaledb_catalog.chunk_index; DROP INDEX index_test_time_idx2; DROP INDEX index_test_time_device_idx; -- Index should have been dropped \d+ index_test \d+ _timescaledb_internal._hyper*_chunk SELECT * FROM _timescaledb_catalog.chunk_index; -- Create index with long name to see how this is handled on chunks CREATE INDEX a_hypertable_index_with_a_very_very_long_name_that_truncates ON index_test (time, temp); CREATE INDEX a_hypertable_index_with_a_very_very_long_name_that_truncates_2 ON index_test (time, temp); \d+ index_test \d+ _timescaledb_internal._hyper*_chunk DROP INDEX a_hypertable_index_with_a_very_very_long_name_that_truncates; DROP INDEX a_hypertable_index_with_a_very_very_long_name_that_truncates_2; \set ON_ERROR_STOP 0 -- Create index CONCURRENTLY CREATE UNIQUE INDEX CONCURRENTLY index_test_time_device_idx ON index_test (time, device); \set ON_ERROR_STOP 1 -- Test tablespaces. Chunk indexes should end up in same tablespace as -- main index. SET client_min_messages = ERROR; DROP TABLESPACE IF EXISTS tablespace1; DROP TABLESPACE IF EXISTS tablespace2; SET client_min_messages = NOTICE; CREATE TABLESPACE tablespace1 LOCATION :TEST_TABLESPACE1_PATH; CREATE INDEX index_test_time_idx ON index_test (time) TABLESPACE tablespace1; \d+ index_test \d+ _timescaledb_internal._hyper* CREATE TABLESPACE tablespace2 LOCATION :TEST_TABLESPACE2_PATH; ALTER INDEX index_test_time_idx SET TABLESPACE tablespace2; \d+ index_test \d+ _timescaledb_internal._hyper*_chunk -- Add constraint index ALTER TABLE index_test ADD UNIQUE (time, device); \d+ index_test \d+ _timescaledb_internal._hyper*_chunk -- Constraint indexes NOT added to chunk_index table (maybe they -- should be for consistency?) SELECT * FROM _timescaledb_catalog.chunk_index; DROP TABLE index_test; -- Metadata removed SELECT * FROM _timescaledb_catalog.chunk_index; -- Create table in a tablespace CREATE TABLE index_test(time timestamptz, temp float, device int) TABLESPACE tablespace1; -- Default indexes should be in the table's tablespace SELECT create_hypertable('index_test', 'time'); -- Explicitly defining an index tablespace should work and propagate -- to chunks CREATE INDEX ON index_test (time, device) TABLESPACE tablespace2; -- New indexes without explicit tablespaces should use the default -- tablespace CREATE INDEX ON index_test (device); -- Create chunk INSERT INTO index_test VALUES ('2017-01-20T09:00:01', 17.5); -- Check that the tablespaces of chunk indexes match the tablespace of -- the main index \d+ index_test \d+ _timescaledb_internal._hyper*_chunk -- Creating a new index should propagate to existing chunks, including -- the given tablespace CREATE INDEX ON index_test (time, temp) TABLESPACE tablespace2; \d+ index_test \d+ _timescaledb_internal._hyper*_chunk -- Cleanup DROP TABLE index_test CASCADE; DROP TABLESPACE tablespace1; DROP TABLESPACE tablespace2;