mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-19 04:03:06 +08:00
To allow better caching and reduce the need for locking, chunks now have fixed start and stop times set when the chunk is created.
271 lines
7.1 KiB
PL/PgSQL
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$;
|