When adding json support to hstore, I made a major blunder and added the new functionality to the existing sql script instead of bumping the version, renaming the script and adding an update script.

This was lazy and there's no real excuse, although I will note that it was a mistake far too easy to make. Perhaps as a warning indicator we should remove write permissions from these files.

Anyway, I have had some discussions with Dimitri, and the best idea seems to be that we should do all the above, but in the update script use conditional logic that only adds the functions if they aren't already there and dependent on the extension. In the release notes we should advise anyone who has loaded hstore to run 'ALTER EXTENSION hstore UPDATE TO '1.2';"

The minor downside of this is that the upgrade script will depend on plpgsql be available. We'll need to note that too, although I don't recall the last time I came across a site that didn't have it loaded.

See attached for details of what's proposed.

cheers

andrew




diff --git a/contrib/hstore/hstore--1.1--1.2.sql 
b/contrib/hstore/hstore--1.1--1.2.sql
new file mode 100644
index 0000000..99b8a16
--- /dev/null
+++ b/contrib/hstore/hstore--1.1--1.2.sql
@@ -0,0 +1,47 @@
+/* contrib/hstore/hstore--1.1--1.2.sql */
+
+-- complain if script is sourced in psql, rather than via ALTER EXTENSION
+\echo Use "ALTER EXTENSION hstore UPDATE TO '1.2'" to load this file. \quit
+
+
+-- A version of 1.1 was shipped with these objects mistakenly in 9.3.0.
+-- Therefore we only add them if we detect that they aren't already there and 
+-- dependent on the extension.
+
+DO LANGUAGE plpgsql
+
+$$
+
+BEGIN
+
+   PERFORM 1
+   FROM pg_proc p
+       JOIN  pg_depend d
+          ON p.proname = 'hstore_to_json_loose'
+            AND d.objid = p.oid
+            AND d.refclassid = 'pg_extension'::regclass
+       JOIN pg_extension x
+          ON d.refobjid = x.oid
+            AND  x.extname = 'hstore';
+
+   IF NOT FOUND
+   THEN 
+
+        CREATE FUNCTION hstore_to_json(hstore)
+        RETURNS json
+        AS 'MODULE_PATHNAME', 'hstore_to_json'
+        LANGUAGE C IMMUTABLE STRICT;
+
+        CREATE CAST (hstore AS json)
+          WITH FUNCTION hstore_to_json(hstore);
+
+        CREATE FUNCTION hstore_to_json_loose(hstore)
+        RETURNS json
+        AS 'MODULE_PATHNAME', 'hstore_to_json_loose'
+        LANGUAGE C IMMUTABLE STRICT;
+
+   END IF;
+
+END;
+
+$$;
diff --git a/contrib/hstore/hstore--1.1.sql b/contrib/hstore/hstore--1.2.sql
similarity index 100%
rename from contrib/hstore/hstore--1.1.sql
rename to contrib/hstore/hstore--1.2.sql
diff --git a/contrib/hstore/hstore.control b/contrib/hstore/hstore.control
index 4104e17..9daf5e2 100644
--- a/contrib/hstore/hstore.control
+++ b/contrib/hstore/hstore.control
@@ -1,5 +1,5 @@
 # hstore extension
 comment = 'data type for storing sets of (key, value) pairs'
-default_version = '1.1'
+default_version = '1.2'
 module_pathname = '$libdir/hstore'
 relocatable = true
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to