diff schema/gemma.sql @ 4602:9fef9930aa8a geoserver_sql_views

Add field for GeoServer SQL view definition
author Tom Gottfried <tom@intevation.de>
date Mon, 02 Sep 2019 18:45:15 +0200
parents 27ed6f709195
children d24e951206ca
line wrap: on
line diff
--- a/schema/gemma.sql	Mon Sep 02 18:38:27 2019 +0200
+++ b/schema/gemma.sql	Mon Sep 02 18:45:15 2019 +0200
@@ -23,6 +23,25 @@
 CREATE EXTENSION btree_gist;
 
 --
+-- Functions to be used in CHECK constraints
+--
+
+-- Check if a given string can be used as a FROM item in an SQL statement
+CREATE OR REPLACE FUNCTION is_valid_from_item(stmt text) RETURNS boolean
+AS $$
+BEGIN
+    EXECUTE format('SELECT * FROM (%s) AS test', stmt);
+    RETURN true;
+EXCEPTION
+    WHEN OTHERS THEN
+        RAISE NOTICE USING MESSAGE = SQLERRM, ERRCODE = SQLSTATE;
+        RETURN false;
+END
+$$
+    LANGUAGE plpgsql;
+
+
+--
 -- Trigger functions
 --
 -- TODO: will there ever be UPDATEs or can we drop that function due to
@@ -272,10 +291,14 @@
     )
 
     CREATE TABLE published_services (
-        name regclass PRIMARY KEY,
+        name varchar PRIMARY KEY,
+        -- SQL statement used for an SQL view in GeoServer:
+        view_def text CHECK (is_valid_from_item(view_def)),
         style xml CHECK(style IS DOCUMENT),
         as_wms boolean NOT NULL DEFAULT TRUE,
-        as_wfs boolean NOT NULL DEFAULT TRUE
+        as_wfs boolean NOT NULL DEFAULT TRUE,
+        -- Either give a valid relation name or a SQL statement:
+        CHECK (to_regclass(name) IS NOT NULL OR view_def IS NOT NULL)
     )
 ;