Replace use of CDB_UserTables in CDB_Overviews
Use a function that returns reclasses and schema names properly instead.
This commit is contained in:
parent
84cac16d1c
commit
34c39662ec
@ -1,4 +1,30 @@
|
|||||||
-- security definer
|
-- Information about tables in a schema.
|
||||||
|
-- If the schema name parameter is NULL, then tables from all schemas
|
||||||
|
-- that may contain user tables are returned.
|
||||||
|
-- The optional second argument restricts the result to tables
|
||||||
|
-- of the specified access type.
|
||||||
|
-- Currently accepted permissions are: 'public', 'private' or 'all'.
|
||||||
|
-- For each table, the regclass, schema name and table name are returned.
|
||||||
|
-- Scope: private.
|
||||||
|
CREATE OR REPLACE FUNCTION _CDB_UserTablesInSchema(schema_name text DEFAULT NULL, perm text DEFAULT 'all')
|
||||||
|
RETURNS TABLE(table_regclass REGCLASS, schema_name TEXT, table_name TEXT)
|
||||||
|
AS $$
|
||||||
|
SELECT
|
||||||
|
c.oid::regclass AS table_regclass,
|
||||||
|
n.nspname::text AS schema_name,
|
||||||
|
c.relname::text AS table_relname
|
||||||
|
FROM pg_class c
|
||||||
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
||||||
|
WHERE c.relkind = 'r'
|
||||||
|
AND c.relname NOT IN ('cdb_tablemetadata', 'spatial_ref_sys')
|
||||||
|
AND CASE WHEN schema_name IS NULL
|
||||||
|
THEN n.nspname NOT IN ('pg_catalog', 'information_schema', 'topology', 'cartodb')
|
||||||
|
ELSE n.nspname = schema_name END
|
||||||
|
AND CASE WHEN perm = 'public' THEN has_table_privilege('publicuser', c.oid, 'SELECT')
|
||||||
|
WHEN perm = 'private' THEN has_table_privilege(current_user, c.oid, 'SELECT') AND NOT has_table_privilege('publicuser', c.oid, 'SELECT')
|
||||||
|
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';
|
||||||
|
|
||||||
-- Pattern that can be used to detect overview tables and Extract
|
-- Pattern that can be used to detect overview tables and Extract
|
||||||
-- the intended zoom level from the table name.
|
-- the intended zoom level from the table name.
|
||||||
@ -140,19 +166,15 @@ RETURNS TABLE(base_table REGCLASS, z integer, overview_table REGCLASS)
|
|||||||
AS $$
|
AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
schema_name TEXT;
|
schema_name TEXT;
|
||||||
table_name TEXT;
|
_table_name TEXT;
|
||||||
BEGIN
|
BEGIN
|
||||||
SELECT * FROM _cdb_split_table_name(reloid) INTO schema_name, table_name;
|
SELECT * FROM _cdb_split_table_name(reloid) INTO schema_name, _table_name;
|
||||||
-- TODO: replace use of CDB_UserTables by obtaining the user tables
|
RETURN QUERY SELECT
|
||||||
-- in a specific schema
|
|
||||||
-- Meanwhile we'll use DISTINCT here to avoid picking multiple tables
|
|
||||||
-- from different schemas
|
|
||||||
RETURN QUERY SELECT DISTINCT
|
|
||||||
reloid AS base_table,
|
reloid AS base_table,
|
||||||
_CDB_OverviewTableZ(cdb_usertables) AS z,
|
_CDB_OverviewTableZ(table_name) AS z,
|
||||||
('"' || schema_name|| '"."' ||cdb_usertables || '"')::regclass AS overview_table
|
table_regclass AS overview_table
|
||||||
FROM CDB_UserTables()
|
FROM _CDB_UserTablesInSchema(schema_name)
|
||||||
WHERE _CDB_IsOverviewTableOf((SELECT relname FROM pg_class WHERE oid=reloid), cdb_usertables)
|
WHERE _CDB_IsOverviewTableOf((SELECT relname FROM pg_class WHERE oid=reloid), table_name)
|
||||||
ORDER BY z;
|
ORDER BY z;
|
||||||
END
|
END
|
||||||
$$ LANGUAGE PLPGSQL;
|
$$ LANGUAGE PLPGSQL;
|
||||||
@ -171,11 +193,13 @@ RETURNS TABLE(base_table REGCLASS, z integer, overview_table REGCLASS)
|
|||||||
AS $$
|
AS $$
|
||||||
SELECT
|
SELECT
|
||||||
base_table::regclass AS base_table,
|
base_table::regclass AS base_table,
|
||||||
_CDB_OverviewTableZ(cdb_usertables) AS z,
|
_CDB_OverviewTableZ(table_name) AS z,
|
||||||
('"' || _cdb_schema_name(base_table::regclass) || '"."' || cdb_usertables || '"')::regclass AS overview_table
|
table_regclass AS overview_table
|
||||||
FROM
|
FROM
|
||||||
CDB_UserTables(), unnest(tables) base_table
|
_CDB_UserTablesInSchema(), unnest(tables) base_table
|
||||||
WHERE _CDB_IsOverviewTableOf((SELECT relname FROM pg_class WHERE oid=base_table), cdb_usertables)
|
WHERE
|
||||||
|
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;
|
ORDER BY base_table, z;
|
||||||
$$ LANGUAGE SQL;
|
$$ LANGUAGE SQL;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user