From feef9206facc5c5f506661de4a81d96ef059b095 Mon Sep 17 00:00:00 2001
From: Sven Klemm <sven@timescale.com>
Date: Fri, 31 Mar 2023 08:22:57 +0200
Subject: [PATCH] Add _timescaledb_functions schema

Currently internal user objects like chunks and our functions
live in the same schema making locking down that schema hard.
This patch adds a new schema _timescaledb_functions that is meant
to be the schema used for timescaledb internal functions to
allow separation of code and chunks or other user objects.
---
 sql/pre_install/schemas.sql | 3 ++-
 sql/updates/latest-dev.sql  | 4 ++++
 sql/updates/reverse-dev.sql | 2 ++
 src/extension_constants.c   | 1 +
 src/extension_constants.h   | 2 ++
 5 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/sql/pre_install/schemas.sql b/sql/pre_install/schemas.sql
index f7eba4774..4f55c8f09 100644
--- a/sql/pre_install/schemas.sql
+++ b/sql/pre_install/schemas.sql
@@ -5,11 +5,12 @@
 SET LOCAL search_path TO pg_catalog, pg_temp;
 
 CREATE SCHEMA _timescaledb_catalog;
+CREATE SCHEMA _timescaledb_functions;
 CREATE SCHEMA _timescaledb_internal;
 CREATE SCHEMA _timescaledb_cache;
 CREATE SCHEMA _timescaledb_config;
 CREATE SCHEMA timescaledb_experimental;
 CREATE SCHEMA timescaledb_information;
 
-GRANT USAGE ON SCHEMA _timescaledb_cache, _timescaledb_catalog, _timescaledb_internal, _timescaledb_config, timescaledb_information, timescaledb_experimental TO PUBLIC;
+GRANT USAGE ON SCHEMA _timescaledb_cache, _timescaledb_catalog, _timescaledb_functions, _timescaledb_internal, _timescaledb_config, timescaledb_information, timescaledb_experimental TO PUBLIC;
 
diff --git a/sql/updates/latest-dev.sql b/sql/updates/latest-dev.sql
index 1a6ba8c92..a15b13e8f 100644
--- a/sql/updates/latest-dev.sql
+++ b/sql/updates/latest-dev.sql
@@ -24,3 +24,7 @@ AS '@MODULE_PATHNAME@', 'ts_get_compressed_chunk_index_for_recompression' LANGUA
 
 DROP FUNCTION _timescaledb_internal.dimension_is_finite;
 DROP FUNCTION _timescaledb_internal.dimension_slice_get_constraint_sql;
+
+CREATE SCHEMA _timescaledb_functions;
+GRANT USAGE ON SCHEMA _timescaledb_functions TO PUBLIC;
+
diff --git a/sql/updates/reverse-dev.sql b/sql/updates/reverse-dev.sql
index f9bda5669..666d42d81 100644
--- a/sql/updates/reverse-dev.sql
+++ b/sql/updates/reverse-dev.sql
@@ -99,3 +99,5 @@ BEGIN
 END
 $BODY$ SET search_path TO pg_catalog, pg_temp;
 
+DROP SCHEMA _timescaledb_functions;
+
diff --git a/src/extension_constants.c b/src/extension_constants.c
index 6248adcfe..85e4413e5 100644
--- a/src/extension_constants.c
+++ b/src/extension_constants.c
@@ -7,6 +7,7 @@
 
 const char *const ts_extension_schema_names[] = {
 	[TS_CATALOG_SCHEMA] = CATALOG_SCHEMA_NAME,
+	[TS_FUNCTIONS_SCHEMA] = FUNCTIONS_SCHEMA_NAME,
 	[TS_INTERNAL_SCHEMA] = INTERNAL_SCHEMA_NAME,
 	[TS_CACHE_SCHEMA] = CACHE_SCHEMA_NAME,
 	[TS_CONFIG_SCHEMA] = CONFIG_SCHEMA_NAME,
diff --git a/src/extension_constants.h b/src/extension_constants.h
index 7c59239ba..6aa030f9e 100644
--- a/src/extension_constants.h
+++ b/src/extension_constants.h
@@ -24,6 +24,7 @@
 typedef enum TsExtensionSchemas
 {
 	TS_CATALOG_SCHEMA,
+	TS_FUNCTIONS_SCHEMA,
 	TS_INTERNAL_SCHEMA,
 	TS_CACHE_SCHEMA,
 	TS_CONFIG_SCHEMA,
@@ -35,6 +36,7 @@ typedef enum TsExtensionSchemas
 #define NUM_TIMESCALEDB_SCHEMAS _TS_MAX_SCHEMA
 
 #define CATALOG_SCHEMA_NAME "_timescaledb_catalog"
+#define FUNCTIONS_SCHEMA_NAME "_timescaledb_functions"
 #define INTERNAL_SCHEMA_NAME "_timescaledb_internal"
 #define CACHE_SCHEMA_NAME "_timescaledb_cache"
 #define CONFIG_SCHEMA_NAME "_timescaledb_config"