1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
-- 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 file contains functions associated with creating new
-- hypertables.
-- Outputs the create_hypertable command to recreate the given hypertable.
--
-- This is currently used internally for our single hypertable backup tool
-- so that it knows how to restore the hypertable without user intervention.
--
-- It only works for hypertables with up to 2 dimensions.
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_create_command(
table_name NAME
)
RETURNS TEXT LANGUAGE PLPGSQL VOLATILE AS
$BODY$
DECLARE
h_id INTEGER;
schema_name NAME;
time_column NAME;
time_interval BIGINT;
space_column NAME;
space_partitions INTEGER;
dimension_cnt INTEGER;
dimension_row record;
ret TEXT;
BEGIN
SELECT h.id, h.schema_name
FROM _timescaledb_catalog.hypertable AS h
WHERE h.table_name = get_create_command.table_name
INTO h_id, schema_name;
IF h_id IS NULL THEN
RAISE EXCEPTION 'hypertable "%" not found', table_name
USING ERRCODE = 'TS101';
END IF;
SELECT COUNT(*)
FROM _timescaledb_catalog.dimension d
WHERE d.hypertable_id = h_id
INTO STRICT dimension_cnt;
IF dimension_cnt > 2 THEN
RAISE EXCEPTION 'get_create_command only supports hypertables with up to 2 dimensions'
USING ERRCODE = 'TS101';
END IF;
FOR dimension_row IN
SELECT *
FROM _timescaledb_catalog.dimension d
WHERE d.hypertable_id = h_id
LOOP
IF dimension_row.interval_length IS NOT NULL THEN
time_column := dimension_row.column_name;
time_interval := dimension_row.interval_length;
ELSIF dimension_row.num_slices IS NOT NULL THEN
space_column := dimension_row.column_name;
space_partitions := dimension_row.num_slices;
END IF;
END LOOP;
ret := format($$SELECT create_hypertable('%I.%I', '%s'$$, schema_name, table_name, time_column);
IF space_column IS NOT NULL THEN
ret := ret || format($$, '%I', %s$$, space_column, space_partitions);
END IF;
ret := ret || format($$, chunk_time_interval => %s, create_default_indexes=>FALSE);$$, time_interval);
RETURN ret;
END
$BODY$ SET search_path TO pg_catalog, pg_temp;
|