-- 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. \set ON_ERROR_STOP 0 --table with special column names -- create table foo2 (a integer, "bacB toD" integer, c integer, d integer); select table_name from create_hypertable('foo2', 'a', chunk_time_interval=> 10); NOTICE: adding not-null constraint to column "a" table_name ------------ foo2 (1 row) create table foo3 (a integer, "bacB toD" integer, c integer, d integer); select table_name from create_hypertable('foo3', 'a', chunk_time_interval=> 10); NOTICE: adding not-null constraint to column "a" table_name ------------ foo3 (1 row) create table non_compressed (a integer, "bacB toD" integer, c integer, d integer); select table_name from create_hypertable('non_compressed', 'a', chunk_time_interval=> 10); NOTICE: adding not-null constraint to column "a" table_name ---------------- non_compressed (1 row) insert into non_compressed values( 3 , 16 , 20, 4); ALTER TABLE foo2 set (timescaledb.compress_segmentby = '"bacB toD",c' , timescaledb.compress_orderby = 'c'); ERROR: must set the 'compress' boolean option when setting compression options ALTER TABLE foo2 set (timescaledb.compress, timescaledb.compress_segmentby = '"bacB toD",c' , timescaledb.compress_orderby = 'c'); ERROR: cannot use the same column c in compress_orderby and compress_segmentby ALTER TABLE foo2 set (timescaledb.compress, timescaledb.compress_segmentby = '"bacB toD",c' , timescaledb.compress_orderby = 'd DESC'); ALTER TABLE foo2 set (timescaledb.compress, timescaledb.compress_segmentby = '"bacB toD",c' , timescaledb.compress_orderby = 'd'); --note that the time column "a" should be added to the end of the orderby list select * from _timescaledb_catalog.hypertable_compression order by attname; hypertable_id | attname | compression_algorithm_id | segmentby_column_index | orderby_column_index | orderby_asc | orderby_nullsfirst ---------------+----------+--------------------------+------------------------+----------------------+-------------+-------------------- 1 | a | 4 | | 2 | f | t 1 | bacB toD | 0 | 1 | | | 1 | c | 0 | 2 | | | 1 | d | 4 | | 1 | t | f (4 rows) ALTER TABLE foo3 set (timescaledb.compress, timescaledb.compress_segmentby = '"bacB toD",c' , timescaledb.compress_orderby = 'd DeSc NullS lAsT'); -- Negative test cases --- ALTER TABLE foo2 set (timescaledb.compress, timescaledb.compress_segmentby = '"bacB toD",c'); ERROR: need to specify both compress_orderby and compress_groupby if altering compression ALTER TABLE foo2 set (timescaledb.compress='f'); ERROR: disabling compression is not yet supported create table reserved_column_prefix (a integer, _ts_meta_foo integer, "bacB toD" integer, c integer, d integer); select table_name from create_hypertable('reserved_column_prefix', 'a', chunk_time_interval=> 10); NOTICE: adding not-null constraint to column "a" table_name ------------------------ reserved_column_prefix (1 row) ALTER TABLE reserved_column_prefix set (timescaledb.compress); ERROR: cannot compress tables with reserved column prefix '_ts_meta_' --basic test with count create table foo (a integer, b integer, c integer, t text); select table_name from create_hypertable('foo', 'a', chunk_time_interval=> 10); NOTICE: adding not-null constraint to column "a" table_name ------------ foo (1 row) insert into foo values( 3 , 16 , 20); insert into foo values( 10 , 10 , 20); insert into foo values( 20 , 11 , 20); insert into foo values( 30 , 12 , 20); -- should error out -- ALTER TABLE foo ALTER b SET NOT NULL, set (timescaledb.compress); ERROR: ALTER TABLE SET does not support multiple clauses ALTER TABLE foo ALTER b SET NOT NULL; select attname, attnotnull from pg_attribute where attrelid = (select oid from pg_class where relname like 'foo') and attname like 'b'; attname | attnotnull ---------+------------ b | t (1 row) ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'd'); ERROR: column d in compress_segmentby list does not exist ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'd'); ERROR: column d in compress_orderby list does not exist ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c desc nulls'); ERROR: unable to parse the compress_orderby option 'c desc nulls' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c desc nulls thirsty'); ERROR: unable to parse the compress_orderby option 'c desc nulls thirsty' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c climb nulls first'); ERROR: unable to parse the compress_orderby option 'c climb nulls first' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c nulls first asC'); ERROR: unable to parse the compress_orderby option 'c nulls first asC' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c desc nulls first asc'); ERROR: unable to parse the compress_orderby option 'c desc nulls first asc' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c desc hurry'); ERROR: unable to parse the compress_orderby option 'c desc hurry' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c descend'); ERROR: unable to parse the compress_orderby option 'c descend' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c; SELECT 1'); ERROR: unable to parse the compress_orderby option 'c; SELECT 1' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = '1,2'); ERROR: unable to parse the compress_orderby option '1,2' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c + 1'); ERROR: unable to parse the compress_orderby option 'c + 1' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'random()'); ERROR: unable to parse the compress_orderby option 'random()' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c LIMIT 1'); ERROR: unable to parse the compress_orderby option 'c LIMIT 1' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'c USING <'); ERROR: unable to parse the compress_orderby option 'c USING <' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 't COLLATE "en_US"'); ERROR: unable to parse the compress_orderby option 't COLLATE "en_US"' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'c asc' , timescaledb.compress_orderby = 'c'); ERROR: unable to parse the compress_segmentby option 'c asc' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'c nulls last'); ERROR: unable to parse the compress_segmentby option 'c nulls last' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'c + 1'); ERROR: unable to parse the compress_segmentby option 'c + 1' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'random()'); ERROR: unable to parse the compress_segmentby option 'random()' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'c LIMIT 1'); ERROR: unable to parse the compress_segmentby option 'c LIMIT 1' ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_segmentby = 'c + b'); ERROR: unable to parse the compress_segmentby option 'c + b' --should succeed ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'a, b'); --note that the time column "a" should not be added to the end of the order by list again (should appear first) select hc.* from _timescaledb_catalog.hypertable_compression hc inner join _timescaledb_catalog.hypertable h on (h.id = hc.hypertable_id) where h.table_name = 'foo' order by attname; hypertable_id | attname | compression_algorithm_id | segmentby_column_index | orderby_column_index | orderby_asc | orderby_nullsfirst ---------------+---------+--------------------------+------------------------+----------------------+-------------+-------------------- 8 | a | 4 | | 1 | t | f 8 | b | 4 | | 2 | t | f 8 | c | 4 | | | | 8 | t | 2 | | | | (4 rows) select decompress_chunk(ch1.schema_name|| '.' || ch1.table_name) FROM _timescaledb_catalog.chunk ch1, _timescaledb_catalog.hypertable ht where ch1.hypertable_id = ht.id and ht.table_name like 'foo' ORDER BY ch1.id limit 1; ERROR: chunk "_hyper_8_2_chunk" is not a compressed --test changing the segment by columns ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'a', timescaledb.compress_segmentby = 'b'); select ch1.schema_name|| '.' || ch1.table_name AS "CHUNK_NAME" FROM _timescaledb_catalog.chunk ch1, _timescaledb_catalog.hypertable ht where ch1.hypertable_id = ht.id and ht.table_name like 'foo' ORDER BY ch1.id limit 1 \gset --should succeed select compress_chunk(:'CHUNK_NAME'); compress_chunk ---------------- (1 row) select compress_chunk(:'CHUNK_NAME'); ERROR: chunk is already compressed select compress_chunk(ch1.schema_name|| '.' || ch1.table_name) FROM _timescaledb_catalog.chunk ch1, _timescaledb_catalog.hypertable ht where ch1.hypertable_id = ht.id and ht.table_name like 'non_compressed' ORDER BY ch1.id limit 1; ERROR: chunks can be compressed only if compression property is set on the hypertable ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'a', timescaledb.compress_segmentby = 'c'); ERROR: cannot change compression options as compressed chunks already exist for this table select decompress_chunk(ch1.schema_name|| '.' || ch1.table_name) FROM _timescaledb_catalog.chunk ch1, _timescaledb_catalog.hypertable ht where ch1.hypertable_id = ht.id and ht.table_name like 'non_compressed' ORDER BY ch1.id limit 1; ERROR: missing compressed hypertable --should succeed select decompress_chunk(ch1.schema_name|| '.' || ch1.table_name) FROM _timescaledb_catalog.chunk ch1, _timescaledb_catalog.hypertable ht where ch1.hypertable_id = ht.id and ht.table_name like 'foo' and ch1.compressed_chunk_id IS NOT NULL; decompress_chunk ------------------ (1 row) --should succeed ALTER TABLE foo set (timescaledb.compress, timescaledb.compress_orderby = 'a', timescaledb.compress_segmentby = 'b'); select hc.* from _timescaledb_catalog.hypertable_compression hc inner join _timescaledb_catalog.hypertable h on (h.id = hc.hypertable_id) where h.table_name = 'foo' order by attname; hypertable_id | attname | compression_algorithm_id | segmentby_column_index | orderby_column_index | orderby_asc | orderby_nullsfirst ---------------+---------+--------------------------+------------------------+----------------------+-------------+-------------------- 8 | a | 4 | | 1 | t | f 8 | b | 0 | 1 | | | 8 | c | 4 | | | | 8 | t | 2 | | | | (4 rows) SELECT comp_hyper.schema_name|| '.' || comp_hyper.table_name as "COMPRESSED_HYPER_NAME" FROM _timescaledb_catalog.hypertable comp_hyper INNER JOIN _timescaledb_catalog.hypertable uncomp_hyper ON (comp_hyper.id = uncomp_hyper.compressed_hypertable_id) WHERE uncomp_hyper.table_name like 'foo' ORDER BY comp_hyper.id LIMIT 1 \gset select add_drop_chunks_policy(:'COMPRESSED_HYPER_NAME', INTERVAL '4 months', true) WARNING: Timescale License expired ERROR: cannot add drop chunks policy to hypertable "_compressed_hypertable_11" which contains compressed data