mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-15 01:53:41 +08:00
- Updated show_chunks, drop_chunks APIs to get the affected chunks using chunk creation time metadata based on the "date/time/interval" like boundary specified for the INTEGER columns. - We honor "integer_now" function if it's specified so as to keep backwards compatibility with the existing behavior Co-authored-by: Dipesh Pandit <dipesh@timescale.com>
253 lines
11 KiB
SQL
253 lines
11 KiB
SQL
CREATE TYPE _timescaledb_internal.dimension_info;
|
|
|
|
CREATE OR REPLACE FUNCTION _timescaledb_functions.dimension_info_in(cstring)
|
|
RETURNS _timescaledb_internal.dimension_info
|
|
LANGUAGE C STRICT IMMUTABLE
|
|
AS '@MODULE_PATHNAME@', 'ts_dimension_info_in';
|
|
|
|
CREATE OR REPLACE FUNCTION _timescaledb_functions.dimension_info_out(_timescaledb_internal.dimension_info)
|
|
RETURNS cstring
|
|
LANGUAGE C STRICT IMMUTABLE
|
|
AS '@MODULE_PATHNAME@', 'ts_dimension_info_out';
|
|
|
|
CREATE TYPE _timescaledb_internal.dimension_info (
|
|
INPUT = _timescaledb_functions.dimension_info_in,
|
|
OUTPUT = _timescaledb_functions.dimension_info_out,
|
|
INTERNALLENGTH = VARIABLE
|
|
);
|
|
|
|
CREATE FUNCTION @extschema@.create_hypertable(
|
|
relation REGCLASS,
|
|
dimension _timescaledb_internal.dimension_info,
|
|
create_default_indexes BOOLEAN = TRUE,
|
|
if_not_exists BOOLEAN = FALSE,
|
|
migrate_data BOOLEAN = FALSE
|
|
) RETURNS TABLE(hypertable_id INT, created BOOL) AS '@MODULE_PATHNAME@', 'ts_hypertable_create_general' LANGUAGE C VOLATILE;
|
|
|
|
CREATE FUNCTION @extschema@.add_dimension(
|
|
hypertable REGCLASS,
|
|
dimension _timescaledb_internal.dimension_info,
|
|
if_not_exists BOOLEAN = FALSE
|
|
) RETURNS TABLE(dimension_id INT, created BOOL)
|
|
AS '@MODULE_PATHNAME@', 'ts_dimension_add_general' LANGUAGE C VOLATILE;
|
|
|
|
CREATE FUNCTION @extschema@.set_partitioning_interval(
|
|
hypertable REGCLASS,
|
|
partition_interval ANYELEMENT,
|
|
dimension_name NAME = NULL
|
|
) RETURNS VOID AS '@MODULE_PATHNAME@', 'ts_dimension_set_interval' LANGUAGE C VOLATILE;
|
|
|
|
CREATE FUNCTION @extschema@.by_hash(column_name NAME, number_partitions INTEGER,
|
|
partition_func regproc = NULL)
|
|
RETURNS _timescaledb_internal.dimension_info LANGUAGE C
|
|
AS '@MODULE_PATHNAME@', 'ts_hash_dimension';
|
|
|
|
CREATE FUNCTION @extschema@.by_range(column_name NAME,
|
|
partition_interval ANYELEMENT = NULL::bigint,
|
|
partition_func regproc = NULL)
|
|
RETURNS _timescaledb_internal.dimension_info LANGUAGE C
|
|
AS '@MODULE_PATHNAME@', 'ts_range_dimension';
|
|
|
|
--
|
|
-- Rebuild the catalog table `_timescaledb_catalog.chunk` to
|
|
-- add new column `creation_time`
|
|
--
|
|
CREATE TABLE _timescaledb_internal.chunk_tmp
|
|
AS SELECT * from _timescaledb_catalog.chunk;
|
|
|
|
CREATE TABLE _timescaledb_internal.tmp_chunk_seq_value AS
|
|
SELECT last_value, is_called FROM _timescaledb_catalog.chunk_id_seq;
|
|
|
|
--drop foreign keys on chunk table
|
|
ALTER TABLE _timescaledb_catalog.chunk_constraint DROP CONSTRAINT
|
|
chunk_constraint_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.chunk_index DROP CONSTRAINT
|
|
chunk_index_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.chunk_data_node DROP CONSTRAINT
|
|
chunk_data_node_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_internal.bgw_policy_chunk_stats DROP CONSTRAINT
|
|
bgw_policy_chunk_stats_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.compression_chunk_size DROP CONSTRAINT
|
|
compression_chunk_size_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.compression_chunk_size DROP CONSTRAINT
|
|
compression_chunk_size_compressed_chunk_id_fkey;
|
|
ALTER TABLE _timescaledb_catalog.chunk_copy_operation DROP CONSTRAINT
|
|
chunk_copy_operation_chunk_id_fkey;
|
|
|
|
--drop dependent views
|
|
DROP VIEW IF EXISTS timescaledb_information.hypertables;
|
|
DROP VIEW IF EXISTS timescaledb_information.chunks;
|
|
DROP VIEW IF EXISTS _timescaledb_internal.hypertable_chunk_local_size;
|
|
DROP VIEW IF EXISTS _timescaledb_internal.compressed_chunk_stats;
|
|
DROP VIEW IF EXISTS timescaledb_experimental.chunk_replication_status;
|
|
|
|
ALTER EXTENSION timescaledb DROP TABLE _timescaledb_catalog.chunk;
|
|
ALTER EXTENSION timescaledb DROP SEQUENCE _timescaledb_catalog.chunk_id_seq;
|
|
DROP TABLE _timescaledb_catalog.chunk;
|
|
|
|
CREATE SEQUENCE _timescaledb_catalog.chunk_id_seq MINVALUE 1;
|
|
|
|
-- now create table without self referential foreign key
|
|
CREATE TABLE _timescaledb_catalog.chunk (
|
|
id integer NOT NULL DEFAULT nextval('_timescaledb_catalog.chunk_id_seq'),
|
|
hypertable_id int NOT NULL,
|
|
schema_name name NOT NULL,
|
|
table_name name NOT NULL,
|
|
compressed_chunk_id integer ,
|
|
dropped boolean NOT NULL DEFAULT FALSE,
|
|
status integer NOT NULL DEFAULT 0,
|
|
osm_chunk boolean NOT NULL DEFAULT FALSE,
|
|
creation_time timestamptz,
|
|
-- table constraints
|
|
CONSTRAINT chunk_pkey PRIMARY KEY (id),
|
|
CONSTRAINT chunk_schema_name_table_name_key UNIQUE (schema_name, table_name)
|
|
);
|
|
|
|
INSERT INTO _timescaledb_catalog.chunk
|
|
( id, hypertable_id, schema_name, table_name,
|
|
compressed_chunk_id, dropped, status, osm_chunk)
|
|
SELECT id, hypertable_id, schema_name, table_name,
|
|
compressed_chunk_id, dropped, status, osm_chunk
|
|
FROM _timescaledb_internal.chunk_tmp;
|
|
|
|
-- update creation_time for chunks
|
|
UPDATE
|
|
_timescaledb_catalog.chunk c
|
|
SET
|
|
creation_time = (pg_catalog.pg_stat_file(pg_catalog.pg_relation_filepath(r.oid))).modification
|
|
FROM
|
|
pg_class r, pg_namespace n
|
|
WHERE
|
|
r.relnamespace = n.oid
|
|
AND r.relname = c.table_name
|
|
AND n.nspname = c.schema_name
|
|
AND r.relkind = 'r'
|
|
AND c.dropped IS FALSE;
|
|
|
|
-- Make sure that there are no record with empty creation time
|
|
UPDATE _timescaledb_catalog.chunk SET creation_time = now() WHERE creation_time IS NULL;
|
|
|
|
--add indexes to the chunk table
|
|
CREATE INDEX chunk_hypertable_id_idx ON _timescaledb_catalog.chunk (hypertable_id);
|
|
CREATE INDEX chunk_compressed_chunk_id_idx ON _timescaledb_catalog.chunk (compressed_chunk_id);
|
|
CREATE INDEX chunk_osm_chunk_idx ON _timescaledb_catalog.chunk (osm_chunk, hypertable_id);
|
|
CREATE INDEX chunk_hypertable_id_creation_time_idx ON _timescaledb_catalog.chunk(hypertable_id, creation_time);
|
|
|
|
ALTER SEQUENCE _timescaledb_catalog.chunk_id_seq OWNED BY _timescaledb_catalog.chunk.id;
|
|
SELECT setval('_timescaledb_catalog.chunk_id_seq', last_value, is_called) FROM _timescaledb_internal.tmp_chunk_seq_value;
|
|
|
|
-- add self referential foreign key
|
|
ALTER TABLE _timescaledb_catalog.chunk ADD CONSTRAINT chunk_compressed_chunk_id_fkey FOREIGN KEY ( compressed_chunk_id )
|
|
REFERENCES _timescaledb_catalog.chunk( id );
|
|
|
|
--add foreign key constraint
|
|
ALTER TABLE _timescaledb_catalog.chunk
|
|
ADD CONSTRAINT chunk_hypertable_id_fkey
|
|
FOREIGN KEY (hypertable_id) REFERENCES _timescaledb_catalog.hypertable (id);
|
|
|
|
SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.chunk', '');
|
|
SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.chunk_id_seq', '');
|
|
|
|
-- Add non-null constraint
|
|
ALTER TABLE _timescaledb_catalog.chunk
|
|
ALTER COLUMN creation_time SET NOT NULL;
|
|
|
|
--add the foreign key constraints
|
|
ALTER TABLE _timescaledb_catalog.chunk_constraint ADD CONSTRAINT
|
|
chunk_constraint_chunk_id_fkey FOREIGN KEY (chunk_id) REFERENCES _timescaledb_catalog.chunk(id);
|
|
ALTER TABLE _timescaledb_catalog.chunk_index ADD CONSTRAINT
|
|
chunk_index_chunk_id_fkey FOREIGN KEY (chunk_id)
|
|
REFERENCES _timescaledb_catalog.chunk(id) ON DELETE CASCADE;
|
|
ALTER TABLE _timescaledb_catalog.chunk_data_node ADD CONSTRAINT
|
|
chunk_data_node_chunk_id_fkey FOREIGN KEY (chunk_id) REFERENCES _timescaledb_catalog.chunk(id);
|
|
ALTER TABLE _timescaledb_internal.bgw_policy_chunk_stats ADD CONSTRAINT
|
|
bgw_policy_chunk_stats_chunk_id_fkey FOREIGN KEY (chunk_id)
|
|
REFERENCES _timescaledb_catalog.chunk(id) ON DELETE CASCADE;
|
|
ALTER TABLE _timescaledb_catalog.compression_chunk_size ADD CONSTRAINT
|
|
compression_chunk_size_chunk_id_fkey FOREIGN KEY (chunk_id)
|
|
REFERENCES _timescaledb_catalog.chunk(id) ON DELETE CASCADE;
|
|
ALTER TABLE _timescaledb_catalog.compression_chunk_size ADD CONSTRAINT
|
|
compression_chunk_size_compressed_chunk_id_fkey FOREIGN KEY (compressed_chunk_id)
|
|
REFERENCES _timescaledb_catalog.chunk(id) ON DELETE CASCADE;
|
|
ALTER TABLE _timescaledb_catalog.chunk_copy_operation ADD CONSTRAINT
|
|
chunk_copy_operation_chunk_id_fkey FOREIGN KEY (chunk_id) REFERENCES _timescaledb_catalog.chunk (id) ON DELETE CASCADE;
|
|
|
|
--cleanup
|
|
DROP TABLE _timescaledb_internal.chunk_tmp;
|
|
DROP TABLE _timescaledb_internal.tmp_chunk_seq_value;
|
|
|
|
GRANT SELECT ON _timescaledb_catalog.chunk_id_seq TO PUBLIC;
|
|
GRANT SELECT ON _timescaledb_catalog.chunk TO PUBLIC;
|
|
-- end recreate _timescaledb_catalog.chunk table --
|
|
|
|
--
|
|
-- Rebuild the catalog table `_timescaledb_catalog.compression_chunk_size` to
|
|
-- add new column `numrows_frozen_immediately`
|
|
--
|
|
CREATE TABLE _timescaledb_internal.compression_chunk_size_tmp
|
|
AS SELECT * from _timescaledb_catalog.compression_chunk_size;
|
|
|
|
-- Drop depended views
|
|
-- We assume that '_timescaledb_internal.compressed_chunk_stats' was already dropped in this update
|
|
-- (see above)
|
|
|
|
-- Drop table
|
|
ALTER EXTENSION timescaledb DROP TABLE _timescaledb_catalog.compression_chunk_size;
|
|
DROP TABLE _timescaledb_catalog.compression_chunk_size;
|
|
|
|
CREATE TABLE _timescaledb_catalog.compression_chunk_size (
|
|
chunk_id integer NOT NULL,
|
|
compressed_chunk_id integer NOT NULL,
|
|
uncompressed_heap_size bigint NOT NULL,
|
|
uncompressed_toast_size bigint NOT NULL,
|
|
uncompressed_index_size bigint NOT NULL,
|
|
compressed_heap_size bigint NOT NULL,
|
|
compressed_toast_size bigint NOT NULL,
|
|
compressed_index_size bigint NOT NULL,
|
|
numrows_pre_compression bigint,
|
|
numrows_post_compression bigint,
|
|
numrows_frozen_immediately bigint,
|
|
-- table constraints
|
|
CONSTRAINT compression_chunk_size_pkey PRIMARY KEY (chunk_id),
|
|
CONSTRAINT compression_chunk_size_chunk_id_fkey FOREIGN KEY (chunk_id) REFERENCES _timescaledb_catalog.chunk (id) ON DELETE CASCADE,
|
|
CONSTRAINT compression_chunk_size_compressed_chunk_id_fkey FOREIGN KEY (compressed_chunk_id) REFERENCES _timescaledb_catalog.chunk (id) ON DELETE CASCADE
|
|
);
|
|
|
|
INSERT INTO _timescaledb_catalog.compression_chunk_size
|
|
(chunk_id, compressed_chunk_id, uncompressed_heap_size, uncompressed_toast_size,
|
|
uncompressed_index_size, compressed_heap_size, compressed_toast_size,
|
|
compressed_index_size, numrows_pre_compression, numrows_post_compression, numrows_frozen_immediately)
|
|
SELECT chunk_id, compressed_chunk_id, uncompressed_heap_size, uncompressed_toast_size,
|
|
uncompressed_index_size, compressed_heap_size, compressed_toast_size,
|
|
compressed_index_size, numrows_pre_compression, numrows_post_compression, 0
|
|
FROM _timescaledb_internal.compression_chunk_size_tmp;
|
|
|
|
DROP TABLE _timescaledb_internal.compression_chunk_size_tmp;
|
|
|
|
SELECT pg_catalog.pg_extension_config_dump('_timescaledb_catalog.compression_chunk_size', '');
|
|
|
|
GRANT SELECT ON _timescaledb_catalog.compression_chunk_size TO PUBLIC;
|
|
|
|
-- End modify `_timescaledb_catalog.compression_chunk_size`
|
|
|
|
DROP FUNCTION @extschema@.drop_chunks(REGCLASS, "any", "any", BOOL);
|
|
CREATE FUNCTION @extschema@.drop_chunks(
|
|
relation REGCLASS,
|
|
older_than "any" = NULL,
|
|
newer_than "any" = NULL,
|
|
verbose BOOLEAN = FALSE,
|
|
created_before "any" = NULL,
|
|
created_after "any" = NULL
|
|
) RETURNS SETOF TEXT AS '@MODULE_PATHNAME@', 'ts_chunk_drop_chunks'
|
|
LANGUAGE C VOLATILE PARALLEL UNSAFE;
|
|
|
|
DROP FUNCTION @extschema@.show_chunks(REGCLASS, "any", "any");
|
|
CREATE FUNCTION @extschema@.show_chunks(
|
|
relation REGCLASS,
|
|
older_than "any" = NULL,
|
|
newer_than "any" = NULL,
|
|
created_before "any" = NULL,
|
|
created_after "any" = NULL
|
|
) RETURNS SETOF REGCLASS AS '@MODULE_PATHNAME@', 'ts_chunk_show_chunks'
|
|
LANGUAGE C STABLE PARALLEL SAFE;
|