Skip to content

Commit ceb3742

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)
1 parent 1dd7df9 commit ceb3742

6 files changed

Lines changed: 221 additions & 0 deletions

File tree

sql/osm_api.sql

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,36 @@ 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+

sql/updates/reverse-dev.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,11 @@ DROP FUNCTION IF EXISTS @extschema@.create_hypertable(relation REGCLASS, time_co
188188
-- Restore the chunk_target_size check constraint dropped in the forward path.
189189
ALTER TABLE _timescaledb_catalog.hypertable
190190
ADD CONSTRAINT hypertable_chunk_target_size_check CHECK (chunk_target_size >= 0);
191+
192+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_hypertable_id(hypertable REGCLASS);
193+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_hypertable_id(schema_name name, table_name name);
194+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_hypertable_name(IN hypertable_id INTEGER, OUT schema_name name, OUT table_name name);
195+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_id(hypertable REGCLASS);
196+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_id(schema_name name, table_name name);
197+
DROP FUNCTION IF EXISTS _timescaledb_functions.get_chunk_name(IN chunk_id INTEGER, OUT schema_name name, OUT table_name name);
198+

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[])
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
-- This file and its contents are licensed under the Timescale License.
2+
-- Please see the included NOTICE for copyright information and
3+
-- LICENSE-TIMESCALE for a copy of the license.
4+
\pset null '<NULL>'
5+
SELECT _timescaledb_functions.get_hypertable_id('public.metrics');
6+
get_hypertable_id
7+
-------------------
8+
1
9+
10+
SELECT _timescaledb_functions.get_hypertable_id('public.metrics'::regclass);
11+
get_hypertable_id
12+
-------------------
13+
1
14+
15+
SELECT _timescaledb_functions.get_hypertable_id('public','metrics');
16+
get_hypertable_id
17+
-------------------
18+
1
19+
20+
SELECT _timescaledb_functions.get_hypertable_id(NULL);
21+
get_hypertable_id
22+
-------------------
23+
<NULL>
24+
25+
SELECT _timescaledb_functions.get_hypertable_id('pg_catalog.pg_class');
26+
get_hypertable_id
27+
-------------------
28+
<NULL>
29+
30+
SELECT _timescaledb_functions.get_hypertable_id('pg_catalog','pg_class');
31+
get_hypertable_id
32+
-------------------
33+
<NULL>
34+
35+
SELECT _timescaledb_functions.get_hypertable_id('','');
36+
get_hypertable_id
37+
-------------------
38+
<NULL>
39+
40+
SELECT _timescaledb_functions.get_hypertable_id(NULL, NULL);
41+
get_hypertable_id
42+
-------------------
43+
<NULL>
44+
45+
SELECT * FROM _timescaledb_functions.get_hypertable_name(1);
46+
schema_name | table_name
47+
-------------+------------
48+
public | metrics
49+
50+
SELECT * FROM _timescaledb_functions.get_hypertable_name(_timescaledb_functions.get_hypertable_id('public.metrics'));
51+
schema_name | table_name
52+
-------------+------------
53+
public | metrics
54+
55+
SELECT * FROM _timescaledb_functions.get_hypertable_name(0);
56+
schema_name | table_name
57+
-------------+------------
58+
<NULL> | <NULL>
59+
60+
SELECT * FROM _timescaledb_functions.get_hypertable_name(-1);
61+
schema_name | table_name
62+
-------------+------------
63+
<NULL> | <NULL>
64+
65+
SELECT * FROM _timescaledb_functions.get_hypertable_name(NULL);
66+
schema_name | table_name
67+
-------------+------------
68+
<NULL> | <NULL>
69+
70+
SELECT _timescaledb_functions.get_chunk_id('_timescaledb_internal._hyper_X_X_chunk');
71+
get_chunk_id
72+
--------------
73+
3
74+
75+
SELECT _timescaledb_functions.get_chunk_id('_timescaledb_internal._hyper_X_X_chunk'::regclass);
76+
get_chunk_id
77+
--------------
78+
3
79+
80+
SELECT _timescaledb_functions.get_chunk_id('_timescaledb_internal','_hyper_X_X_chunk');
81+
get_chunk_id
82+
--------------
83+
3
84+
85+
SELECT _timescaledb_functions.get_chunk_id(NULL);
86+
get_chunk_id
87+
--------------
88+
<NULL>
89+
90+
SELECT _timescaledb_functions.get_chunk_id('pg_catalog.pg_class');
91+
get_chunk_id
92+
--------------
93+
<NULL>
94+
95+
SELECT _timescaledb_functions.get_chunk_id('pg_catalog','pg_class');
96+
get_chunk_id
97+
--------------
98+
<NULL>
99+
100+
SELECT _timescaledb_functions.get_chunk_id('','');
101+
get_chunk_id
102+
--------------
103+
<NULL>
104+
105+
SELECT _timescaledb_functions.get_chunk_id(NULL, NULL);
106+
get_chunk_id
107+
--------------
108+
<NULL>
109+
110+
SELECT * FROM _timescaledb_functions.get_chunk_name(3);
111+
schema_name | table_name
112+
-----------------------+------------------
113+
_timescaledb_internal | _hyper_X_X_chunk
114+
115+
SELECT * FROM _timescaledb_functions.get_chunk_name(_timescaledb_functions.get_chunk_id('_timescaledb_internal._hyper_X_X_chunk'));
116+
schema_name | table_name
117+
-----------------------+------------------
118+
_timescaledb_internal | _hyper_X_X_chunk
119+
120+
SELECT * FROM _timescaledb_functions.get_chunk_name(0);
121+
schema_name | table_name
122+
-------------+------------
123+
<NULL> | <NULL>
124+
125+
SELECT * FROM _timescaledb_functions.get_chunk_name(-1);
126+
schema_name | table_name
127+
-------------+------------
128+
<NULL> | <NULL>
129+
130+
SELECT * FROM _timescaledb_functions.get_chunk_name(NULL);
131+
schema_name | table_name
132+
-------------+------------
133+
<NULL> | <NULL>
134+

