citus/src/backend/timeseries/sql/udfs/create_missing_partitions/latest.sql

45 lines
1.6 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION pg_catalog.create_missing_partitions(
table_name regclass,
to_date timestamptz,
start_from timestamptz DEFAULT NULL)
returns boolean
LANGUAGE plpgsql
AS $$
DECLARE
range_values_record record;
current_partition_name text;
current_partition_count int;
BEGIN
/*
* Get the partition ranges using the get_missing_partition_ranges and create
* partitions for those ranges. Since timeseries table related checks are
* handled by get_missing_partition_range we don't check them here again.
*
* TODO: Create that using attach partition, which can be implemented with another UDF to make sure that it gets right locks.
* Consider different types of tables while implemented that (Task 1.3 on sheet)
*/
SELECT count(*)
INTO current_partition_count
FROM pg_catalog.time_partitions
WHERE parent_table = table_name;
FOR range_values_record IN
SELECT *
FROM get_missing_partition_ranges(table_name, to_date, start_from)
LOOP
current_partition_name := table_name::text || '_' || current_partition_count::text;
EXECUTE format('CREATE TABLE %I PARTITION OF %I FOR VALUES FROM (''%I'') TO (''%I'')', current_partition_name, table_name::text, range_values_record.range_from_value, range_values_record.range_to_value);
current_partition_count := current_partition_count + 1;
END LOOP;
RETURN true;
END;
$$;
COMMENT ON FUNCTION pg_catalog.create_missing_partitions(
table_name regclass,
to_date timestamptz,
start_from timestamptz)
IS 'create missing partitions for the given timeseries table and range';