Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions sql/osm_api.sql
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,94 @@ CREATE OR REPLACE FUNCTION _timescaledb_functions.lock_osm_chunk_dimension_slice
htoid REGCLASS
) RETURNS VOID AS '@MODULE_PATHNAME@',
'ts_lock_osm_chunk_dimension_slice' LANGUAGE C VOLATILE;

CREATE OR REPLACE FUNCTION _timescaledb_functions.get_hypertable_info(IN relation REGCLASS, OUT hypertable_id INTEGER, OUT schema_name name, OUT table_name name, OUT is_cagg BOOLEAN) AS $$
SELECT ht.id, ht.schema_name, ht.table_name, false AS is_cagg
FROM _timescaledb_catalog.hypertable ht
JOIN pg_class c ON ht.table_name = c.relname AND c.oid = $1
JOIN pg_namespace ns ON ns.oid = c.relnamespace AND ns.nspname = ht.schema_name;
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;

CREATE OR REPLACE FUNCTION _timescaledb_functions.get_hypertable_info_by_id(IN hypertable_id INTEGER, OUT hypertable_id INTEGER, OUT schema_name name, OUT table_name name, OUT is_cagg BOOLEAN) AS $$
SELECT ht.id, ht.schema_name, ht.table_name, false AS is_cagg
FROM _timescaledb_catalog.hypertable ht
WHERE ht.id = $1;
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;

CREATE OR REPLACE FUNCTION _timescaledb_functions.get_integer_now_func(IN htid INTEGER, OUT hypertable REGCLASS, OUT integer_func REGPROC)
AS $$
DECLARE
func_name TEXT;
func_schema TEXT;
raw_ht_id INTEGER;
BEGIN
SELECT integer_now_func_schema, integer_now_func INTO func_schema, func_name
FROM _timescaledb_catalog.dimension d
WHERE d.hypertable_id = $1 ORDER BY id LIMIT 1;
IF func_schema IS NOT NULL AND func_name IS NOT NULL THEN
SELECT to_regclass(format('%I.%I', schema_name, table_name)) INTO hypertable FROM _timescaledb_catalog.hypertable WHERE id = $1;
integer_func := to_regproc(format('%I.%I', func_schema, func_name));
RETURN;
END IF;

SELECT raw_hypertable_id INTO raw_ht_id FROM _timescaledb_catalog.continuous_agg WHERE mat_hypertable_id = htid;
IF raw_ht_id IS NOT NULL THEN
SELECT * INTO hypertable, integer_func FROM _timescaledb_functions.get_integer_now_func(raw_ht_id);
RETURN;
END IF;

RETURN;
END
$$ LANGUAGE plpgsql STABLE SET search_path = pg_catalog, pg_temp;

CREATE OR REPLACE FUNCTION _timescaledb_functions.get_primary_dimension(IN hypertable_id INTEGER, OUT column_name NAME, OUT column_type REGTYPE, OUT integer_now_func regproc) AS $$
SELECT
d.column_name,
d.column_type,
(_timescaledb_functions.get_integer_now_func(d.hypertable_id)).integer_func AS integer_now_func
FROM _timescaledb_catalog.dimension d
WHERE d.hypertable_id = $1 ORDER BY d.id LIMIT 1;
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;

CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_info(IN chunk REGCLASS, OUT chunk_id INTEGER, OUT hypertable_id INTEGER, OUT ht_schema_name NAME, OUT ht_table_name NAME, OUT chunk_schema NAME, OUT chunk_name NAME, OUT is_osm_chunk BOOLEAN, OUT is_frozen BOOLEAN) AS $$
SELECT
ch.id AS chunk_id,
ch.hypertable_id, ht.schema_name AS ht_schema_name, ht.table_name AS ht_table_name,
ch.schema_name AS chunk_schema, ch.table_name AS chunk_name,
ch.osm_chunk AS is_osm_chunk,
(ch.status & 4)::bool AS is_frozen
FROM _timescaledb_catalog.chunk ch
JOIN pg_class c ON c.oid=$1 AND ch.table_name=c.relname
JOIN pg_namespace ns ON ns.oid = c.relnamespace AND ns.nspname = ch.schema_name
JOIN _timescaledb_catalog.hypertable ht ON ht.id=ch.hypertable_id;
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;

CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_info_by_id(IN chunk_id INTEGER, OUT chunk_id INTEGER, OUT hypertable_id INTEGER, OUT ht_schema_name NAME, OUT ht_table_name NAME, OUT chunk_schema NAME, OUT chunk_name NAME, OUT is_osm_chunk BOOLEAN, OUT is_frozen BOOLEAN) AS $$
SELECT
ch.id AS chunk_id,
ch.hypertable_id, ht.schema_name AS ht_schema_name, ht.table_name AS ht_table_name,
ch.schema_name AS chunk_schema, ch.table_name AS chunk_name,
ch.osm_chunk AS is_osm_chunk,
(ch.status & 4)::bool AS is_frozen
FROM _timescaledb_catalog.chunk ch
JOIN _timescaledb_catalog.hypertable ht ON ht.id=ch.hypertable_id
WHERE ch.id = $1;
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;

CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_primary_range(IN chunk REGCLASS, OUT range_start BIGINT, OUT range_end BIGINT)
AS $$
SELECT range_start, range_end
FROM _timescaledb_catalog.dimension_slice d
JOIN _timescaledb_catalog.chunk ch ON ch.id = d.chunk_id
JOIN pg_class c ON c.oid=$1 AND ch.table_name=c.relname
JOIN pg_namespace ns ON ns.oid = c.relnamespace AND ns.nspname = ch.schema_name
ORDER BY dimension_id LIMIT 1;
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;

CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_primary_range_by_id(IN chunk_id INTEGER, OUT range_start BIGINT, OUT range_end BIGINT)
AS $$
SELECT range_start, range_end
FROM _timescaledb_catalog.dimension_slice d
WHERE chunk_id = $1 ORDER BY dimension_id LIMIT 1;
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;

15 changes: 12 additions & 3 deletions sql/updates/reverse-dev.sql
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ $$;
DROP VIEW IF EXISTS _timescaledb_catalog.chunk_constraint;
DROP FUNCTION IF EXISTS _timescaledb_functions.chunk_constraint_add_table_constraint( integer, name, name);

DROP FUNCTION IF EXISTS _timescaledb_functions.lock_osm_chunk_dimension_slice(regclass);

ALTER TABLE _timescaledb_catalog.hypertable RESET (user_catalog_table);
ALTER TABLE _timescaledb_catalog.chunk RESET (user_catalog_table);

Expand Down Expand Up @@ -193,7 +191,7 @@ DROP FUNCTION IF EXISTS _timescaledb_functions.chunk_statistics_reset();

DROP FUNCTION IF EXISTS @extschema@.create_hypertable(relation REGCLASS, time_column_name NAME, partitioning_column NAME, number_partitions INTEGER, associated_schema_name NAME, associated_table_prefix NAME, chunk_time_interval ANYELEMENT, create_default_indexes BOOLEAN, if_not_exists BOOLEAN, partitioning_func REGPROC, migrate_data BOOLEAN, time_partitioning_func REGPROC);

-- Restore the chunk_target_size check constraint dropped in the forward path.
-- Restore the chunk_target_size check constraint
ALTER TABLE _timescaledb_catalog.hypertable
ADD CONSTRAINT hypertable_chunk_target_size_check CHECK (chunk_target_size >= 0);

Expand Down Expand Up @@ -293,4 +291,15 @@ CREATE TABLE _timescaledb_catalog.telemetry_event (
);
GRANT SELECT ON _timescaledb_catalog.telemetry_event TO PUBLIC;

DROP FUNCTION IF EXISTS _timescaledb_functions.get_hypertable_info;
DROP FUNCTION IF EXISTS _timescaledb_functions.get_hypertable_info_by_id;
DROP FUNCTION IF EXISTS _timescaledb_functions.get_primary_dimension;
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_info;
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_info_by_id;
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_primary_range;
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_primary_range_by_id;
DROP FUNCTION IF EXISTS _timescaledb_functions.get_integer_now_func;
DROP FUNCTION IF EXISTS _timescaledb_functions.lock_osm_chunk_dimension_slice(regclass);