tsl/test/shared/sql/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ set(TEST_FILES_SHARED
1313
gapfill_bug.sql
1414
generated_columns.sql
1515
memoize.sql
16+
osm_api.sql
1617
parameterized_chunkappend.sql
1718
security_barrier.sql
1819
subtract_integer_from_now.sql)

tsl/test/shared/sql/osm_api.sql

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
-- This file and its contents are licensed under the Timescale License.
2+
-- Please see the included NOTICE for copyright information and
3+
-- LICENSE-TIMESCALE for a copy of the license.
4+
5+
\pset null '<NULL>'
6+
7+
SELECT _timescaledb_functions.get_hypertable_id('public.metrics');
8+
SELECT _timescaledb_functions.get_hypertable_id('public.metrics'::regclass);
9+
SELECT _timescaledb_functions.get_hypertable_id('public','metrics');
10+
11+
SELECT _timescaledb_functions.get_hypertable_id(NULL);
12+
SELECT _timescaledb_functions.get_hypertable_id('pg_catalog.pg_class');
13+
SELECT _timescaledb_functions.get_hypertable_id('pg_catalog','pg_class');
14+
SELECT _timescaledb_functions.get_hypertable_id('','');
15+
SELECT _timescaledb_functions.get_hypertable_id(NULL, NULL);
16+
17+
SELECT * FROM _timescaledb_functions.get_hypertable_name(1);
18+
SELECT * FROM _timescaledb_functions.get_hypertable_name(_timescaledb_functions.get_hypertable_id('public.metrics'));
19+
20+
SELECT * FROM _timescaledb_functions.get_hypertable_name(0);
21+
SELECT * FROM _timescaledb_functions.get_hypertable_name(-1);
22+
SELECT * FROM _timescaledb_functions.get_hypertable_name(NULL);
23+
24+
SELECT _timescaledb_functions.get_chunk_id('_timescaledb_internal._hyper_1_3_chunk');
25+
SELECT _timescaledb_functions.get_chunk_id('_timescaledb_internal._hyper_1_3_chunk'::regclass);
26+
SELECT _timescaledb_functions.get_chunk_id('_timescaledb_internal','_hyper_1_3_chunk');
27+
28+
SELECT _timescaledb_functions.get_chunk_id(NULL);
29+
SELECT _timescaledb_functions.get_chunk_id('pg_catalog.pg_class');
30+
SELECT _timescaledb_functions.get_chunk_id('pg_catalog','pg_class');
31+
SELECT _timescaledb_functions.get_chunk_id('','');
32+
SELECT _timescaledb_functions.get_chunk_id(NULL, NULL);
33+
34+
SELECT * FROM _timescaledb_functions.get_chunk_name(3);
35+
SELECT * FROM _timescaledb_functions.get_chunk_name(_timescaledb_functions.get_chunk_id('_timescaledb_internal._hyper_1_3_chunk'));
36+
37+
SELECT * FROM _timescaledb_functions.get_chunk_name(0);
38+
SELECT * FROM _timescaledb_functions.get_chunk_name(-1);
39+
SELECT * FROM _timescaledb_functions.get_chunk_name(NULL);

0 commit comments

Comments
 (0)