1CALL SCHEMA_CATALOG.execute_everywhere('create_schemas', $ee$ DO $$ BEGIN
2    CREATE SCHEMA IF NOT EXISTS SCHEMA_CATALOG; -- catalog tables + internal functions
3    GRANT USAGE ON SCHEMA SCHEMA_CATALOG TO prom_reader;
4
5    CREATE SCHEMA IF NOT EXISTS SCHEMA_PROM; -- public functions
6    GRANT USAGE ON SCHEMA SCHEMA_PROM TO prom_reader;
7
8    CREATE SCHEMA IF NOT EXISTS SCHEMA_EXT; -- optimized versions of functions created by the extension
9    GRANT USAGE ON SCHEMA SCHEMA_EXT TO prom_reader;
10
11    CREATE SCHEMA IF NOT EXISTS SCHEMA_SERIES; -- series views
12    GRANT USAGE ON SCHEMA SCHEMA_SERIES TO prom_reader;
13
14    CREATE SCHEMA IF NOT EXISTS SCHEMA_METRIC; -- metric views
15    GRANT USAGE ON SCHEMA SCHEMA_METRIC TO prom_reader;
16
17    CREATE SCHEMA IF NOT EXISTS SCHEMA_DATA;
18    GRANT USAGE ON SCHEMA SCHEMA_DATA TO prom_reader;
19
20    CREATE SCHEMA IF NOT EXISTS SCHEMA_DATA_SERIES;
21    GRANT USAGE ON SCHEMA SCHEMA_DATA_SERIES TO prom_reader;
22
23    CREATE SCHEMA IF NOT EXISTS SCHEMA_INFO;
24    GRANT USAGE ON SCHEMA SCHEMA_INFO TO prom_reader;
25
26    CREATE SCHEMA IF NOT EXISTS SCHEMA_DATA_EXEMPLAR;
27    GRANT USAGE ON SCHEMA SCHEMA_DATA_EXEMPLAR TO prom_reader;
28    GRANT ALL ON SCHEMA SCHEMA_DATA_EXEMPLAR TO prom_writer;
29END $$ $ee$);
30
31-- the promscale extension contains optimized version of some
32-- of our functions and operators. To ensure the correct version of the are
33-- used, SCHEMA_EXT must be before all of our other schemas in the search path
34DO $$
35DECLARE
36   new_path text;
37BEGIN
38   new_path := current_setting('search_path') || format(',%L,%L,%L,%L', 'SCHEMA_EXT', 'SCHEMA_PROM', 'SCHEMA_METRIC', 'SCHEMA_CATALOG');
39   execute format('ALTER DATABASE %I SET search_path = %s', current_database(), new_path);
40   execute format('SET search_path = %s', new_path);
41END
42$$;
43