mirror of https://github.com/citusdata/citus.git
45 lines
1.6 KiB
PL/PgSQL
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';
|