diff --git a/.gitignore b/.gitignore index 430ddb5..aa0f4dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ cartodb--*.sql results/ -expected/ regression.* diff --git a/Makefile b/Makefile index 6688c6e..63e5569 100644 --- a/Makefile +++ b/Makefile @@ -3,13 +3,21 @@ EXTENSION = cartodb EXTVERSION = 0.1 +CDBSCRIPTS = \ + scripts-available/CDB_TableMetadata.sql \ + scripts-available/CDB_Quota.sql \ + scripts-available/CDB_TransformToWebmercator.sql \ + scripts-available/CDB_CartodbfyTable.sql \ + $(END) + DATA_built = $(EXTENSION)--$(EXTVERSION).sql -#DOCS = README.md -#REGRESS = hook_on_table_create +DOCS = README.md +REGRESS = test_ddl_triggers PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) -$(EXTENSION)--$(EXTVERSION).sql: cartodb_hooks.sql - cat $< | grep -v '^\(BEGIN\|END\);$$' > $@ +$(EXTENSION)--$(EXTVERSION).sql: $(CDBSCRIPTS) cartodb_hooks.sql Makefile + cat $(CDBSCRIPTS) | sed 's/\ $@ + cat cartodb_hooks.sql >> $@ diff --git a/cartodb.control b/cartodb.control index dfed88a..4c9f6af 100644 --- a/cartodb.control +++ b/cartodb.control @@ -4,3 +4,4 @@ superuser = true relocatable = false schema = cartodb requires = schema_triggers +requires = postgis diff --git a/cartodb_hooks.sql b/cartodb_hooks.sql index e871e17..d70ef3b 100644 --- a/cartodb_hooks.sql +++ b/cartodb_hooks.sql @@ -3,8 +3,6 @@ --GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_triggers TO public; -BEGIN; - -- Table creation -- { CREATE OR REPLACE FUNCTION cartodb.cdb_handle_create_table () @@ -27,10 +25,10 @@ BEGIN END IF; -- CDB_CartodbfyTable must not create tables, or infinite loop will happen - PERFORM public.CDB_CartodbfyTable(event_info.relation); + PERFORM cartodb.CDB_CartodbfyTable(event_info.relation); -- Add entry to CDB_TableMetadata (should CartodbfyTable do this?) - INSERT INTO public.CDB_TableMetadata(tabname,updated_at) + INSERT INTO cartodb.CDB_TableMetadata(tabname,updated_at) VALUES (event_info.relation, now()); END; $$; @@ -58,7 +56,7 @@ BEGIN END IF; -- delete record from CDB_TableMetadata (should invalidate varnish) - DELETE FROM public.CDB_TableMetadata WHERE tabname = event_info.old_relation_oid; + DELETE FROM cartodb.CDB_TableMetadata WHERE tabname = event_info.old_relation_oid; END; $$; -- } @@ -89,7 +87,7 @@ BEGIN PERFORM cartodb.cdb_disable_ddl_hooks(); - PERFORM public.CDB_CartodbfyTable(event_info.relation); + PERFORM cartodb.CDB_CartodbfyTable(event_info.relation); PERFORM cartodb.cdb_enable_ddl_hooks(); @@ -124,7 +122,7 @@ BEGIN PERFORM cartodb.cdb_disable_ddl_hooks(); - PERFORM public.CDB_CartodbfyTable(event_info.relation); + PERFORM cartodb.CDB_CartodbfyTable(event_info.relation); PERFORM cartodb.cdb_enable_ddl_hooks(); @@ -186,5 +184,23 @@ $$ LANGUAGE sql; SELECT cartodb.cdb_enable_ddl_hooks(); -END; +---- Make sure 'cartodb' is in database search path ? +--DO +--$$ +--DECLARE +-- var_result text; +-- var_cur_search_path text; +--BEGIN +-- SELECT reset_val INTO var_cur_search_path +-- FROM pg_settings WHERE name = 'search_path'; +-- +-- IF var_cur_search_path LIKE '%cartodb%' THEN +-- RAISE DEBUG '"cartodb" already in database search_path'; +-- ELSE +-- EXECUTE 'ALTER DATABASE ' || quote_ident(current_database()) || +-- ' SET search_path = ' || var_cur_search_path || ', "cartodb"'; +-- RAISE DEBUG '"cartodb" has been added to end of database search_path'; +-- END IF; +--END +--$$ LANGUAGE 'plpgsql'; diff --git a/expected/test_ddl_triggers.out b/expected/test_ddl_triggers.out new file mode 100644 index 0000000..b34e709 --- /dev/null +++ b/expected/test_ddl_triggers.out @@ -0,0 +1,59 @@ +--\i cartodb_hooks.sql +--\set VERBOSITY terse +CREATE TABLE IF NOT EXISTS + public.CDB_TableMetadata ( + tabname regclass not null primary key, + updated_at timestamp with time zone not null default now() + ); +CREATE USER cartodb_postgresql_unpriv_user; +SET SESSION AUTHORIZATION 'cartodb_postgresql_unpriv_user'; +--SELECT session_user, current_user; +create schema c; +ERROR: permission denied for database contrib_regression +--create table c.t3(a int); +select 1 as i INTO c.t3; +ERROR: schema "c" does not exist +select * from c.t3; +ERROR: relation "c.t3" does not exist +LINE 1: select * from c.t3; + ^ +select tabname::text, updated_at from CDB_TableMetadata; +ERROR: permission denied for relation cdb_tablemetadata +alter table c.t3 rename column the_geom_webmercator to webmerc; +ERROR: schema "c" does not exist +select * from c.t3; +ERROR: relation "c.t3" does not exist +LINE 1: select * from c.t3; + ^ +select tabname::text, updated_at from CDB_TableMetadata; +ERROR: permission denied for relation cdb_tablemetadata +alter table c.t3 rename column the_geom_webmercator to webmerc2; +ERROR: schema "c" does not exist +select * from c.t3; +ERROR: relation "c.t3" does not exist +LINE 1: select * from c.t3; + ^ +select tabname::text, updated_at from CDB_TableMetadata; +ERROR: permission denied for relation cdb_tablemetadata +alter table c.t3 drop column the_geom_webmercator; +ERROR: schema "c" does not exist +select * from c.t3; +ERROR: relation "c.t3" does not exist +LINE 1: select * from c.t3; + ^ +select tabname::text, updated_at from CDB_TableMetadata; +ERROR: permission denied for relation cdb_tablemetadata +alter table c.t3 add column id2 int; +ERROR: schema "c" does not exist +select * from c.t3; +ERROR: relation "c.t3" does not exist +LINE 1: select * from c.t3; + ^ +select tabname::text, updated_at from CDB_TableMetadata; +ERROR: permission denied for relation cdb_tablemetadata +drop schema c cascade; +ERROR: schema "c" does not exist +select tabname::text, updated_at from CDB_TableMetadata; +ERROR: permission denied for relation cdb_tablemetadata +DROP USER cartodb_postgresql_unpriv_user; +ERROR: permission denied to drop role diff --git a/sql/hook_on_table_create.sql b/sql/hook_on_table_create.sql deleted file mode 100644 index 0973904..0000000 --- a/sql/hook_on_table_create.sql +++ /dev/null @@ -1,25 +0,0 @@ ---\i cartodb_hooks.sql ---\set VERBOSITY terse -SET SESSION AUTHORIZATION 'development_cartodb_user_1'; ---SELECT session_user, current_user; - - -create schema c; ---create table c.t3(a int); -select 1 as i INTO c.t3; -select * from c.t3; -select tabname::text, updated_at from CDB_TableMetadata; -alter table c.t3 rename column the_geom_webmercator to webmerc; -select * from c.t3; -select tabname::text, updated_at from CDB_TableMetadata; -alter table c.t3 rename column the_geom_webmercator to webmerc2; -select * from c.t3; -select tabname::text, updated_at from CDB_TableMetadata; -alter table c.t3 drop column the_geom_webmercator; -select * from c.t3; -select tabname::text, updated_at from CDB_TableMetadata; -alter table c.t3 add column id2 int; -select * from c.t3; -select tabname::text, updated_at from CDB_TableMetadata; -drop schema c cascade; -select tabname::text, updated_at from CDB_TableMetadata; diff --git a/sql/test_ddl_triggers.sql b/sql/test_ddl_triggers.sql new file mode 100644 index 0000000..c146a39 --- /dev/null +++ b/sql/test_ddl_triggers.sql @@ -0,0 +1,61 @@ +CREATE EXTENSION postgis; +CREATE EXTENSION schema_triggers; +CREATE EXTENSION cartodb; + +set search_path to public,cartodb,schema_triggers; + +--set client_min_messages to debug; + +-- Create a stub cdb_invalidate_varnish function if not available +--CREATE FUNCTION tmp() returns void AS $$ +DO $$ +BEGIN + PERFORM cdb_invalidate_varnish(0); +EXCEPTION + WHEN undefined_function THEN + CREATE OR REPLACE FUNCTION cartodb.cdb_invalidate_varnish(tabname regclass) + RETURNS void AS '' LANGUAGE 'sql'; +END; +$$ LANGUAGE 'plpgsql'; + +--SELECT tmp(); + + +create schema c; + +CREATE TABLE IF NOT EXISTS + public.CDB_TableMetadata ( + tabname regclass not null primary key, + updated_at timestamp with time zone not null default now() + ); + +CREATE USER cartodb_postgresql_unpriv_user; +GRANT ALL ON SCHEMA c to cartodb_postgresql_unpriv_user; +GRANT SELECT ON public.CDB_TableMetadata to cartodb_postgresql_unpriv_user; +SET SESSION AUTHORIZATION 'cartodb_postgresql_unpriv_user'; +--SELECT session_user, current_user; + + +--create table c.t3(a int); +select 1 as i INTO c.t3; +select * from c.t3; +select tabname::text, updated_at from CDB_TableMetadata; +alter table c.t3 rename column the_geom_webmercator to webmerc; +select * from c.t3; +select tabname::text, updated_at from CDB_TableMetadata; +alter table c.t3 rename column the_geom_webmercator to webmerc2; +select * from c.t3; +select tabname::text, updated_at from CDB_TableMetadata; +alter table c.t3 drop column the_geom_webmercator; +select * from c.t3; +select tabname::text, updated_at from CDB_TableMetadata; +alter table c.t3 add column id2 int; +select * from c.t3; +select tabname::text, updated_at from CDB_TableMetadata; + +RESET SESSION AUTHORIZATION; +drop schema c cascade; +select tabname::text, updated_at from CDB_TableMetadata; + +DROP TABLE public.CDB_TableMetadata; +DROP USER cartodb_postgresql_unpriv_user;