Skip to content

Commit 90e6768

Browse files
committed
Add compatibility API for OSM
Add some helper function to decouple OSM from direct catalog access: _timescaledb_functions.get_hypertable_id(hypertable REGCLASS) _timescaledb_functions.get_hypertable_id(schema_name name, table_name name) _timescaledb_functions.get_hypertable_name(IN hypertable_id INTEGER, OUT schema_name name, OUT table_name name) _timescaledb_functions.get_chunk_id(hypertable REGCLASS) _timescaledb_functions.get_chunk_id(schema_name name, table_name name) _timescaledb_functions.get_chunk_name(IN chunk_id INTEGER, OUT schema_name name, OUT table_name name) _timescaledb_functions.get_hypertable_info _timescaledb_functions.get_primary_dimension _timescaledb_functions.get_chunk_info _timescaledb_functions.get_chunk_info_by_id _timescaledb_functions.get_chunk_primary_range _timescaledb_functions.get_chunk_primary_range_by_id _timescaledb_functions.lock_osm_dimension_slice _timescaledb_functions.lock_osm_dimension_slice_by_id
1 parent fd3c049 commit 90e6768

6 files changed

Lines changed: 547 additions & 1 deletion

File tree

sql/osm_api.sql

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,115 @@ CREATE OR REPLACE FUNCTION _timescaledb_functions.hypertable_osm_range_update(
1212
empty BOOL = false
1313
) RETURNS BOOL AS '@MODULE_PATHNAME@',
1414
'ts_hypertable_osm_range_update' LANGUAGE C VOLATILE;
15+
16+
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_hypertable_id(hypertable REGCLASS) RETURNS INTEGER
17+
AS $$
18+
SELECT ht.id
19+
FROM _timescaledb_catalog.hypertable ht
20+
JOIN pg_class c ON ht.table_name = c.relname AND ht.schema_name = c.relnamespace::regnamespace::name AND c.oid = hypertable;
21+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
22+
23+
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_hypertable_id(schema_name name, table_name name) RETURNS INTEGER
24+
AS $$
25+
SELECT ht.id FROM _timescaledb_catalog.hypertable ht WHERE ht.schema_name = $1 AND ht.table_name = $2;
26+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
27+
28+
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_hypertable_name(IN hypertable_id INTEGER, OUT schema_name name, OUT table_name name) AS $$
29+
SELECT ht.schema_name, ht.table_name FROM _timescaledb_catalog.hypertable ht WHERE ht.id = hypertable_id;
30+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
31+
32+
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_id(hypertable REGCLASS) RETURNS INTEGER
33+
AS $$
34+
SELECT ch.id
35+
FROM _timescaledb_catalog.chunk ch
36+
JOIN pg_class c ON ch.table_name = c.relname AND ch.schema_name = c.relnamespace::regnamespace::name AND c.oid = hypertable;
37+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
38+
39+
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_id(schema_name name, table_name name) RETURNS INTEGER
40+
AS $$
41+
SELECT ch.id FROM _timescaledb_catalog.chunk ch WHERE ch.schema_name = $1 AND ch.table_name = $2;
42+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
43+
44+
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_name(IN chunk_id INTEGER, OUT schema_name name, OUT table_name name) AS $$
45+
SELECT ch.schema_name, ch.table_name FROM _timescaledb_catalog.chunk ch WHERE ch.id = chunk_id;
46+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
47+
48+
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 $$
49+
SELECT ht.id, ht.schema_name, ht.table_name, false AS is_cagg
50+
FROM _timescaledb_catalog.hypertable ht
51+
JOIN pg_class c ON ht.table_name = c.relname AND ht.schema_name = c.relnamespace::regnamespace::name AND c.oid = relation
52+
UNION ALL
53+
SELECT ht.id, ht.schema_name, ht.table_name, true AS is_cagg
54+
FROM _timescaledb_catalog.continuous_agg cagg
55+
JOIN pg_class c ON cagg.user_view_name = c.relname AND cagg.user_view_schema = c.relnamespace::regnamespace::name AND c.oid = relation
56+
JOIN _timescaledb_catalog.hypertable ht ON ht.id=cagg.mat_hypertable_id;
57+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
58+
59+
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 $$
60+
SELECT
61+
d.column_name,
62+
d.column_type,
63+
CASE WHEN integer_now_func_schema IS NOT NULL AND integer_now_func IS NOT NULL THEN to_regproc(format('%I.%I',integer_now_func_schema,integer_now_func)) END AS integer_now
64+
FROM _timescaledb_catalog.dimension d
65+
LEFT JOIN _timescaledb_catalog.continuous_agg cagg ON cagg.mat_hypertable_id = $1
66+
WHERE d.hypertable_id = COALESCE(cagg.raw_hypertable_id, $1) ORDER BY d.id LIMIT 1;
67+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
68+
69+
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 $$
70+
SELECT
71+
ch.id AS chunk_id,
72+
ch.hypertable_id, ht.schema_name AS ht_schema_name, ht.table_name AS ht_table_name,
73+
ch.schema_name AS chunk_schema, ch.table_name AS chunk_name,
74+
ch.osm_chunk AS is_osm_chunk,
75+
(ch.status & 4)::bool AS is_frozen
76+
FROM _timescaledb_catalog.chunk ch
77+
JOIN pg_class c ON c.oid=$1 AND ch.table_name=c.relname AND ch.schema_name = c.relnamespace::regnamespace::name
78+
JOIN _timescaledb_catalog.hypertable ht ON ht.id=ch.hypertable_id;
79+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
80+
81+
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 $$
82+
SELECT
83+
ch.id AS chunk_id,
84+
ch.hypertable_id, ht.schema_name AS ht_schema_name, ht.table_name AS ht_table_name,
85+
ch.schema_name AS chunk_schema, ch.table_name AS chunk_name,
86+
ch.osm_chunk AS is_osm_chunk,
87+
(ch.status & 4)::bool AS is_frozen
88+
FROM _timescaledb_catalog.chunk ch
89+
JOIN _timescaledb_catalog.hypertable ht ON ht.id=ch.hypertable_id
90+
WHERE ch.id = $1;
91+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
92+
93+
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_primary_range_by_id(IN chunk_id INTEGER, OUT range_start BIGINT, OUT range_end BIGINT)
94+
AS $$
95+
SELECT range_start, range_end
96+
FROM _timescaledb_catalog.dimension_slice d
97+
WHERE chunk_id = $1 ORDER BY dimension_id LIMIT 1;
98+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
99+
100+
CREATE OR REPLACE FUNCTION _timescaledb_functions.get_chunk_primary_range(IN chunk REGCLASS, OUT range_start BIGINT, OUT range_end BIGINT)
101+
AS $$
102+
SELECT range_start, range_end
103+
FROM _timescaledb_catalog.dimension_slice d
104+
JOIN _timescaledb_catalog.chunk ch ON ch.id = d.chunk_id
105+
JOIN pg_class c ON c.oid=$1 AND ch.table_name=c.relname AND ch.schema_name = c.relnamespace::regnamespace::name
106+
ORDER BY dimension_id LIMIT 1;
107+
$$ LANGUAGE SQL STABLE SET search_path = pg_catalog, pg_temp;
108+
109+
CREATE OR REPLACE FUNCTION _timescaledb_functions.lock_osm_dimension_slice(hypertable REGCLASS) RETURNS VOID
110+
AS $$
111+
SELECT
112+
FROM _timescaledb_catalog.dimension_slice ds
113+
JOIN _timescaledb_catalog.chunk ch ON ds.chunk_id=ch.id AND ch.osm_chunk
114+
JOIN _timescaledb_catalog.hypertable ht ON ht.id=ch.hypertable_id
115+
JOIN pg_class c ON ht.table_name = c.relname AND ht.schema_name = c.relnamespace::regnamespace::name AND c.oid = $1
116+
FOR UPDATE OF ds;
117+
$$ LANGUAGE SQL VOLATILE SET search_path = pg_catalog, pg_temp;
118+
119+
CREATE OR REPLACE FUNCTION _timescaledb_functions.lock_osm_dimension_slice_by_id(hypertable_id INTEGER) RETURNS VOID
120+
AS $$
121+
SELECT
122+
FROM _timescaledb_catalog.dimension_slice ds
123+
JOIN _timescaledb_catalog.chunk ch ON ds.chunk_id=ch.id AND ch.osm_chunk AND ch.hypertable_id = $1
124+
FOR UPDATE OF ds;
125+
$$ LANGUAGE SQL VOLATILE SET search_path = pg_catalog, pg_temp;
126+