DROP FUNCTION IF EXISTS _timescaledb_functions.decompress_batch(record);

8 changes: 8 additions & 0 deletions tsl/test/shared/expected/extension.out
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,23 @@ ORDER BY pronamespace::regnamespace::text COLLATE "C", p.oid::regprocedure::text
_timescaledb_functions.freeze_chunk(regclass)
_timescaledb_functions.generate_uuid()
_timescaledb_functions.get_approx_row_count(regclass)
_timescaledb_functions.get_chunk_info(regclass)
_timescaledb_functions.get_chunk_info_by_id(integer)
_timescaledb_functions.get_chunk_primary_range(regclass)
_timescaledb_functions.get_chunk_primary_range_by_id(integer)
_timescaledb_functions.get_compressed_chunk_index_for_recompression(regclass)
_timescaledb_functions.get_create_command(name)
_timescaledb_functions.get_git_commit()
_timescaledb_functions.get_hypertable_info(regclass)
_timescaledb_functions.get_hypertable_info_by_id(integer)
_timescaledb_functions.get_integer_now_func(integer)
_timescaledb_functions.get_internal_time_max(regtype)
_timescaledb_functions.get_internal_time_min(regtype)
_timescaledb_functions.get_orderby_defaults(regclass,text[])
_timescaledb_functions.get_os_info()
_timescaledb_functions.get_partition_for_key(anyelement)
_timescaledb_functions.get_partition_hash(anyelement)
_timescaledb_functions.get_primary_dimension(integer)
_timescaledb_functions.get_segmentby_defaults(regclass)
_timescaledb_functions.hist_combinefunc(internal,internal)
_timescaledb_functions.hist_deserializefunc(bytea,internal)
Expand Down
194 changes: 194 additions & 0 deletions tsl/test/shared/expected/osm_api.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
-- This file and its contents are licensed under the Timescale License.
-- Please see the included NOTICE for copyright information and
-- LICENSE-TIMESCALE for a copy of the license.
\pset null '<NULL>'
SELECT * FROM _timescaledb_functions.get_hypertable_info('public.metrics'::regclass);
hypertable_id | schema_name | table_name | is_cagg
---------------+-------------+------------+---------
1 | public | metrics | f

SELECT * FROM _timescaledb_functions.get_hypertable_info('public.hourly_device_metrics'::regclass);
hypertable_id | schema_name | table_name | is_cagg
---------------+-------------+------------+---------
<NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_hypertable_info(NULL);
hypertable_id | schema_name | table_name | is_cagg
---------------+-------------+------------+---------
<NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_hypertable_info(0);
hypertable_id | schema_name | table_name | is_cagg
---------------+-------------+------------+---------
<NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_hypertable_info('pg_catalog.pg_class'::regclass);
hypertable_id | schema_name | table_name | is_cagg
---------------+-------------+------------+---------
<NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_hypertable_info_by_id(1);
hypertable_id | schema_name | table_name | is_cagg
---------------+-------------+------------+---------
1 | public | metrics | f

SELECT * FROM _timescaledb_functions.get_hypertable_info_by_id(8);
hypertable_id | schema_name | table_name | is_cagg
---------------+-----------------------+----------------------------+---------
8 | _timescaledb_internal | _materialized_hypertable_X | f

SELECT * FROM _timescaledb_functions.get_hypertable_info_by_id(0);
hypertable_id | schema_name | table_name | is_cagg
---------------+-------------+------------+---------
<NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_hypertable_info_by_id(NULL);
hypertable_id | schema_name | table_name | is_cagg
---------------+-------------+------------+---------
<NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_primary_dimension(1);
column_name | column_type | integer_now_func
-------------+--------------------------+------------------
time | timestamp with time zone | <NULL>

