diff --git a/expected/test_ddl_triggers.out b/expected/test_ddl_triggers.out index 9dcf092..c8786c9 100644 --- a/expected/test_ddl_triggers.out +++ b/expected/test_ddl_triggers.out @@ -25,6 +25,8 @@ SELECT CDB_SetUserQuotaInBytes('c', 0); 0 (1 row) +DROP USER IF EXISTS cartodb_postgresql_unpriv_user; +NOTICE: role "cartodb_postgresql_unpriv_user" does not exist, skipping CREATE USER cartodb_postgresql_unpriv_user; GRANT ALL ON SCHEMA c to cartodb_postgresql_unpriv_user; SET SESSION AUTHORIZATION 'cartodb_postgresql_unpriv_user'; @@ -62,9 +64,6 @@ NOTICE: trigger "track_updates" for table "c.t4" does not exist, skipping NOTICE: trigger "update_the_geom_webmercator_trigger" for table "c.t4" does not exist, skipping NOTICE: trigger "test_quota" for table "c.t4" does not exist, skipping NOTICE: trigger "test_quota_per_row" for table "c.t4" does not exist, skipping -NOTICE: Column cartodb_id already exists -NOTICE: Existing cartodb_id field does not have an associated sequence, renaming -NOTICE: Trying to recover data from _cartodb_id0 column NOTICE: event trigger "cdb_on_relation_create" does not exist, skipping NOTICE: event trigger "cdb_on_relation_drop" does not exist, skipping NOTICE: event trigger "cdb_on_alter_column" does not exist, skipping @@ -92,8 +91,6 @@ select pg_sleep(.1); (1 row) alter table c.t3 rename column the_geom_webmercator to webmerc; -NOTICE: Column cartodb_id already exists -NOTICE: Column the_geom already exists NOTICE: event trigger "cdb_on_relation_create" does not exist, skipping NOTICE: event trigger "cdb_on_relation_drop" does not exist, skipping NOTICE: event trigger "cdb_on_alter_column" does not exist, skipping @@ -118,8 +115,6 @@ select pg_sleep(.1); (1 row) alter table c.t3 rename column the_geom_webmercator to webmerc2; -NOTICE: Column cartodb_id already exists -NOTICE: Column the_geom already exists NOTICE: event trigger "cdb_on_relation_create" does not exist, skipping NOTICE: event trigger "cdb_on_relation_drop" does not exist, skipping NOTICE: event trigger "cdb_on_alter_column" does not exist, skipping @@ -147,8 +142,6 @@ select pg_sleep(.1); (1 row) alter table c.t3 drop column the_geom_webmercator; -NOTICE: Column cartodb_id already exists -NOTICE: Column the_geom already exists NOTICE: event trigger "cdb_on_relation_create" does not exist, skipping NOTICE: event trigger "cdb_on_relation_drop" does not exist, skipping NOTICE: event trigger "cdb_on_alter_column" does not exist, skipping @@ -199,5 +192,6 @@ select count(*) from CDB_TableMetadata; 0 (1 row) -DROP USER cartodb_postgresql_unpriv_user; +DROP OWNED BY cartodb_postgresql_unpriv_user; +DROP ROLE cartodb_postgresql_unpriv_user; DROP FUNCTION _CDB_UserQuotaInBytes(); diff --git a/scripts-available/CDB_CartodbfyTable.sql b/scripts-available/CDB_CartodbfyTable.sql index f7c7d1a..afff37b 100644 --- a/scripts-available/CDB_CartodbfyTable.sql +++ b/scripts-available/CDB_CartodbfyTable.sql @@ -27,8 +27,7 @@ BEGIN END; $$ LANGUAGE PLPGSQL; - --- 2) Drop cartodb triggers (might prevent changing columns) +-- Drop cartodb triggers (might prevent changing columns) CREATE OR REPLACE FUNCTION _CDB_drop_triggers(reloid REGCLASS) RETURNS void AS $$ @@ -52,7 +51,7 @@ END; $$ LANGUAGE PLPGSQL; --- 3) Cartodb_id creation & validation or renaming if invalid +-- Cartodb_id creation & validation or renaming if invalid CREATE OR REPLACE FUNCTION _CDB_create_cartodb_id_column(reloid REGCLASS) RETURNS void AS $$ @@ -201,156 +200,7 @@ END; $$ LANGUAGE PLPGSQL; - --- 5) the_geom and the_geom_webmercator creation & validation or renaming if invalid -CREATE OR REPLACE FUNCTION _CDB_create_the_geom_columns(reloid REGCLASS) - RETURNS BOOLEAN[] -AS $$ -DECLARE - sql TEXT; - rec RECORD; - rec2 RECORD; - had_column BOOLEAN; - i INTEGER; - new_name TEXT; - exists_geom_cols BOOLEAN[]; -BEGIN - -- We need the_geom and the_geom_webmercator - FOR rec IN SELECT * FROM ( VALUES ('the_geom',4326), ('the_geom_webmercator',3857) ) t(cname,csrid) LOOP --{ - << column_setup >> LOOP --{ - BEGIN - sql := 'ALTER TABLE ' || reloid::text || ' ADD ' || rec.cname - || ' GEOMETRY(geometry,' || rec.csrid || ')'; - RAISE DEBUG 'Running %', sql; - EXECUTE sql; - sql := 'CREATE INDEX ON ' || reloid::text || ' USING GIST ( ' || rec.cname || ')'; - RAISE DEBUG 'Running %', sql; - EXECUTE sql; - exists_geom_cols := array_append(exists_geom_cols, false); - EXIT column_setup; - EXCEPTION - WHEN duplicate_column THEN - exists_geom_cols := array_append(exists_geom_cols, true); - RAISE NOTICE 'Column % already exists', rec.cname; - WHEN others THEN - RAISE EXCEPTION 'Cartodbfying % (%): % (%)', reloid, rec.cname, SQLERRM, SQLSTATE; - END; - - << column_fixup >> - LOOP --{ - -- Check data type is a GEOMETRY - SELECT t.typname, t.oid, a.attnotnull, - postgis_typmod_srid(a.atttypmod) as srid, - postgis_typmod_type(a.atttypmod) as gtype - FROM pg_type t, pg_attribute a - WHERE a.atttypid = t.oid AND a.attrelid = reloid AND NOT a.attisdropped AND a.attname = rec.cname - INTO STRICT rec2; - - IF rec2.typname NOT IN ('geometry') THEN -- { - RAISE NOTICE 'Existing % field is of invalid type % (need geometry), renaming', rec.cname, rec2.typname; - EXIT column_fixup; -- cannot fix - END IF; -- } - - IF rec2.srid != rec.csrid THEN -- { - BEGIN - sql := 'ALTER TABLE ' || reloid::text || ' ALTER ' || rec.cname - || ' TYPE geometry(' || rec2.gtype || ',' || rec.csrid || ') USING ST_Transform(' - || rec.cname || ',' || rec.csrid || ')'; - RAISE DEBUG 'Running %', sql; - EXECUTE sql; - EXCEPTION - WHEN others THEN - RAISE NOTICE 'Could not enforce SRID % to column %: %, renaming', rec.csrid, rec.cname, SQLERRM; - EXIT column_fixup; -- cannot fix, will rename - END; - END IF; -- } - - -- add gist indices if not there already - IF NOT EXISTS ( SELECT ir.relname - FROM pg_am am, pg_class ir, - pg_class c, pg_index i, - pg_attribute a - WHERE c.oid = reloid AND i.indrelid = c.oid - AND a.attname = rec.cname - AND i.indexrelid = ir.oid AND i.indnatts = 1 - AND i.indkey[0] = a.attnum AND a.attrelid = c.oid - AND NOT a.attisdropped AND am.oid = ir.relam - AND am.amname = 'gist' ) - THEN -- { - BEGIN - sql := 'CREATE INDEX ON ' || reloid::text || ' USING GIST ( ' || rec.cname || ')'; - RAISE DEBUG 'Running %', sql; - EXECUTE sql; - EXCEPTION - WHEN others THEN - RAISE EXCEPTION 'Cartodbfying % (% index): % (%)', reloid, rec.cname, SQLERRM, SQLSTATE; - END; - END IF; -- } - - -- if we reached this line, all went good - EXIT column_setup; - END LOOP; -- } column_fixup - - -- invalid column, need rename and re-create it - i := 0; - << rename_column >> - LOOP --{ - new_name := '_' || rec.cname || i; - BEGIN - sql := 'ALTER TABLE ' || reloid::text || ' RENAME COLUMN ' || rec.cname || ' TO ' || new_name; - RAISE DEBUG 'Running %', sql; - EXECUTE sql; - EXCEPTION - WHEN duplicate_column THEN - i := i+1; - CONTINUE rename_column; - WHEN others THEN - RAISE EXCEPTION 'Cartodbfying % (rename %): % (%)', reloid, rec.cname, SQLERRM, SQLSTATE; - END; - EXIT rename_column; - END LOOP; --} - CONTINUE column_setup; - END LOOP; -- } column_setup - END LOOP; -- } on expected geometry columns - - RETURN exists_geom_cols; -END; -$$ LANGUAGE PLPGSQL; - - --- 6) Initialize the_geom with values from the_geom_webmercator --- do this only if the_geom_webmercator was found (not created) and the_geom was NOT found. -CREATE OR REPLACE FUNCTION _CDB_populate_the_geom_from_the_geom_webmercator(reloid REGCLASS, geom_columns_exist BOOLEAN[]) - RETURNS void -AS $$ -DECLARE - sql TEXT; -BEGIN - IF geom_columns_exist[2] AND NOT geom_columns_exist[1] THEN - sql := 'UPDATE ' || reloid::text || ' SET the_geom = ST_Transform(the_geom_webmercator, 4326) '; - EXECUTE sql; - END IF; -END; -$$ LANGUAGE PLPGSQL; - - --- 7) Initialize the_geom_webmercator with values from the_geom --- do this only if the_geom was found (not created) and the_geom_webmercator was NOT found. -CREATE OR REPLACE FUNCTION _CDB_populate_the_geom_webmercator_from_the_geom(reloid REGCLASS, geom_columns_exist BOOLEAN[]) - RETURNS void -AS $$ -DECLARE - sql TEXT; -BEGIN - IF geom_columns_exist[1] AND NOT geom_columns_exist[2] THEN - sql := 'UPDATE ' || reloid::text || ' SET the_geom_webmercator = public.CDB_TransformToWebmercator(the_geom) '; - EXECUTE sql; - END IF; -END; -$$ LANGUAGE PLPGSQL; - - --- 8.a) Create all triggers +-- Create all triggers -- NOTE: drop/create has the side-effect of re-enabling disabled triggers CREATE OR REPLACE FUNCTION _CDB_create_triggers(schema_name TEXT, reloid REGCLASS) RETURNS void @@ -471,43 +321,12 @@ $$ LANGUAGE PLPGSQL; -- //////////////////////////////////////////////////// -- Ensure a table is a "cartodb" table (See https://github.com/CartoDB/cartodb/wiki/CartoDB-user-table) --- Rails code replicates this call at User.cartodbfy() -CREATE OR REPLACE FUNCTION CDB_CartodbfyTable(schema_name TEXT, reloid REGCLASS) -RETURNS void -AS $$ -DECLARE - exists_geom_cols BOOLEAN[]; - is_raster BOOLEAN; -BEGIN - - PERFORM cartodb._CDB_check_prerequisites(schema_name, reloid); - - PERFORM cartodb._CDB_drop_triggers(reloid); - - -- Ensure required fields exist - PERFORM cartodb._CDB_create_cartodb_id_column(reloid); - - SELECT cartodb._CDB_is_raster_table(schema_name, reloid) INTO is_raster; - IF is_raster THEN - PERFORM cartodb._CDB_create_raster_triggers(schema_name, reloid); - ELSE - SELECT cartodb._CDB_create_the_geom_columns(reloid) INTO exists_geom_cols; - - -- Both only populate if proceeds - PERFORM cartodb._CDB_populate_the_geom_from_the_geom_webmercator(reloid, exists_geom_cols); - PERFORM cartodb._CDB_populate_the_geom_webmercator_from_the_geom(reloid, exists_geom_cols); - - PERFORM cartodb._CDB_create_triggers(schema_name, reloid); - END IF; - -END; -$$ LANGUAGE PLPGSQL; CREATE OR REPLACE FUNCTION CDB_CartodbfyTable(reloid REGCLASS) -RETURNS void +RETURNS REGCLASS AS $$ BEGIN - PERFORM cartodb.CDB_CartodbfyTable('public', reloid); + RETURN cartodb.CDB_CartodbfyTable('public', reloid); END; $$ LANGUAGE PLPGSQL; @@ -518,12 +337,19 @@ $$ LANGUAGE PLPGSQL; -- -- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -- --- CDB_CartodbfyTable2(reloid REGCLASS, destschema TEXT DEFAULT NULL) +-- CDB_CartodbfyTable(destschema TEXT, reloid REGCLASS) -- -- Main function, calls the following functions, with a little -- logic before the table re-write to avoid re-writing if the table -- already has all the necessary columns in place. -- +-- It returns the destoid of the table. If no rewritting is needed +-- the return value will be equal to reloid. +-- +-- +-- (0) _CDB_check_prerequisites +-- As before, this checks the prerequisites before trying to cartodbfy +-- -- (1) _CDB_drop_triggers -- As before, this drops all the metadata and geom sync triggers -- @@ -1174,6 +1000,15 @@ BEGIN sql := Format('DROP TABLE %s', reloid::text); PERFORM _CDB_SQL(sql, '_CDB_Rewrite_Table'); + -- If the table is being created by a SECURITY DEFINER function + -- make sure the user is set back to the user who is connected + IF current_user != session_user THEN + sql := Format('ALTER TABLE IF EXISTS %s OWNER TO %s', copyname, session_user); + PERFORM _CDB_SQL(sql, '_CDB_Rewrite_Table'); + sql := Format('ALTER SEQUENCE IF EXISTS %s OWNER TO %s', destseq, session_user); + PERFORM _CDB_SQL(sql, '_CDB_Rewrite_Table'); + END IF; + -- If we used a temporary destination table -- we can now rename it into place IF destschema = relschema THEN @@ -1289,8 +1124,8 @@ END; $$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE FUNCTION CDB_CartodbfyTable2(reloid REGCLASS, destschema TEXT DEFAULT NULL) -RETURNS void +CREATE OR REPLACE FUNCTION CDB_CartodbfyTable(destschema TEXT, reloid REGCLASS) +RETURNS REGCLASS AS $$ DECLARE @@ -1311,6 +1146,8 @@ BEGIN FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.oid = reloid; + PERFORM cartodb._CDB_check_prerequisites(destschema, reloid); + -- Check destination schema exists -- Throws an exception of there is no matching schema IF destschema IS NOT NULL THEN @@ -1351,6 +1188,7 @@ BEGIN PERFORM _CDB_create_triggers(destschema, destoid); END IF; - + + RETURN (destschema || '.' || destname)::regclass; END; $$ LANGUAGE 'plpgsql'; diff --git a/scripts-available/CDB_DDLTriggers.sql b/scripts-available/CDB_DDLTriggers.sql index 81db820..dddd60e 100644 --- a/scripts-available/CDB_DDLTriggers.sql +++ b/scripts-available/CDB_DDLTriggers.sql @@ -4,17 +4,23 @@ CREATE OR REPLACE FUNCTION cartodb.cdb_handle_create_table () RETURNS event_trigger SECURITY DEFINER LANGUAGE plpgsql AS $$ DECLARE event_info RECORD; - rel_namespace TEXT; + rel RECORD; + newtable REGCLASS; BEGIN event_info := schema_triggers.get_relation_create_eventinfo(); -- We're only interested in real relations IF (event_info.new).relkind != 'r' THEN RETURN; END IF; - SELECT nspname FROM pg_namespace WHERE oid=(event_info.new).relnamespace INTO rel_namespace; + SELECT c.relname, c.relnamespace, c.relkind, n.nspname + FROM pg_class c + JOIN pg_namespace n + ON c.relnamespace = n.oid + WHERE c.oid = event_info.relation + INTO rel; RAISE DEBUG 'Relation % of kind % created in table % namespace % (oid %)', - event_info.relation, (event_info.new).relkind, (event_info.new).relname::TEXT, rel_namespace, (event_info.new).relnamespace; + event_info.relation, rel.relkind, rel.relname, rel.nspname, rel.relnamespace; -- We don't want to react to alters triggered by superuser, IF current_setting('is_superuser') = 'on' THEN @@ -25,15 +31,15 @@ BEGIN PERFORM cartodb.cdb_disable_ddl_hooks(); -- CDB_CartodbfyTable must not create tables, or infinite loop will happen - PERFORM cartodb.CDB_CartodbfyTable(rel_namespace, event_info.relation); + newtable := cartodb.CDB_CartodbfyTable(rel.nspname, event_info.relation); PERFORM cartodb.cdb_enable_ddl_hooks(); RAISE DEBUG 'Inserting into cartodb.CDB_TableMetadata'; -- Add entry to CDB_TableMetadata (should CartodbfyTable do this?) - INSERT INTO cartodb.CDB_TableMetadata(tabname,updated_at) - VALUES (event_info.relation, now()); + INSERT INTO cartodb.CDB_TableMetadata(tabname, updated_at) + VALUES (newtable, now()); END; $$; -- } @@ -66,14 +72,19 @@ RETURNS event_trigger SECURITY DEFINER LANGUAGE plpgsql AS $$ DECLARE event_info RECORD; rel RECORD; - rel_namespace TEXT; + newtable REGCLASS; BEGIN event_info := schema_triggers.get_column_alter_eventinfo(); - SELECT oid,* FROM pg_class WHERE oid = event_info.relation INTO rel; + SELECT c.relname, c.relnamespace, c.relkind, n.nspname + FROM pg_class c + JOIN pg_namespace n + ON c.relnamespace = n.oid + WHERE c.oid = event_info.relation + INTO rel; RAISE DEBUG 'Column % altered by % (superuser? %) in relation % of kind %', - (event_info.old).attname, current_user, current_setting('is_superuser'), event_info.relation::regclass, rel.relkind; + (event_info.old).attname, current_user, current_setting('is_superuser'), rel.relname, rel.relkind; -- We're only interested in real relations IF rel.relkind != 'r' THEN RETURN; END IF; @@ -84,16 +95,14 @@ BEGIN RETURN; END IF; - SELECT nspname FROM pg_namespace WHERE oid = rel.relnamespace INTO rel_namespace; - PERFORM cartodb.cdb_disable_ddl_hooks(); - PERFORM cartodb.CDB_CartodbfyTable(rel_namespace, event_info.relation); + newtable := cartodb.CDB_CartodbfyTable(rel.nspname, event_info.relation); PERFORM cartodb.cdb_enable_ddl_hooks(); -- update CDB_TableMetadata.updated_at (should invalidate varnish) - UPDATE cartodb.CDB_TableMetadata SET updated_at = NOW() + UPDATE cartodb.CDB_TableMetadata SET updated_at = NOW(), tabname = newtable WHERE tabname = event_info.relation; END; $$; @@ -106,14 +115,19 @@ RETURNS event_trigger SECURITY DEFINER LANGUAGE plpgsql AS $$ DECLARE event_info RECORD; rel RECORD; - rel_namespace TEXT; + newtable REGCLASS; BEGIN event_info := schema_triggers.get_column_drop_eventinfo(); - SELECT oid,* FROM pg_class WHERE oid = event_info.relation INTO rel; + SELECT c.relname, c.relnamespace, c.relkind, n.nspname + FROM pg_class c + JOIN pg_namespace n + ON c.relnamespace = n.oid + WHERE c.oid = event_info.relation + INTO rel; RAISE DEBUG 'Column % drop by % (superuser? %) in relation % of kind %', - (event_info.old).attname, current_user, current_setting('is_superuser'), event_info.relation::regclass, rel.relkind; + (event_info.old).attname, current_user, current_setting('is_superuser'), rel.relname, rel.relkind; -- We're only interested in real relations IF rel.relkind != 'r' THEN RETURN; END IF; @@ -124,17 +138,16 @@ BEGIN RETURN; END IF; - SELECT nspname FROM pg_namespace WHERE oid = rel.relnamespace INTO rel_namespace; PERFORM cartodb.cdb_disable_ddl_hooks(); - PERFORM cartodb.CDB_CartodbfyTable(rel_namespace, event_info.relation); + newtable := cartodb.CDB_CartodbfyTable(rel.nspname, event_info.relation); PERFORM cartodb.cdb_enable_ddl_hooks(); -- update CDB_TableMetadata.updated_at (should invalidate varnish) - UPDATE cartodb.CDB_TableMetadata SET updated_at = NOW() - WHERE tabname = event_info.relation; + UPDATE cartodb.CDB_TableMetadata SET updated_at = NOW(), tabname = newtable + WHERE tabname = event_info.relation; END; $$; -- } @@ -149,10 +162,15 @@ DECLARE BEGIN event_info := schema_triggers.get_column_add_eventinfo(); - SELECT oid,* FROM pg_class WHERE oid = event_info.relation INTO rel; + SELECT c.relname, c.relnamespace, c.relkind, n.nspname + FROM pg_class c + JOIN pg_namespace n + ON c.relnamespace = n.oid + WHERE c.oid = event_info.relation + INTO rel; RAISE DEBUG 'Column % added by % (superuser? %) in relation % of kind %', - (event_info.new).attname, current_user, current_setting('is_superuser'), event_info.relation::regclass, rel.relkind; + (event_info.new).attname, current_user, current_setting('is_superuser'), rel.relname, rel.relkind; -- We're only interested in real relations IF rel.relkind != 'r' THEN RETURN; END IF; diff --git a/sql/test_ddl_triggers.sql b/sql/test_ddl_triggers.sql index 8d7bbaf..6ed0d41 100644 --- a/sql/test_ddl_triggers.sql +++ b/sql/test_ddl_triggers.sql @@ -10,6 +10,7 @@ create schema c; SELECT CDB_SetUserQuotaInBytes('c', 0); +DROP USER IF EXISTS cartodb_postgresql_unpriv_user; CREATE USER cartodb_postgresql_unpriv_user; GRANT ALL ON SCHEMA c to cartodb_postgresql_unpriv_user; SET SESSION AUTHORIZATION 'cartodb_postgresql_unpriv_user'; @@ -96,5 +97,6 @@ RESET SESSION AUTHORIZATION; drop schema c cascade; select count(*) from CDB_TableMetadata; -DROP USER cartodb_postgresql_unpriv_user; +DROP OWNED BY cartodb_postgresql_unpriv_user; +DROP ROLE cartodb_postgresql_unpriv_user; DROP FUNCTION _CDB_UserQuotaInBytes(); diff --git a/sql/test_setup.sql b/sql/test_setup.sql index c05769f..67fe684 100644 --- a/sql/test_setup.sql +++ b/sql/test_setup.sql @@ -7,4 +7,4 @@ RETURNS void AS $$ BEGIN RAISE NOTICE 'cdb_invalidate_varnish(%) called', table_name; END; -$$ LANGUAGE 'plpgsql'; +$$ LANGUAGE 'plpgsql'; \ No newline at end of file diff --git a/test/CDB_CartodbfyTableTest.sql b/test/CDB_CartodbfyTableTest.sql index eafb79b..3204446 100644 --- a/test/CDB_CartodbfyTableTest.sql +++ b/test/CDB_CartodbfyTableTest.sql @@ -12,6 +12,7 @@ DECLARE tmp INTEGER; ogc_geom geometry_columns; -- old the_geom record in geometry_columns ogc_merc geometry_columns; -- old the_geom_webmercator record in geometry_columns + tabtext TEXT; BEGIN -- Save current constraints on geometry columns, if any @@ -30,7 +31,10 @@ BEGIN END IF; END LOOP; + tabtext := Format('%s.%s','public',tabname); + RAISE NOTICE 'CARTODBFYING % !!!!', tabtext; PERFORM CDB_CartodbfyTable('public', tabname); + tabname := tabtext::regclass; sql := 'INSERT INTO ' || tabname::text || '(the_geom) values ( CDB_LatLng(2,1) ) RETURNING cartodb_id'; EXECUTE sql INTO STRICT id; @@ -74,7 +78,7 @@ BEGIN rec.f_geometry_column, rec.srid, rec.expsrid; END IF; -- Check TYPE constraint didn't change - IF rec.type != rec.exptype THEN + IF (rec.type != 'GEOMETRY') AND (rec.type != 'POINT') THEN RAISE EXCEPTION 'type of % in geometry_columns is %, expected %', rec.f_geometry_column, rec.type, rec.exptype; END IF; @@ -160,17 +164,19 @@ SELECT CDB_CartodbfyTableCheck('t', 'trigger-protected the_geom'); SELECT 'extent',ST_Extent(ST_SnapToGrid(the_geom,0.2)) FROM t; DROP TABLE t; --- table with existing cartodb_id field of type text -CREATE TABLE t AS SELECT 10::text as cartodb_id; -SELECT CDB_CartodbfyTableCheck('t', 'text cartodb_id'); -select cartodb_id/2 FROM t; -DROP TABLE t; +-- INFO: disabled because cartodbfy does not longer consider text columns for primary ID +-- -- table with existing cartodb_id field of type text +-- CREATE TABLE t AS SELECT 10::text as cartodb_id; +-- SELECT CDB_CartodbfyTableCheck('t', 'text cartodb_id'); +-- select cartodb_id/2 FROM t; +-- DROP TABLE t; --- table with existing cartodb_id field of type text not casting -CREATE TABLE t AS SELECT 'nan' as cartodb_id; -SELECT CDB_CartodbfyTableCheck('t', 'uncasting text cartodb_id'); -select cartodb_id,_cartodb_id0 FROM t; -DROP TABLE t; +-- INFO: disabled because cartodbfy does not longer consider text columns for primary ID +-- -- table with existing cartodb_id field of type text not casting +-- CREATE TABLE t AS SELECT 'nan' as cartodb_id; +-- SELECT CDB_CartodbfyTableCheck('t', 'uncasting text cartodb_id'); +-- select cartodb_id,_cartodb_id0 FROM t; +-- DROP TABLE t; -- table with existing cartodb_id field of type int4 not sequenced CREATE TABLE t AS SELECT 1::int4 as cartodb_id; diff --git a/test/CDB_CartodbfyTableTest_expect b/test/CDB_CartodbfyTableTest_expect index 2398ee1..2839fde 100644 --- a/test/CDB_CartodbfyTableTest_expect +++ b/test/CDB_CartodbfyTableTest_expect @@ -2,8 +2,8 @@ SET CREATE FUNCTION SELECT 1 ERROR: Please set user quota before cartodbfying tables. -CONTEXT: SQL statement "SELECT cartodb._CDB_check_prerequisites(schema_name, reloid)" -PL/pgSQL function cdb_cartodbfytable(text,regclass) line 7 at PERFORM +CONTEXT: SQL statement "SELECT cartodb._CDB_check_prerequisites(destschema, reloid)" +PL/pgSQL function cdb_cartodbfytable(text,regclass) line 21 at PERFORM 0 single non-geometrical column cartodbfied fine DROP TABLE @@ -28,14 +28,6 @@ trigger-protected the_geom cartodbfied fine extent|BOX(1 1,2 2) DROP TABLE SELECT 1 -text cartodb_id cartodbfied fine -5 -DROP TABLE -SELECT 1 -uncasting text cartodb_id cartodbfied fine -1|nan -DROP TABLE -SELECT 1 unsequenced cartodb_id cartodbfied fine 1 DROP TABLE diff --git a/test/CDB_QuotaTest.sql b/test/CDB_QuotaTest.sql index e54a74d..6a253af 100644 --- a/test/CDB_QuotaTest.sql +++ b/test/CDB_QuotaTest.sql @@ -7,16 +7,16 @@ CREATE TABLE big(a int); CREATE TRIGGER test_quota BEFORE UPDATE OR INSERT ON big EXECUTE PROCEDURE CDB_CheckQuota(1, 1, 'public'); INSERT INTO big VALUES (1); -- allowed, check runs before -INSERT INTO big VALUES (1); -- disallowed, quota exceeds before +INSERT INTO big VALUES (2); -- disallowed, quota exceeds before SELECT CDB_SetUserQuotaInBytes(0); SELECT CDB_CartodbfyTable('big'); -INSERT INTO big SELECT generate_series(1,2048); -INSERT INTO big SELECT generate_series(1,2048); -INSERT INTO big SELECT generate_series(1,2048); +INSERT INTO big SELECT generate_series(2049,4096); +INSERT INTO big SELECT generate_series(4097,6144); +INSERT INTO big SELECT generate_series(6145,8192); SELECT CDB_SetUserQuotaInBytes(2); -INSERT INTO big VALUES (1); +INSERT INTO big VALUES (8193); SELECT CDB_SetUserQuotaInBytes(0); -INSERT INTO big VALUES (1); +INSERT INTO big VALUES (8194); DROP TABLE big; set client_min_messages to NOTICE; DROP FUNCTION _CDB_UserQuotaInBytes(); diff --git a/test/CDB_QuotaTest_expect b/test/CDB_QuotaTest_expect index 72397a9..f0f57c2 100644 --- a/test/CDB_QuotaTest_expect +++ b/test/CDB_QuotaTest_expect @@ -4,12 +4,12 @@ CREATE TRIGGER INSERT 0 1 ERROR: Quota exceeded by 3.9990234375KB 0 - +big INSERT 0 2048 INSERT 0 2048 INSERT 0 2048 2 -ERROR: Quota exceeded by 519.998046875KB +ERROR: Quota exceeded by 443.998046875KB 0 INSERT 0 1 DROP TABLE