timescaledb/sql/common/meta_api.sql
Olof Rensfelt d070514f2a Fixed time chunk ranges.
To allow better caching and reduce the need for locking, chunks now
have fixed start and stop times set when the chunk is created.
2017-04-23 19:45:46 -04:00

271 lines
7.1 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION _timescaledb_meta_api.create_hypertable(
main_schema_name NAME,
main_table_name NAME,
time_column_name NAME,
time_column_type REGTYPE,
partitioning_column NAME,
number_partitions INTEGER,
replication_factor SMALLINT,
associated_schema_name NAME,
associated_table_prefix NAME,
placement _timescaledb_catalog.chunk_placement_type,
chunk_time_interval BIGINT,
tablespace NAME
)
RETURNS _timescaledb_catalog.hypertable LANGUAGE PLPGSQL VOLATILE AS
$BODY$
DECLARE
hypertable_row _timescaledb_catalog.hypertable;
BEGIN
SELECT (res::_timescaledb_catalog.hypertable).*
INTO hypertable_row
FROM _timescaledb_internal.meta_transaction_exec_with_return(
format('SELECT t FROM _timescaledb_meta.create_hypertable(%L, %L, %L, %L, %L, %L, %L, %L, %L, %L, %L, %L, %L) t ',
main_schema_name,
main_table_name,
time_column_name,
time_column_type,
partitioning_column,
number_partitions,
replication_factor,
associated_schema_name,
associated_table_prefix,
placement,
chunk_time_interval,
tablespace,
current_database()
)
) AS res;
RETURN hypertable_row;
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.set_chunk_time_interval(
main_schema_name NAME,
main_table_name NAME,
chunk_time_interval BIGINT
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.set_chunk_time_interval(%L, %L, %L, %L)',
main_schema_name,
main_table_name,
chunk_time_interval,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.drop_hypertable(
schema_name NAME,
table_name NAME
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.drop_hypertable(%L, %L, %L)',
schema_name,
table_name,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.add_column(
hypertable_id INTEGER,
column_name NAME,
attnum INT2,
data_type REGTYPE,
default_value TEXT,
not_null BOOLEAN
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.add_column(%L, %L, %L, %L, %L, %L, %L)',
hypertable_id,
column_name,
attnum,
data_type,
default_value,
not_null,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.drop_column(
hypertable_id INTEGER,
column_name NAME
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.drop_column(%L, %L, %L)',
hypertable_id,
column_name,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.add_index(
hypertable_id INTEGER,
main_schema_name NAME,
main_index_name NAME,
definition TEXT
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.add_index(%L, %L, %L, %L, %L)',
hypertable_id,
main_schema_name,
main_index_name,
definition,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.drop_index(
main_schema_name NAME,
main_index_name NAME
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.drop_index(%L, %L, %L)',
main_schema_name,
main_index_name,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.alter_table_rename_column(
hypertable_id INTEGER,
old_column_name NAME,
new_column_name NAME
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.alter_table_rename_column(%L, %L, %L, %L)',
hypertable_id,
old_column_name,
new_column_name,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.alter_column_set_default(
hypertable_id INTEGER,
column_name NAME,
new_default_value TEXT
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.alter_column_set_default(%L, %L, %L, %L)',
hypertable_id,
column_name,
new_default_value,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.alter_column_set_not_null(
hypertable_id INTEGER,
column_name NAME,
new_not_null BOOLEAN
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
BEGIN
PERFORM
_timescaledb_internal.meta_transaction_exec(
format('SELECT _timescaledb_meta.alter_column_set_not_null(%L, %L, %L, %L)',
hypertable_id,
column_name,
new_not_null,
current_database()
)
);
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.get_or_create_chunk_immediate(
partition_id INT,
time_point BIGINT
)
RETURNS _timescaledb_catalog.chunk LANGUAGE PLPGSQL VOLATILE AS
$BODY$
DECLARE
chunk_row _timescaledb_catalog.chunk;
BEGIN
--This should use the non-transactional rpc because this needs to see the results of this call
--to make progress.
SELECT (res::_timescaledb_catalog.chunk).* INTO chunk_row
FROM _timescaledb_internal.meta_immediate_commit_exec_with_return(
format('SELECT t FROM _timescaledb_meta.get_or_create_chunk(%L, %L) t ', partition_id, time_point)
) AS res;
RETURN chunk_row;
END
$BODY$;
CREATE OR REPLACE FUNCTION _timescaledb_meta_api.join_cluster(
meta_database NAME,
meta_hostname TEXT,
meta_port INT,
node_database NAME,
node_hostname TEXT,
node_port INT,
username TEXT,
password TEXT
)
RETURNS VOID LANGUAGE PLPGSQL VOLATILE AS
$BODY$
DECLARE
sql_stmt TEXT;
BEGIN
sql_stmt := format('SELECT add_node(%L, %L, %L)', node_database, node_hostname, node_port);
IF meta_database = current_database() THEN
EXECUTE sql_stmt;
ELSE
PERFORM _timescaledb_internal.clustering_not_supported();
END IF;
END
$BODY$;