SELECT * FROM _timescaledb_functions.get_primary_dimension(8);
column_name | column_type | integer_now_func
-------------+--------------------------+------------------
hour | timestamp with time zone | <NULL>

SELECT * FROM _timescaledb_functions.get_primary_dimension(0);
column_name | column_type | integer_now_func
-------------+-------------+------------------
<NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_primary_dimension(NULL);
column_name | column_type | integer_now_func
-------------+-------------+------------------
<NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_info('_timescaledb_internal._hyper_X_X_chunk');
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+-----------------------+------------------+--------------+-----------
3 | 1 | public | metrics | _timescaledb_internal | _hyper_X_X_chunk | f | f

SELECT * FROM _timescaledb_functions.get_chunk_info('_timescaledb_internal._hyper_X_X_chunk'::regclass);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+-----------------------+------------------+--------------+-----------
3 | 1 | public | metrics | _timescaledb_internal | _hyper_X_X_chunk | f | f

SELECT * FROM _timescaledb_functions.get_chunk_info(0);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+--------------+------------+--------------+-----------
<NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_info(NULL);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+--------------+------------+--------------+-----------
<NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_info('pg_catalog.pg_class'::regclass);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+--------------+------------+--------------+-----------
<NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_info_by_id(3);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+-----------------------+------------------+--------------+-----------
3 | 1 | public | metrics | _timescaledb_internal | _hyper_X_X_chunk | f | f

SELECT * FROM _timescaledb_functions.get_chunk_info_by_id(38);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+-----------------------+----------------------------+-----------------------+-------------------+--------------+-----------
38 | 8 | _timescaledb_internal | _materialized_hypertable_X | _timescaledb_internal | _hyper_X_X_chunk | f | f

SELECT * FROM _timescaledb_functions.get_chunk_info_by_id(0);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+--------------+------------+--------------+-----------
<NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_info_by_id(-1);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+--------------+------------+--------------+-----------
<NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_info_by_id(NULL);
chunk_id | hypertable_id | ht_schema_name | ht_table_name | chunk_schema | chunk_name | is_osm_chunk | is_frozen
----------+---------------+----------------+---------------+--------------+------------+--------------+-----------
<NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_primary_range('_timescaledb_internal._hyper_X_X_chunk'::regclass);
range_start | range_end
-----------------+-----------------
947721600000000 | 948326400000000

SELECT * FROM _timescaledb_functions.get_chunk_primary_range(0::regclass);
range_start | range_end
-------------+-----------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_primary_range(1::regclass);
range_start | range_end
-------------+-----------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_primary_range('pg_catalog.pg_class'::regclass);
range_start | range_end
-------------+-----------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_primary_range(NULL::regclass);
range_start | range_end
-------------+-----------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_primary_range_by_id(3);
range_start | range_end
-----------------+-----------------
947721600000000 | 948326400000000

SELECT * FROM _timescaledb_functions.get_chunk_primary_range_by_id(38);
range_start | range_end
-----------------+-----------------
943488000000000 | 949536000000000

SELECT * FROM _timescaledb_functions.get_chunk_primary_range_by_id(0::int);
range_start | range_end
-------------+-----------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_primary_range_by_id(-1::int);
range_start | range_end
-------------+-----------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_chunk_primary_range_by_id(NULL::int);
range_start | range_end
-------------+-----------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_integer_now_func(1);
hypertable | integer_func
------------+--------------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_integer_now_func(8);
hypertable | integer_func
------------+--------------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_integer_now_func(0);
hypertable | integer_func
------------+--------------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_integer_now_func(-1);
hypertable | integer_func
------------+--------------
<NULL> | <NULL>

SELECT * FROM _timescaledb_functions.get_integer_now_func(NULL);
hypertable | integer_func
------------+--------------
<NULL> | <NULL>

1 change: 1 addition & 0 deletions tsl/test/shared/sql/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ set(TEST_FILES_SHARED
gapfill_bug.sql
generated_columns.sql
memoize.sql
osm_api.sql
parameterized_chunkappend.sql
security_barrier.sql
subtract_integer_from_now.sql)
Expand Down
Loading
Loading