From 0abc2ba2507ef5f43dbd6d145a9c3593bb2934ae Mon Sep 17 00:00:00 2001 From: Raul Marin Date: Tue, 24 Oct 2017 14:16:56 +0200 Subject: [PATCH] Add PARALLEL parameter to functions --- NEWS.md | 3 ++ scripts-available/CDB_AnalysisCheck.sql | 6 +-- scripts-available/CDB_AnalysisSupport.sql | 8 ++-- scripts-available/CDB_CartodbfyTable.sql | 38 +++++++-------- scripts-available/CDB_ColumnNames.sql | 2 +- scripts-available/CDB_ColumnType.sql | 2 +- scripts-available/CDB_Conf.sql | 6 +-- scripts-available/CDB_DateToNumber.sql | 4 +- scripts-available/CDB_DigitSeparator.sql | 2 +- scripts-available/CDB_DistType.sql | 4 +- scripts-available/CDB_DistinctMeasure.sql | 2 +- scripts-available/CDB_EqualIntervalBins.sql | 2 +- scripts-available/CDB_EstimateRowCount.sql | 4 +- scripts-available/CDB_ExtensionUtils.sql | 4 +- scripts-available/CDB_ForeignTable.sql | 16 +++---- scripts-available/CDB_GreatCircle.sql | 2 +- scripts-available/CDB_Groups.sql | 30 ++++++------ scripts-available/CDB_Groups_API.sql | 18 +++---- scripts-available/CDB_HeadsTailsBins.sql | 2 +- scripts-available/CDB_Helper.sql | 6 +-- scripts-available/CDB_Hexagon.sql | 4 +- scripts-available/CDB_JenksBins.sql | 4 +- scripts-available/CDB_LatLng.sql | 4 +- scripts-available/CDB_Math.sql | 5 +- scripts-available/CDB_Organizations.sql | 22 ++++----- scripts-available/CDB_Overviews.sql | 47 ++++++++++--------- scripts-available/CDB_OverviewsSupport.sql | 24 +++++----- scripts-available/CDB_QuantileBins.sql | 2 +- scripts-available/CDB_QueryStatements.sql | 2 +- scripts-available/CDB_QueryTables.sql | 4 +- scripts-available/CDB_Quota.sql | 12 ++--- scripts-available/CDB_RandomTids.sql | 2 +- scripts-available/CDB_RectangleGrid.sql | 4 +- scripts-available/CDB_Stats.sql | 4 +- scripts-available/CDB_StringToDate.sql | 2 +- scripts-available/CDB_TableIndexes.sql | 2 +- scripts-available/CDB_TableMetadata.sql | 6 +-- .../CDB_TransformToWebmercator.sql | 4 +- scripts-available/CDB_UserTables.sql | 2 +- scripts-available/CDB_XYZ.sql | 6 +-- scripts-available/CDB_ZoomFromScale.sql | 4 +- 41 files changed, 165 insertions(+), 162 deletions(-) diff --git a/NEWS.md b/NEWS.md index 38f3243..6027456 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +Dev (In progress) +* Added VOLATILITY and PARALLEL categories to all functions + 0.19.2 (2017-06-30) * Improved functions to generate unique identifiers #305 diff --git a/scripts-available/CDB_AnalysisCheck.sql b/scripts-available/CDB_AnalysisCheck.sql index 1aab236..1ecf2ac 100644 --- a/scripts-available/CDB_AnalysisCheck.sql +++ b/scripts-available/CDB_AnalysisCheck.sql @@ -7,7 +7,7 @@ BEGIN RETURN CDB_Conf_GetConf('analysis_quota_factor')::text::float8; END; $$ -LANGUAGE 'plpgsql' STABLE SECURITY DEFINER; +LANGUAGE 'plpgsql' STABLE PARALLEL SAFE SECURITY DEFINER; -- Get the factor (fraction of the quota) for Camshaft cached analysis tables @@ -26,7 +26,7 @@ BEGIN RETURN factor; END; $$ -LANGUAGE 'plpgsql' STABLE; +LANGUAGE 'plpgsql' STABLE PARALLEL SAFE; -- This checks the space used up by Camshaft cached analysis tables. -- An exception will be raised if the limits are exceeded. @@ -59,4 +59,4 @@ BEGIN RAISE EXCEPTION 'Analysis cache space limits exceeded'; END IF; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; diff --git a/scripts-available/CDB_AnalysisSupport.sql b/scripts-available/CDB_AnalysisSupport.sql index 4b127da..ad4b363 100644 --- a/scripts-available/CDB_AnalysisSupport.sql +++ b/scripts-available/CDB_AnalysisSupport.sql @@ -8,7 +8,7 @@ AS $$ BEGIN RETURN table_name SIMILAR TO '\Aanalysis_[0-9a-f]{10}_[0-9a-f]{40}\Z'; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- This function returns a relation of Camshaft cached analysis tables in the given schema. -- If the schema name parameter is NULL, then tables from all schemas @@ -19,7 +19,7 @@ CREATE OR REPLACE FUNCTION _CDB_AnalysisTablesInSchema(schema_name text DEFAULT RETURNS TABLE(table_regclass REGCLASS, schema_name TEXT, table_name TEXT) AS $$ SELECT * FROM _CDB_UserTablesInSchema(schema_name) WHERE _CDB_IsAnalysisTableName(table_name); -$$ LANGUAGE 'sql'; +$$ LANGUAGE 'sql' STABLE PARALLEL SAFE; -- This function returns a relation user tables excluding analysis tables -- If the schema name parameter is NULL, then tables from all schemas @@ -30,7 +30,7 @@ CREATE OR REPLACE FUNCTION _CDB_NonAnalysisTablesInSchema(schema_name text DEFAU RETURNS TABLE(table_regclass REGCLASS, schema_name TEXT, table_name TEXT) AS $$ SELECT * FROM _CDB_UserTablesInSchema(schema_name) WHERE Not _CDB_IsAnalysisTableName(table_name); -$$ LANGUAGE 'sql'; +$$ LANGUAGE 'sql' STABLE PARALLEL SAFE; -- Total spaced used up by Camshaft cached analysis tables in the given schema. -- Scope: private. @@ -52,4 +52,4 @@ BEGIN END IF; END; $$ -LANGUAGE 'plpgsql' VOLATILE; +LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; diff --git a/scripts-available/CDB_CartodbfyTable.sql b/scripts-available/CDB_CartodbfyTable.sql index 8e886a6..9ccf47c 100644 --- a/scripts-available/CDB_CartodbfyTable.sql +++ b/scripts-available/CDB_CartodbfyTable.sql @@ -26,7 +26,7 @@ BEGIN RAISE EXCEPTION 'Please set user quota before cartodbfying tables.'; END; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Drop cartodb triggers (might prevent changing columns) CREATE OR REPLACE FUNCTION _CDB_drop_triggers(reloid REGCLASS) @@ -49,7 +49,7 @@ BEGIN sql := Format('DROP TRIGGER IF EXISTS test_quota_per_row ON %s', reloid::text); EXECUTE sql; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Cartodb_id creation & validation or renaming if invalid @@ -195,7 +195,7 @@ BEGIN END; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Create all triggers @@ -235,7 +235,7 @@ BEGIN || ''')'; EXECUTE sql; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- 8.b) Create all raster triggers -- NOTE: drop/create has the side-effect of re-enabling disabled triggers @@ -267,7 +267,7 @@ BEGIN || ''')'; EXECUTE sql; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; @@ -279,7 +279,7 @@ BEGIN NEW.the_geom_webmercator := public.CDB_TransformToWebmercator(NEW.the_geom); RETURN NEW; END; -$$ LANGUAGE plpgsql VOLATILE; +$$ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE; --- Trigger to update the updated_at column. No longer added by default --- but kept here for compatibility with old tables which still have this behavior @@ -322,7 +322,7 @@ BEGIN RETURN is_raster; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL STABLE PARALLEL UNSAFE; @@ -398,7 +398,7 @@ geomcol := 'the_geom'; mercgeomcol := 'the_geom_webmercator'; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _CDB_Error(message TEXT, funcname TEXT DEFAULT '_CDB_Error') @@ -409,7 +409,7 @@ BEGIN RAISE EXCEPTION 'CDB(%): %', funcname, message; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _CDB_SQL(sql TEXT, funcname TEXT DEFAULT '_CDB_SQL') @@ -425,7 +425,7 @@ BEGIN RAISE EXCEPTION 'CDB(%:%:%): %', funcname, SQLSTATE, SQLERRM, sql; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; -- DEPRECATED: Use _CDB_Unique_Identifier since it's UTF8 Safe and length @@ -444,7 +444,7 @@ BEGIN RAISE EXCEPTION '_CDB_Unique_Relation_Name is DEPRECATED. Use _CDB_Unique_Identifier(prefix TEXT, relname TEXT, suffix TEXT, schema TEXT DEFAULT NULL)'; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL SAFE; -- DEPRECATED: Use _CDB_Unique_Column_Identifier since it's UTF8 Safe and length @@ -463,7 +463,7 @@ BEGIN RAISE EXCEPTION '_CDB_Unique_Column_Name is DEPRECATED. Use _CDB_Unique_Column_Identifier(prefix TEXT, relname TEXT, suffix TEXT, reloid REGCLASS DEFAULT NULL)'; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL SAFE; -- Find out if the table already has a usable primary key @@ -583,7 +583,7 @@ BEGIN -- Didn't find re-usable key, so return FALSE RETURN false; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION _CDB_Has_Usable_PK_Sequence(reloid REGCLASS) @@ -603,7 +603,7 @@ BEGIN RETURN has_sequence; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' STABLE PARALLEL SAFE; -- Return a set of columns that can be candidates to be the_geom[webmercator] -- with some extra information to analyze them. @@ -632,7 +632,7 @@ BEGIN AND postgis_typmod_srid(a.atttypmod) IN (4326, 3857, 0) ORDER BY t.oid ASC; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' STABLE PARALLEL SAFE; DO $$ BEGIN @@ -776,7 +776,7 @@ BEGIN RETURN rv; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; -- Create a copy of the table. Assumes that the "Has usable" functions @@ -1127,7 +1127,7 @@ BEGIN RETURN true; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; -- Assumes the table already has the right metadata columns @@ -1229,7 +1229,7 @@ BEGIN RETURN true; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; DROP FUNCTION IF EXISTS CDB_CartodbfyTable(destschema TEXT, reloid REGCLASS); CREATE OR REPLACE FUNCTION CDB_CartodbfyTable(destschema TEXT, reloid REGCLASS) @@ -1299,4 +1299,4 @@ BEGIN RETURN (destschema || '.' || destname)::regclass; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; diff --git a/scripts-available/CDB_ColumnNames.sql b/scripts-available/CDB_ColumnNames.sql index c35ba99..37fe0b4 100644 --- a/scripts-available/CDB_ColumnNames.sql +++ b/scripts-available/CDB_ColumnNames.sql @@ -9,7 +9,7 @@ AS $$ WHERE c.oid = $1::oid AND a.attstattarget < 0 -- exclude system columns ORDER BY a.attnum; -$$ LANGUAGE SQL; +$$ LANGUAGE SQL STABLE PARALLEL SAFE; -- This is to migrate from pre-0.2.0 version -- See http://github.com/CartoDB/cartodb-postgresql/issues/36 diff --git a/scripts-available/CDB_ColumnType.sql b/scripts-available/CDB_ColumnType.sql index 19b8934..df570cb 100644 --- a/scripts-available/CDB_ColumnType.sql +++ b/scripts-available/CDB_ColumnType.sql @@ -9,7 +9,7 @@ AS $$ WHERE c.oid = $1::oid AND a.attname = $2 AND a.attstattarget < 0; -- exclude system columns -$$ LANGUAGE SQL; +$$ LANGUAGE SQL STABLE PARALLEL SAFE; -- This is to migrate from pre-0.2.0 version -- See http://github.com/CartoDB/cartodb-postgresql/issues/36 diff --git a/scripts-available/CDB_Conf.sql b/scripts-available/CDB_Conf.sql index 8206309..9d8cea2 100644 --- a/scripts-available/CDB_Conf.sql +++ b/scripts-available/CDB_Conf.sql @@ -26,7 +26,7 @@ BEGIN PERFORM cartodb.CDB_Conf_RemoveConf(key); EXECUTE 'INSERT INTO cartodb.CDB_CONF (KEY, VALUE) VALUES ($1, $2);' USING key, value; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Conf_RemoveConf(key text) @@ -34,7 +34,7 @@ FUNCTION cartodb.CDB_Conf_RemoveConf(key text) BEGIN EXECUTE 'DELETE FROM cartodb.CDB_CONF WHERE KEY = $1;' USING key; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Conf_GetConf(key text) @@ -45,4 +45,4 @@ BEGIN EXECUTE 'SELECT VALUE FROM cartodb.CDB_CONF WHERE KEY = $1;' INTO value USING key; RETURN value; END -$$ LANGUAGE PLPGSQL STABLE; +$$ LANGUAGE PLPGSQL STABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_DateToNumber.sql b/scripts-available/CDB_DateToNumber.sql index 651d429..a6984c3 100644 --- a/scripts-available/CDB_DateToNumber.sql +++ b/scripts-available/CDB_DateToNumber.sql @@ -12,7 +12,7 @@ BEGIN RETURN output; END; $$ -LANGUAGE 'plpgsql' STABLE STRICT; +LANGUAGE 'plpgsql' IMMUTABLE STRICT PARALLEL UNSAFE; -- Convert timestamp with time zone to double precision -- @@ -28,4 +28,4 @@ BEGIN RETURN output; END; $$ -LANGUAGE 'plpgsql' STABLE STRICT; +LANGUAGE 'plpgsql' IMMUTABLE STRICT PARALLEL UNSAFE; diff --git a/scripts-available/CDB_DigitSeparator.sql b/scripts-available/CDB_DigitSeparator.sql index 100ec57..e6946b4 100644 --- a/scripts-available/CDB_DigitSeparator.sql +++ b/scripts-available/CDB_DigitSeparator.sql @@ -50,4 +50,4 @@ BEGIN END $$ -LANGUAGE 'plpgsql' STABLE STRICT; +LANGUAGE 'plpgsql' STABLE STRICT PARALLEL SAFE; diff --git a/scripts-available/CDB_DistType.sql b/scripts-available/CDB_DistType.sql index 7d2242f..67925c1 100644 --- a/scripts-available/CDB_DistType.sql +++ b/scripts-available/CDB_DistType.sql @@ -65,7 +65,7 @@ BEGIN RETURN signature; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE STRICT PARALLEL SAFE; -- Classify data into AJUSFL @@ -119,4 +119,4 @@ BEGIN RETURN type; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE STRICT PARALLEL SAFE; diff --git a/scripts-available/CDB_DistinctMeasure.sql b/scripts-available/CDB_DistinctMeasure.sql index 63ec647..f0018e3 100644 --- a/scripts-available/CDB_DistinctMeasure.sql +++ b/scripts-available/CDB_DistinctMeasure.sql @@ -43,4 +43,4 @@ BEGIN RETURN passes; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_EqualIntervalBins.sql b/scripts-available/CDB_EqualIntervalBins.sql index b63ea19..0aca55b 100644 --- a/scripts-available/CDB_EqualIntervalBins.sql +++ b/scripts-available/CDB_EqualIntervalBins.sql @@ -19,6 +19,6 @@ SELECT array_agg(bins) FROM ( SELECT min + generate_series(1,breaks)*del AS bins FROM stats) q; -$$ LANGUAGE SQL IMMUTABLE; +$$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE; DROP FUNCTION IF EXISTS CDB_EqualIntervalBins( numeric[], integer); diff --git a/scripts-available/CDB_EstimateRowCount.sql b/scripts-available/CDB_EstimateRowCount.sql index 6be76b0..3b43014 100644 --- a/scripts-available/CDB_EstimateRowCount.sql +++ b/scripts-available/CDB_EstimateRowCount.sql @@ -12,7 +12,7 @@ BEGIN EXECUTE Format('ANALYZE %s;', reloid); END IF; END -$$ LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER; +$$ LANGUAGE 'plpgsql' VOLATILE STRICT PARALLEL RESTRICTED SECURITY DEFINER; -- Return a row count estimate of the result of a query using statistics CREATE OR REPLACE FUNCTION CDB_EstimateRowCount(query text) @@ -28,4 +28,4 @@ BEGIN EXECUTE 'EXPLAIN (FORMAT JSON) ' || query INTO STRICT plan; RETURN plan->0->'Plan'->'Plan Rows'; END -$$ LANGUAGE 'plpgsql' VOLATILE STRICT; +$$ LANGUAGE 'plpgsql' VOLATILE STRICT PARALLEL RESTRICTED; diff --git a/scripts-available/CDB_ExtensionUtils.sql b/scripts-available/CDB_ExtensionUtils.sql index e5dedf5..77a362d 100644 --- a/scripts-available/CDB_ExtensionUtils.sql +++ b/scripts-available/CDB_ExtensionUtils.sql @@ -10,11 +10,11 @@ BEGIN sql := 'ALTER EXTENSION cartodb UPDATE TO ''' || ver || ''''; EXECUTE sql; END; -$$ language 'plpgsql' VOLATILE; +$$ language 'plpgsql' VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.schema_exists(schema_name text) RETURNS boolean AS $$ SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = schema_name::text); $$ -language sql VOLATILE; +language sql STABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_ForeignTable.sql b/scripts-available/CDB_ForeignTable.sql index b03d284..d2226df 100644 --- a/scripts-available/CDB_ForeignTable.sql +++ b/scripts-available/CDB_ForeignTable.sql @@ -69,7 +69,7 @@ BEGIN END $$ -LANGUAGE PLPGSQL; +LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb._CDB_Setup_FDWS() RETURNS VOID AS @@ -82,7 +82,7 @@ BEGIN END LOOP; END $$ -LANGUAGE PLPGSQL; +LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb._CDB_Setup_FDW(fdw_name text) @@ -95,7 +95,7 @@ BEGIN EXECUTE 'SELECT cartodb._CDB_Setup_FDW($1, $2)' USING fdw_name, config; END $BODY$ -LANGUAGE plpgsql VOLATILE; +LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Add_Remote_Table(source text, table_name text) RETURNS void AS @@ -107,7 +107,7 @@ BEGIN EXECUTE FORMAT ('GRANT SELECT ON %I.%I TO publicuser;', source, table_name); END $$ -LANGUAGE plpgsql; +LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Get_Foreign_Updated_At(foreign_table regclass) RETURNS timestamp with time zone AS @@ -129,7 +129,7 @@ BEGIN RETURN time; END $$ -LANGUAGE plpgsql; +LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb._cdb_dbname_of_foreign_table(reloid oid) @@ -142,7 +142,7 @@ RETURNS TEXT AS $$ WHERE ft.ftrelid = reloid )) WHERE option_name='dbname'; -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Return a set of (dbname, schema_name, table_name, updated_at) @@ -176,7 +176,7 @@ AS $$ ELSE (SELECT md.updated_at FROM CDB_TableMetadata md WHERE md.tabname = reloid) END) AS updated_at FROM fqtn; -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; -- Return the last updated time of a set of tables @@ -196,4 +196,4 @@ RETURNS timestamptz AS $$ FROM t_oid LEFT JOIN pg_catalog.pg_class c ON c.oid = reloid ) SELECT max(updated_at) FROM t_updated_at; -$$ LANGUAGE SQL; +$$ LANGUAGE SQL VOLATILE PARALLEL UNSAFE; diff --git a/scripts-available/CDB_GreatCircle.sql b/scripts-available/CDB_GreatCircle.sql index 950fae9..3b99ebb 100644 --- a/scripts-available/CDB_GreatCircle.sql +++ b/scripts-available/CDB_GreatCircle.sql @@ -23,4 +23,4 @@ BEGIN RETURN line; END; $$ -LANGUAGE 'plpgsql'; +LANGUAGE 'plpgsql' IMMUTABLE STRICT PARALLEL SAFE; diff --git a/scripts-available/CDB_Groups.sql b/scripts-available/CDB_Groups.sql index 43ba023..35704c0 100644 --- a/scripts-available/CDB_Groups.sql +++ b/scripts-available/CDB_Groups.sql @@ -15,7 +15,7 @@ BEGIN EXECUTE format('CREATE ROLE %I NOLOGIN;', group_role); PERFORM cartodb._CDB_Group_CreateGroup_API(group_name, group_role); END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Drops group and everything that role owns -- TODO: LIMITATION: in order to drop a role all its owned objects must be dropped before. @@ -33,7 +33,7 @@ BEGIN EXECUTE format('DROP ROLE IF EXISTS %I', group_role); PERFORM cartodb._CDB_Group_DropGroup_API(group_name); END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Renames a group CREATE OR REPLACE @@ -48,7 +48,7 @@ BEGIN EXECUTE format('ALTER ROLE %I RENAME TO %I', old_group_role, new_group_role); PERFORM cartodb._CDB_Group_RenameGroup_API(old_group_name, new_group_name, new_group_role); END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Adds users to a group CREATE OR REPLACE @@ -71,7 +71,7 @@ BEGIN end loop; PERFORM cartodb._CDB_Group_AddUsers_API(group_name, usernames); END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Removes users from a group CREATE OR REPLACE @@ -90,7 +90,7 @@ BEGIN end loop; PERFORM cartodb._CDB_Group_RemoveUsers_API(group_name, usernames); END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; ---------------------------------- -- TABLE MANAGEMENT FUNCTIONS @@ -107,7 +107,7 @@ DECLARE BEGIN PERFORM cartodb._CDB_Group_Table_GrantRead(group_name, username, table_name, true); END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb._CDB_Group_Table_GrantRead(group_name text, username text, table_name text, sync boolean) @@ -122,7 +122,7 @@ BEGIN PERFORM cartodb._CDB_Group_Table_GrantPermission_API(group_name, username, table_name, 'r'); END IF; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Grants table write permission to a group CREATE OR REPLACE @@ -133,7 +133,7 @@ DECLARE BEGIN PERFORM cartodb._CDB_Group_Table_GrantReadWrite(group_name, username, table_name, true); END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb._CDB_Group_Table_GrantReadWrite(group_name text, username text, table_name text, sync boolean) @@ -149,7 +149,7 @@ BEGIN PERFORM cartodb._CDB_Group_Table_GrantPermission_API(group_name, username, table_name, 'w'); END IF; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Granting and revoking permissions on sequences CREATE OR REPLACE @@ -175,7 +175,7 @@ BEGIN END LOOP; RETURN; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Revokes all permissions on a table from a group CREATE OR REPLACE @@ -186,7 +186,7 @@ DECLARE BEGIN PERFORM cartodb._CDB_Group_Table_RevokeAll(group_name, username, table_name, true); END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb._CDB_Group_Table_RevokeAll(group_name text, username text, table_name text, sync boolean) @@ -201,7 +201,7 @@ BEGIN PERFORM cartodb._CDB_Group_Table_RevokeAllPermission_API(group_name, username, table_name); END IF; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; ----------------------- -- Helper functions @@ -223,7 +223,7 @@ BEGIN END IF; RETURN group_role; END -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL STABLE PARALLEL SAFE; -- Returns the first owner of the schema matching username. Organization user schemas must have one only owner. CREATE OR REPLACE @@ -237,7 +237,7 @@ BEGIN SELECT pg_get_userbyid(nspowner) FROM pg_namespace WHERE nspname = username INTO user_role; RETURN user_role; END -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL STABLE PARALLEL SAFE; -- Database names are too long, we need a shorter version for composing role names CREATE OR REPLACE @@ -249,4 +249,4 @@ BEGIN SELECT md5(current_database()) INTO short_database_name; RETURN short_database_name; END -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL STABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_Groups_API.sql b/scripts-available/CDB_Groups_API.sql index a854225..9038cb4 100644 --- a/scripts-available/CDB_Groups_API.sql +++ b/scripts-available/CDB_Groups_API.sql @@ -22,7 +22,7 @@ $$ body = '{ "name": "%s", "database_role": "%s" }' % (group_name, group_role) query = "select cartodb._CDB_Group_API_Request('POST', '%s', '%s', '{200, 409}') as response_status" % (url, body) plpy.execute(query) -$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE SECURITY DEFINER; CREATE OR REPLACE FUNCTION cartodb._CDB_Group_DropGroup_API(group_name text) @@ -35,7 +35,7 @@ $$ query = "select cartodb._CDB_Group_API_Request('DELETE', '%s', '', '{204, 404}') as response_status" % url plpy.execute(query) -$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE SECURITY DEFINER; CREATE OR REPLACE FUNCTION cartodb._CDB_Group_RenameGroup_API(old_group_name text, new_group_name text, new_group_role text) @@ -48,7 +48,7 @@ $$ body = '{ "name": "%s", "database_role": "%s" }' % (new_group_name, new_group_role) query = "select cartodb._CDB_Group_API_Request('PUT', '%s', '%s', '{200, 409}') as response_status" % (url, body) plpy.execute(query) -$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE SECURITY DEFINER; CREATE OR REPLACE FUNCTION cartodb._CDB_Group_AddUsers_API(group_name text, usernames text[]) @@ -74,7 +74,7 @@ $$ body = "{ \"users\": [\"%s\"] }" % "\",\"".join(usernames) query = "select cartodb._CDB_Group_API_Request('DELETE', '%s', '%s', '{200, 404}') as response_status" % (url, body) plpy.execute(query) -$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE SECURITY DEFINER; DO LANGUAGE 'plpgsql' $$ BEGIN @@ -95,7 +95,7 @@ $$ body = '{ "access": "%s" }' % access query = "select cartodb._CDB_Group_API_Request('PUT', '%s', '%s', '{200, 409}') as response_status" % (url, body) plpy.execute(query) -$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE SECURITY DEFINER; DO LANGUAGE 'plpgsql' $$ BEGIN @@ -115,7 +115,7 @@ $$ url = '/api/v1/databases/{0}/groups/%s/permission/%s/tables/%s' % (urllib.pathname2url(group_name), username, table_name) query = "select cartodb._CDB_Group_API_Request('DELETE', '%s', '', '{200, 404}') as response_status" % url plpy.execute(query) -$$ LANGUAGE 'plpythonu' VOLATILE SECURITY DEFINER; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE SECURITY DEFINER; DO LANGUAGE 'plpgsql' $$ BEGIN @@ -146,7 +146,7 @@ $$ params = json.loads(conf) auth = 'Basic %s' % plpy.execute("SELECT cartodb._CDB_Group_API_Auth('%s', '%s') as auth" % (params['username'], params['password']))[0]['auth'] return { "host": params['host'], "port": params['port'], 'timeout': params['timeout'], 'auth': auth } -$$ LANGUAGE 'plpythonu' VOLATILE; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb._CDB_Group_API_Auth(username text, password text) @@ -154,7 +154,7 @@ FUNCTION cartodb._CDB_Group_API_Auth(username text, password text) $$ import base64 return base64.encodestring('%s:%s' % (username, password)).replace('\n', '') -$$ LANGUAGE 'plpythonu' VOLATILE; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE; -- url must contain a '%s' placeholder that will be replaced by current_database, for security reasons. CREATE OR REPLACE @@ -191,5 +191,5 @@ $$ raise last_err return None -$$ LANGUAGE 'plpythonu' VOLATILE; +$$ LANGUAGE 'plpythonu' VOLATILE PARALLEL UNSAFE; revoke all on function cartodb._CDB_Group_API_Request(text, text, text, int[]) from public; diff --git a/scripts-available/CDB_HeadsTailsBins.sql b/scripts-available/CDB_HeadsTailsBins.sql index 1a3b353..275ac7c 100644 --- a/scripts-available/CDB_HeadsTailsBins.sql +++ b/scripts-available/CDB_HeadsTailsBins.sql @@ -43,4 +43,4 @@ BEGIN END LOOP; RETURN reply; END; -$$ language plpgsql IMMUTABLE; \ No newline at end of file +$$ language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_Helper.sql b/scripts-available/CDB_Helper.sql index edf9196..2732ac9 100644 --- a/scripts-available/CDB_Helper.sql +++ b/scripts-available/CDB_Helper.sql @@ -61,7 +61,7 @@ BEGIN PERFORM _CDB_Error('looping too far', '_CDB_Unique_Identifier'); END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; -- UTF8 safe and length aware. Find a unique identifier for a column with a given prefix @@ -116,7 +116,7 @@ BEGIN PERFORM _CDB_Error('looping too far', '_CDB_Unique_Column_Identifier'); END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' VOLATILE PARALLEL SAFE; -- Truncates a given string to a max_octets octets taking care @@ -157,4 +157,4 @@ BEGIN RETURN left(string, (i - 1)); END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql' IMMUTABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_Hexagon.sql b/scripts-available/CDB_Hexagon.sql index 7b57a98..68430b1 100644 --- a/scripts-available/CDB_Hexagon.sql +++ b/scripts-available/CDB_Hexagon.sql @@ -8,7 +8,7 @@ AS $$ SELECT (ST_DumpPoints(ST_ExteriorRing(ST_Buffer($1, $2, 3)))).* ) as points WHERE path[1] % 2 != 0 -$$ LANGUAGE 'sql' IMMUTABLE STRICT; +$$ LANGUAGE 'sql' IMMUTABLE STRICT PARALLEL SAFE; -- -- Fill given extent with an hexagonal coverage @@ -132,4 +132,4 @@ BEGIN RETURN; END -$$ LANGUAGE 'plpgsql' IMMUTABLE; +$$ LANGUAGE 'plpgsql' IMMUTABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_JenksBins.sql b/scripts-available/CDB_JenksBins.sql index 86d967b..4b8328b 100644 --- a/scripts-available/CDB_JenksBins.sql +++ b/scripts-available/CDB_JenksBins.sql @@ -117,7 +117,7 @@ BEGIN RETURN (best_result)[2:array_upper(best_result, 1)]; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL RESTRICTED; @@ -217,5 +217,5 @@ BEGIN RETURN array_prepend(gvf, reply); END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_LatLng.sql b/scripts-available/CDB_LatLng.sql index 7f08f61..4160df6 100644 --- a/scripts-available/CDB_LatLng.sql +++ b/scripts-available/CDB_LatLng.sql @@ -10,10 +10,10 @@ CREATE OR REPLACE FUNCTION CDB_LatLng (lat NUMERIC, lng NUMERIC) RETURNS geometry as $$ -- this function is silly SELECT ST_SetSRID(ST_MakePoint(lng,lat),4326); -$$ language SQL IMMUTABLE; +$$ language SQL IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION CDB_LatLng (lat FLOAT8, lng FLOAT8) RETURNS geometry as $$ -- this function is silly SELECT ST_SetSRID(ST_MakePoint(lng,lat),4326); -$$ language SQL IMMUTABLE; +$$ language SQL IMMUTABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_Math.sql b/scripts-available/CDB_Math.sql index 44a1888..17ac1ff 100644 --- a/scripts-available/CDB_Math.sql +++ b/scripts-available/CDB_Math.sql @@ -13,7 +13,7 @@ $BODY$ ORDER BY COUNT(1) DESC, 1 LIMIT 1; $BODY$ -LANGUAGE 'sql' IMMUTABLE; +LANGUAGE 'sql' IMMUTABLE PARALLEL SAFE; DROP AGGREGATE IF EXISTS cartodb.CDB_Math_Mode(anyelement); @@ -21,6 +21,7 @@ CREATE AGGREGATE cartodb.CDB_Math_Mode(anyelement) ( SFUNC=array_append, STYPE=anyarray, FINALFUNC=_CDB_Math_final_mode, - INITCOND='{}' + INITCOND='{}', + PARALLEL = SAFE ); diff --git a/scripts-available/CDB_Organizations.sql b/scripts-available/CDB_Organizations.sql index 73063e3..b49529d 100644 --- a/scripts-available/CDB_Organizations.sql +++ b/scripts-available/CDB_Organizations.sql @@ -4,7 +4,7 @@ FUNCTION cartodb.CDB_Organization_Member_Group_Role_Member_Name() AS $$ SELECT 'cdb_org_member'::text || '_' || md5(current_database()); $$ -LANGUAGE SQL IMMUTABLE; +LANGUAGE SQL STABLE PARALLEL SAFE; DO LANGUAGE 'plpgsql' $$ DECLARE @@ -25,7 +25,7 @@ AS $$ BEGIN EXECUTE 'GRANT "' || cartodb.CDB_Organization_Member_Group_Role_Member_Name() || '" TO "' || role_name || '"'; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; ------------------------------------------------------------------------------- -- Administrator @@ -36,7 +36,7 @@ FUNCTION cartodb._CDB_Organization_Admin_Role_Name() AS $$ SELECT current_database() || '_a'::text; $$ -LANGUAGE SQL IMMUTABLE; +LANGUAGE SQL STABLE PARALLEL SAFE; -- Administrator role creation on extension install DO LANGUAGE 'plpgsql' $$ @@ -65,7 +65,7 @@ BEGIN -- CREATEROLE is not inherited, and is needed for user creation EXECUTE format('ALTER ROLE %I CREATEROLE', cdb_user_role); END -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Organization_RemoveAdmin(username text) @@ -80,7 +80,7 @@ BEGIN EXECUTE format('ALTER ROLE %I NOCREATEROLE', cdb_user_role); EXECUTE format('REVOKE %I FROM %I', cdb_admin_role, cdb_user_role); END -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; ------------------------------------------------------------------------------- -- Sharing tables @@ -93,7 +93,7 @@ BEGIN EXECUTE 'GRANT USAGE ON SCHEMA "' || from_schema || '" TO "' || to_role_name || '"'; EXECUTE 'GRANT SELECT ON "' || from_schema || '"."' || table_name || '" TO "' || to_role_name || '"'; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Organization_Add_Table_Organization_Read_Permission(from_schema text, table_name text) @@ -102,7 +102,7 @@ AS $$ BEGIN EXECUTE 'SELECT cartodb.CDB_Organization_Add_Table_Read_Permission(''' || from_schema || ''', ''' || table_name || ''', ''' || cartodb.CDB_Organization_Member_Group_Role_Member_Name() || ''');'; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Organization_Add_Table_Read_Write_Permission(from_schema text, table_name text, to_role_name text) @@ -112,7 +112,7 @@ BEGIN EXECUTE 'GRANT USAGE ON SCHEMA "' || from_schema || '" TO "' || to_role_name || '"'; EXECUTE 'GRANT SELECT, INSERT, UPDATE, DELETE ON "' || from_schema || '"."' || table_name || '" TO "' || to_role_name || '"'; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Organization_Add_Table_Organization_Read_Write_Permission(from_schema text, table_name text) @@ -121,7 +121,7 @@ AS $$ BEGIN EXECUTE 'SELECT cartodb.CDB_Organization_Add_Table_Read_Write_Permission(''' || from_schema || ''', ''' || table_name || ''', ''' || cartodb.CDB_Organization_Member_Group_Role_Member_Name() || ''');'; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE @@ -134,7 +134,7 @@ BEGIN -- We need to revoke usage on schema only if we are revoking privileges from the last table where to_role_name has -- any permission granted within the schema from_schema END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION cartodb.CDB_Organization_Remove_Organization_Access_Permission(from_schema text, table_name text) @@ -143,4 +143,4 @@ AS $$ BEGIN EXECUTE 'SELECT cartodb.CDB_Organization_Remove_Access_Permission(''' || from_schema || ''', ''' || table_name || ''', ''' || cartodb.CDB_Organization_Member_Group_Role_Member_Name() || ''');'; END -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; diff --git a/scripts-available/CDB_Overviews.sql b/scripts-available/CDB_Overviews.sql index 8e9a74a..70a3a1d 100644 --- a/scripts-available/CDB_Overviews.sql +++ b/scripts-available/CDB_Overviews.sql @@ -18,7 +18,7 @@ BEGIN RAISE NOTICE 'Dropped overview for level %: %', row.z, row.overview_table; END LOOP; END; -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; @@ -45,7 +45,7 @@ AS $$ WHERE _CDB_IsOverviewTableOf((SELECT relname FROM pg_class WHERE oid=reloid), table_name) ORDER BY z; END -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL STABLE PARALLEL RESTRICTED; -- Return existing overviews (if any) for multiple dataset tables. -- Scope: public @@ -69,7 +69,7 @@ AS $$ schema_name = _cdb_schema_name(base_table) AND _CDB_IsOverviewTableOf((SELECT relname FROM pg_class WHERE oid=base_table), table_name) ORDER BY base_table, z; -$$ LANGUAGE SQL; +$$ LANGUAGE SQL STABLE PARALLEL SAFE; -- Calculate the estimated extent of a cartodbfy'ed table. -- Scope: private. @@ -111,7 +111,7 @@ AS $$ RETURN ext; END; -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Determine the max feature density of a given dataset. -- Scope: private. @@ -187,7 +187,7 @@ AS $$ INTO fd; RETURN fd; END -$$ LANGUAGE PLPGSQL STABLE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Experimental default strategy to assign a reference base Z level -- to a cartodbfied table. The resulting Z level represents the @@ -223,7 +223,7 @@ AS $$ SELECT CDB_XYZ_Resolution(-8) INTO c; RETURN least(_CDB_MaxOverviewLevel()+1, ceil(log(2.0, (c*c*fd/lim)::numeric)/2)); END; -$$ LANGUAGE PLPGSQL STABLE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Overview table name for a given Z level and base dataset or overview table -- Scope: private. @@ -247,7 +247,7 @@ AS $$ SELECT _CDB_OverviewBaseTableName(base) INTO base; RETURN _CDB_OverviewTableName(base, overview_z); END -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- Sampling reduction method. -- Valid for any kind of geometry. @@ -310,7 +310,7 @@ AS $$ RETURN Format('%s', overview_table_name)::regclass; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Register new overview table (post-creation chores) -- Scope: private @@ -365,7 +365,7 @@ AS $$ -- it should be done here (CDB_Overviews would consume such metadata) END IF; END -$$ LANGUAGE PLPGSQL SECURITY DEFINER; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE SECURITY DEFINER; -- Dataset attributes (column names other than the -- CartoDB primary key and geometry columns) which should be aggregated @@ -381,7 +381,7 @@ AS $$ WHERE c NOT IN ( cdb.pkey, cdb.geomcol, cdb.mercgeomcol ) -$$ LANGUAGE SQL STABLE; +$$ LANGUAGE SQL STABLE PARALLEL SAFE; -- List of dataset attributes to be aggregated in aggregated overview -- as a comma-separated SQL expression. @@ -401,7 +401,7 @@ BEGIN RETURN attr_list; END -$$ LANGUAGE PLPGSQL STABLE; +$$ LANGUAGE PLPGSQL STABLE PARALLEL SAFE; -- Check if a column of a table is of an unlimited-length text type CREATE OR REPLACE FUNCTION _cdb_unlimited_text_column(reloid REGCLASS, col_name TEXT) @@ -417,7 +417,7 @@ AS $$ AND format_type(a.atttypid, NULL) IN ('text', 'character varying', 'character') AND format_type(a.atttypid, NULL) = format_type(a.atttypid, a.atttypmod) ); -$$ LANGUAGE SQL STABLE; +$$ LANGUAGE SQL STABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _cdb_categorical_column(reloid REGCLASS, col_name TEXT) RETURNS BOOLEAN @@ -446,7 +446,7 @@ BEGIN INTO categorical; RETURN categorical; END; -$$ LANGUAGE PLPGSQL VOLATILE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL RESTRICTED; CREATE OR REPLACE FUNCTION _cdb_mode_of_array(anyarray) RETURNS anyelement AS @@ -457,14 +457,15 @@ $$ ORDER BY COUNT(1) DESC, 1 LIMIT 1; $$ -LANGUAGE SQL IMMUTABLE; +LANGUAGE SQL IMMUTABLE PARALLEL SAFE; DROP AGGREGATE IF EXISTS _cdb_mode(anyelement); CREATE AGGREGATE _cdb_mode(anyelement) ( SFUNC=array_append, STYPE=anyarray, FINALFUNC=_cdb_mode_of_array, - INITCOND='{}' + INITCOND='{}', + PARALLEL = SAFE ); -- SQL Aggregation expression for a datase attribute @@ -536,7 +537,7 @@ BEGIN RETURN 'CASE count(*) WHEN 1 THEN MIN(' || qualified_column || ') ELSE NULL END::' || column_type; END CASE; END -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL RESTRICTED; -- List of dataset aggregated attributes as a comma-separated SQL expression. -- Scope: private. @@ -557,7 +558,7 @@ BEGIN RETURN attr_list; END -$$ LANGUAGE PLPGSQL STABLE; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL RESTRICTED; -- Array of geometry types detected in a cartodbfied table -- For effciency only look at a limited number of rwos. @@ -579,7 +580,7 @@ BEGIN INTO gtypes; RETURN gtypes; END -$$ LANGUAGE PLPGSQL STABLE; +$$ LANGUAGE PLPGSQL STABLE PARALLEL SAFE; -- Experimental Overview reduction method for point datasets. -- It clusters the points using a grid, then aggregates the point in each @@ -715,7 +716,7 @@ AS $$ RETURN Format('%s', overview_table_name)::regclass; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- This strategy places the aggregation of each cluster at the centroid of the cluster members. CREATE OR REPLACE FUNCTION _CDB_GridClusterCentroid_Reduce_Strategy(reloid REGCLASS, ref_z INTEGER, overview_z INTEGER, grid_px FLOAT8 DEFAULT NULL, has_overview_created BOOLEAN DEFAULT FALSE) @@ -843,7 +844,7 @@ AS $$ RETURN Format('%s', overview_table_name)::regclass; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- This strategy places the aggregation of each cluster at the position of one of the cluster members. CREATE OR REPLACE FUNCTION _CDB_GridClusterSample_Reduce_Strategy(reloid REGCLASS, ref_z INTEGER, overview_z INTEGER, grid_px FLOAT8 DEFAULT NULL, has_overview_created BOOLEAN DEFAULT FALSE) @@ -969,7 +970,7 @@ AS $$ RETURN Format('%s', overview_table_name)::regclass; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Create overview tables for a dataset. -- Scope: public @@ -992,7 +993,7 @@ BEGIN tolerance_px := 1.0; RETURN CDB_CreateOverviewsWithToleranceInPixels(reloid, tolerance_px, refscale_strategy, reduce_strategy); END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Create overviews with additional parameter to define the desired detail/tolerance in pixels CREATE OR REPLACE FUNCTION CDB_CreateOverviewsWithToleranceInPixels(reloid REGCLASS, tolerance_px FLOAT8, refscale_strategy regproc DEFAULT '_CDB_Feature_Density_Ref_Z_Strategy(REGCLASS,FLOAT8)'::regprocedure, reduce_strategy regproc DEFAULT '_CDB_GridCluster_Reduce_Strategy(REGCLASS,INTEGER,INTEGER,FLOAT8,BOOLEAN)'::regprocedure) @@ -1058,7 +1059,7 @@ BEGIN RETURN overview_tables; END; -$$ LANGUAGE PLPGSQL; +$$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; -- Here are some older signatures of these functions, no longer in use. -- They must be droped here, after the (new) definition of the function `CDB_CreateOverviews` diff --git a/scripts-available/CDB_OverviewsSupport.sql b/scripts-available/CDB_OverviewsSupport.sql index a16652b..ba874d5 100644 --- a/scripts-available/CDB_OverviewsSupport.sql +++ b/scripts-available/CDB_OverviewsSupport.sql @@ -15,7 +15,7 @@ AS $$ -- (gridding), so we'll limit Z to a maximum of 31 - 8 RETURN 23; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- Maximum zoom level usable with integer coordinates CREATE OR REPLACE FUNCTION _CDB_MaxZoomLevel() @@ -24,7 +24,7 @@ AS $$ BEGIN RETURN 31; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- Information about tables in a schema. -- If the schema name parameter is NULL, then tables from all schemas @@ -46,7 +46,7 @@ AS $$ THEN n.nspname NOT IN ('pg_catalog', 'information_schema', 'topology', 'cartodb') ELSE n.nspname = schema_name END; -$$ LANGUAGE 'sql'; +$$ LANGUAGE 'sql' STABLE PARALLEL SAFE; -- Pattern that can be used to detect overview tables and Extract -- the intended zoom level from the table name. @@ -57,7 +57,7 @@ AS $$ BEGIN RETURN '\A_vovw_(\d+)_'; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- substring(tablename from _CDB_OverviewTableDiscriminator()) @@ -69,7 +69,7 @@ AS $$ BEGIN RETURN _CDB_OverviewTableDiscriminator() || base_table; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- tablename SIMILAR TO _CDB_OverviewTablePattern(base_table) -- Name of an overview table, given the base table name and the Z level @@ -80,7 +80,7 @@ AS $$ BEGIN RETURN '_vovw_' || z::text || '_' || base_table; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- Condition to check if a tabla is an overview table of some base table -- Scope: private. @@ -90,7 +90,7 @@ AS $$ BEGIN RETURN otable SIMILAR TO _CDB_OverviewTablePattern(base_table); END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- Extract the Z level from an overview table name -- Scope: private. @@ -100,7 +100,7 @@ AS $$ BEGIN RETURN substring(otable from _CDB_OverviewTableDiscriminator())::integer; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- Name of the base table corresponding to an overview table -- Scope: private. @@ -114,7 +114,7 @@ AS $$ RETURN regexp_replace(overview_table, _CDB_OverviewTableDiscriminator(), ''); END IF; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _CDB_OverviewBaseTable(overview_table REGCLASS) RETURNS REGCLASS @@ -134,7 +134,7 @@ AS $$ END IF; RETURN base_table; END; -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- Schema and relation names of a table given its reloid -- Scope: private. @@ -150,7 +150,7 @@ AS $$ FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.oid = reloid; END -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; -- Schema and relation names of a table given its reloid -- Scope: private. @@ -170,4 +170,4 @@ AS $$ WHERE c.oid = reloid; RETURN schema_name; END -$$ LANGUAGE PLPGSQL IMMUTABLE; +$$ LANGUAGE PLPGSQL IMMUTABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_QuantileBins.sql b/scripts-available/CDB_QuantileBins.sql index 23e5dcc..20fa440 100644 --- a/scripts-available/CDB_QuantileBins.sql +++ b/scripts-available/CDB_QuantileBins.sql @@ -40,4 +40,4 @@ BEGIN END LOOP; RETURN reply; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE STRICT PARALLEL SAFE; diff --git a/scripts-available/CDB_QueryStatements.sql b/scripts-available/CDB_QueryStatements.sql index bb4d10c..39c69e4 100644 --- a/scripts-available/CDB_QueryStatements.sql +++ b/scripts-available/CDB_QueryStatements.sql @@ -11,4 +11,4 @@ RETURNS SETOF TEXT AS $$ cleaned = match[0].strip() if ( cleaned ): yield cleaned -$$ language 'plpythonu' IMMUTABLE STRICT; +$$ language 'plpythonu' IMMUTABLE STRICT PARALLEL SAFE; diff --git a/scripts-available/CDB_QueryTables.sql b/scripts-available/CDB_QueryTables.sql index c7cfa64..6ea2de7 100644 --- a/scripts-available/CDB_QueryTables.sql +++ b/scripts-available/CDB_QueryTables.sql @@ -64,7 +64,7 @@ BEGIN return tables; END -$$ LANGUAGE 'plpgsql' VOLATILE STRICT; +$$ LANGUAGE 'plpgsql' VOLATILE STRICT PARALLEL UNSAFE; -- Keep CDB_QueryTables with same signature for backwards compatibility. @@ -75,4 +75,4 @@ AS $$ BEGIN RETURN CDB_QueryTablesText(query)::name[]; END -$$ LANGUAGE 'plpgsql' VOLATILE STRICT; +$$ LANGUAGE 'plpgsql' VOLATILE STRICT PARALLEL UNSAFE; diff --git a/scripts-available/CDB_Quota.sql b/scripts-available/CDB_Quota.sql index 2268a64..f12f148 100644 --- a/scripts-available/CDB_Quota.sql +++ b/scripts-available/CDB_Quota.sql @@ -12,7 +12,7 @@ BEGIN RETURN relation_size; END; $$ -LANGUAGE 'plpgsql' VOLATILE; +LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; -- Return the estimated size of user data. Used for quota checking. CREATE OR REPLACE FUNCTION CDB_UserDataSize(schema_name TEXT) @@ -55,7 +55,7 @@ BEGIN END IF; END; $$ -LANGUAGE 'plpgsql' VOLATILE; +LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; -- Return the estimated size of user data. Used for quota checking. @@ -65,7 +65,7 @@ RETURNS bigint AS $$ SELECT CDB_UserDataSize('public'); $$ -LANGUAGE 'sql' VOLATILE; +LANGUAGE 'sql' VOLATILE PARALLEL UNSAFE; -- Triggers cannot have declared arguments: pbfact float8, qmax int8, schema_name text CREATE OR REPLACE FUNCTION CDB_CheckQuota() @@ -121,7 +121,7 @@ BEGIN RETURN NEW; END; $$ -LANGUAGE 'plpgsql' VOLATILE; +LANGUAGE 'plpgsql' VOLATILE PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION CDB_SetUserQuotaInBytes(schema_name text, bytes int8) @@ -142,7 +142,7 @@ BEGIN return bytes; END $$ -LANGUAGE 'plpgsql' VOLATILE STRICT; +LANGUAGE 'plpgsql' VOLATILE STRICT PARALLEL UNSAFE; CREATE OR REPLACE FUNCTION CDB_SetUserQuotaInBytes(bytes int8) @@ -152,4 +152,4 @@ BEGIN return public.CDB_SetUserQuotaInBytes('public', bytes); END; $$ -LANGUAGE 'plpgsql' VOLATILE STRICT; +LANGUAGE 'plpgsql' VOLATILE STRICT PARALLEL UNSAFE; diff --git a/scripts-available/CDB_RandomTids.sql b/scripts-available/CDB_RandomTids.sql index 73bc8c8..438a594 100644 --- a/scripts-available/CDB_RandomTids.sql +++ b/scripts-available/CDB_RandomTids.sql @@ -64,6 +64,6 @@ BEGIN RETURN tidlist; END -$$ LANGUAGE 'plpgsql' STABLE STRICT; +$$ LANGUAGE 'plpgsql' STABLE STRICT PARALLEL SAFE; -- } diff --git a/scripts-available/CDB_RectangleGrid.sql b/scripts-available/CDB_RectangleGrid.sql index 9410c99..c2bc166 100644 --- a/scripts-available/CDB_RectangleGrid.sql +++ b/scripts-available/CDB_RectangleGrid.sql @@ -6,7 +6,7 @@ -- be emitted. The returned hexagons will have the same SRID -- as this extent. -- --- @param width With of each rectangle +-- @param width Width of each rectangle -- -- @param height Height of each rectangle -- @@ -93,4 +93,4 @@ BEGIN RETURN; END -$$ LANGUAGE 'plpgsql' IMMUTABLE; +$$ LANGUAGE 'plpgsql' IMMUTABLE PARALLEL SAFE; diff --git a/scripts-available/CDB_Stats.sql b/scripts-available/CDB_Stats.sql index 22bb667..62cadb9 100644 --- a/scripts-available/CDB_Stats.sql +++ b/scripts-available/CDB_Stats.sql @@ -29,7 +29,7 @@ BEGIN RETURN k; END IF; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE STRICT PARALLEL SAFE; -- Calculate skewness CREATE OR REPLACE FUNCTION CDB_Skewness ( in_array NUMERIC[] ) RETURNS NUMERIC as $$ @@ -50,4 +50,4 @@ BEGIN RETURN sk; END IF; END; -$$ language plpgsql IMMUTABLE; +$$ language plpgsql IMMUTABLE STRICT PARALLEL SAFE; diff --git a/scripts-available/CDB_StringToDate.sql b/scripts-available/CDB_StringToDate.sql index 6e059ab..eb143a2 100644 --- a/scripts-available/CDB_StringToDate.sql +++ b/scripts-available/CDB_StringToDate.sql @@ -17,4 +17,4 @@ BEGIN RETURN output; END; $$ -LANGUAGE 'plpgsql' STABLE STRICT; +LANGUAGE 'plpgsql' IMMUTABLE STRICT PARALLEL UNSAFE; diff --git a/scripts-available/CDB_TableIndexes.sql b/scripts-available/CDB_TableIndexes.sql index c0ae98d..7d11cd9 100644 --- a/scripts-available/CDB_TableIndexes.sql +++ b/scripts-available/CDB_TableIndexes.sql @@ -20,7 +20,7 @@ AS $$ AND pg_class.relname=pg_indexes.indexname ; -$$ LANGUAGE SQL; +$$ LANGUAGE SQL STABLE PARALLEL SAFE; -- This is to migrate from pre-0.2.0 version -- See http://github.com/CartoDB/cartodb-postgresql/issues/36 diff --git a/scripts-available/CDB_TableMetadata.sql b/scripts-available/CDB_TableMetadata.sql index bca7c47..9ae50d9 100644 --- a/scripts-available/CDB_TableMetadata.sql +++ b/scripts-available/CDB_TableMetadata.sql @@ -56,7 +56,7 @@ BEGIN RETURN NULL; END; $$ -LANGUAGE plpgsql VOLATILE SECURITY DEFINER; +LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE SECURITY DEFINER; -- -- Trigger invalidating varnish whenever CDB_TableMetadata @@ -117,7 +117,7 @@ BEGIN RETURN NULL; END; $$ -LANGUAGE plpgsql VOLATILE SECURITY DEFINER; +LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE SECURITY DEFINER; DROP TRIGGER IF EXISTS table_modified ON public.CDB_TableMetadata; -- NOTE: on DELETE we would be unable to convert the table @@ -143,4 +143,4 @@ CREATE OR REPLACE FUNCTION public.CDB_TableMetadataTouch(tablename regclass) WHERE NOT EXISTS (SELECT * FROM upsert); END; $$ -LANGUAGE 'plpgsql' VOLATILE STRICT; +LANGUAGE 'plpgsql' VOLATILE STRICT PARALLEL UNSAFE; diff --git a/scripts-available/CDB_TransformToWebmercator.sql b/scripts-available/CDB_TransformToWebmercator.sql index d7ba6fe..42ccc49 100644 --- a/scripts-available/CDB_TransformToWebmercator.sql +++ b/scripts-available/CDB_TransformToWebmercator.sql @@ -53,7 +53,7 @@ BEGIN WHEN OTHERS THEN -- See http://github.com/Vizzuality/cartodb/issues/931 RAISE WARNING 'Could not clean input geometry: %', SQLERRM; - RETURN NULL; + RETURN NULL; END; latlon_input := ST_CollectionExtract(latlon_input, ST_Dimension(geom)+1); END IF; @@ -75,4 +75,4 @@ BEGIN RETURN ret; END -$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT; +$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT PARALLEL UNSAFE; diff --git a/scripts-available/CDB_UserTables.sql b/scripts-available/CDB_UserTables.sql index 777016e..85a0918 100644 --- a/scripts-available/CDB_UserTables.sql +++ b/scripts-available/CDB_UserTables.sql @@ -21,7 +21,7 @@ AND CASE WHEN perm = 'public' THEN has_table_privilege('publicuser', c.oid, 'SEL WHEN perm = 'all' THEN has_table_privilege(current_user, c.oid, 'SELECT') OR has_table_privilege('publicuser', c.oid, 'SELECT') ELSE false END; -$$ LANGUAGE 'sql'; +$$ LANGUAGE 'sql' STABLE PARALLEL SAFE; -- This is to migrate from pre-0.2.0 version -- See http://github.com/CartoDB/cartodb-postgresql/issues/36 diff --git a/scripts-available/CDB_XYZ.sql b/scripts-available/CDB_XYZ.sql index 23c292f..3fa2a99 100644 --- a/scripts-available/CDB_XYZ.sql +++ b/scripts-available/CDB_XYZ.sql @@ -1,4 +1,3 @@ - -- { -- Return pixel resolution at the given zoom level -- }{ @@ -7,7 +6,7 @@ RETURNS FLOAT8 AS $$ -- circumference divided by 256 is z0 resolution, then divide by 2^z SELECT 6378137.0*2.0*pi() / 256.0 / power(2.0, z); -$$ LANGUAGE SQL IMMUTABLE STRICT; +$$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE STRICT; -- } -- { @@ -58,7 +57,6 @@ BEGIN --RAISE DEBUG 'ymax: %', ymax; RETURN ST_MakeEnvelope(xmin, ymin, xmax, ymax, 3857); - END -$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT; +$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT PARALLEL SAFE; -- } diff --git a/scripts-available/CDB_ZoomFromScale.sql b/scripts-available/CDB_ZoomFromScale.sql index 6ef00d1..2c85e95 100644 --- a/scripts-available/CDB_ZoomFromScale.sql +++ b/scripts-available/CDB_ZoomFromScale.sql @@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION _CDB_MaxSupportedZoom() RETURNS int LANGUAGE SQL -IMMUTABLE +IMMUTABLE PARALLEL SAFE AS $$ -- The maximum zoom level has to be limited for various reasons, -- e.g. zoom levels greater than 31 would require tile coordinates @@ -15,7 +15,7 @@ $$; CREATE OR REPLACE FUNCTION cartodb.CDB_ZoomFromScale(scaleDenominator numeric) RETURNS int LANGUAGE SQL -IMMUTABLE +IMMUTABLE PARALLEL SAFE AS $$ SELECT CASE