sql/updates/reverse-dev.sql

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,16 @@ GRANT SELECT ON _timescaledb_catalog.dimension_slice_id_seq TO PUBLIC;
185185
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);
186186

187187

188-
-- Restore the chunk_target_size check constraint dropped in the forward path.
188+
-- Restore the chunk_target_size check constraint
189189
ALTER TABLE _timescaledb_catalog.hypertable
190190
ADD CONSTRAINT hypertable_chunk_target_size_check CHECK (chunk_target_size >= 0);
191+
191192
DROP FUNCTION IF EXISTS _timescaledb_functions.rebuild_sparse_index(REGCLASS, BOOLEAN);
193+
194+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_hypertable_id(hypertable REGCLASS);
195+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_hypertable_id(schema_name name, table_name name);
196+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_hypertable_name(IN hypertable_id INTEGER, OUT schema_name name, OUT table_name name);
197+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_id(hypertable REGCLASS);
198+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_id(schema_name name, table_name name);
199+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_name(IN chunk_id INTEGER, OUT schema_name name, OUT table_name name);
200+

tsl/test/shared/expected/extension.out

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,15 @@ ORDER BY pronamespace::regnamespace::text COLLATE "C", p.oid::regprocedure::text
6969
_timescaledb_functions.freeze_chunk(regclass)
7070
_timescaledb_functions.generate_uuid()
7171
_timescaledb_functions.get_approx_row_count(regclass)
72+
_timescaledb_functions.get_chunk_id(name,name)
73+
_timescaledb_functions.get_chunk_id(regclass)
74+
_timescaledb_functions.get_chunk_name(integer)
7275
_timescaledb_functions.get_compressed_chunk_index_for_recompression(regclass)
7376
_timescaledb_functions.get_create_command(name)
7477
_timescaledb_functions.get_git_commit()
78+
_timescaledb_functions.get_hypertable_id(name,name)
79+
_timescaledb_functions.get_hypertable_id(regclass)
80+
_timescaledb_functions.get_hypertable_name(integer)
7581
_timescaledb_functions.get_internal_time_max(regtype)
7682
_timescaledb_functions.get_internal_time_min(regtype)
7783
_timescaledb_functions.get_orderby_defaults(regclass,text[])

0 commit comments

Comments
 (0)