From 134d2d29b6a039ea5d50bfdcc20650781c221c18 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 22 May 2014 13:10:42 +0200 Subject: [PATCH] Try to cast TEXT typed updated_at and created_at if present If the cast fails we'll still rename those fields and create new ones. See #27 (cartodb_id is still not done) --- scripts-available/CDB_CartodbfyTable.sql | 41 ++++++++++++------------ test/CDB_CartodbfyTableTest.sql | 8 +++++ test/CDB_CartodbfyTableTest_expect | 4 +++ 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/scripts-available/CDB_CartodbfyTable.sql b/scripts-available/CDB_CartodbfyTable.sql index 97c754c..8f8af8a 100644 --- a/scripts-available/CDB_CartodbfyTable.sql +++ b/scripts-available/CDB_CartodbfyTable.sql @@ -163,27 +163,26 @@ BEGIN IF had_column THEN - -- Check data type is a TIMESTAMP WITH TIMEZONE - SELECT t.typname, t.oid, a.attnotnull 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.oid NOT IN (1184) THEN -- timestamptz { - RAISE NOTICE 'Existing % field is of invalid type % (need timestamptz), renaming', rec.cname, rec2.typname; - ELSE -- }{ - sql := 'ALTER TABLE ' || reloid::text || ' ALTER ' || rec.cname - || ' SET NOT NULL, ALTER ' || rec.cname || ' SET DEFAULT now()'; - BEGIN - RAISE DEBUG 'Running %', sql; - EXECUTE sql; - EXIT column_setup; - EXCEPTION - WHEN not_null_violation THEN - RAISE NOTICE '%, renaming', SQLERRM; - WHEN others THEN - RAISE EXCEPTION 'Got % (%)', SQLERRM, SQLSTATE; - END; - END IF; -- } + -- Ensure data type is a TIMESTAMP WITH TIMEZONE + sql := 'ALTER TABLE ' || reloid::text + || ' ALTER ' || rec.cname + || ' SET NOT NULL,' + || ' ALTER ' || rec.cname + || ' TYPE timestamptz USING ' || rec.cname || '::timestamptz,' + || ' ALTER ' || rec.cname + || ' SET DEFAULT now()'; + BEGIN + RAISE DEBUG 'Running %', sql; + EXECUTE sql; + EXIT column_setup; + EXCEPTION + WHEN not_null_violation THEN -- failed not-null + RAISE NOTICE '%, renaming', SQLERRM; + WHEN cannot_coerce THEN -- failed cast + RAISE NOTICE '%, renaming', SQLERRM; + WHEN others THEN + RAISE EXCEPTION 'Got % (%)', SQLERRM, SQLSTATE; + END; -- invalid column, need rename and re-create it i := 0; diff --git a/test/CDB_CartodbfyTableTest.sql b/test/CDB_CartodbfyTableTest.sql index a57be77..0951126 100644 --- a/test/CDB_CartodbfyTableTest.sql +++ b/test/CDB_CartodbfyTableTest.sql @@ -170,6 +170,14 @@ SELECT CDB_CartodbfyTableCheck('t', 'trigger-protected the_geom'); SELECT 'extent',ST_Extent(ST_SnapToGrid(the_geom,0.1)) FROM t; DROP TABLE t; +-- table with existing updated_at and created_at fields ot type text +CREATE TABLE t AS SELECT NOW()::text as created_at, + NOW()::text as updated_at, + NOW() as reftime; +SELECT CDB_CartodbfyTableCheck('t', 'text timestamps'); +SELECT reftime-created_at, reftime-updated_at FROM t; +DROP TABLE t; + -- TODO: table with existing custom-triggered the_geom DROP FUNCTION CDB_CartodbfyTableCheck(regclass, text); diff --git a/test/CDB_CartodbfyTableTest_expect b/test/CDB_CartodbfyTableTest_expect index b66c318..d51a41e 100644 --- a/test/CDB_CartodbfyTableTest_expect +++ b/test/CDB_CartodbfyTableTest_expect @@ -25,5 +25,9 @@ CREATE TRIGGER trigger-protected the_geom cartodbfied fine extent|BOX(1 1,2 2) DROP TABLE +SELECT 1 +text timestamps cartodbfied fine +@ 0|@ 0 +DROP TABLE DROP FUNCTION DROP FUNCTION