]> granicus.if.org Git - postgresql/commitdiff
Throw a useful error message if an extension script file is fed to psql.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 12 Oct 2011 19:45:03 +0000 (15:45 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 12 Oct 2011 19:45:03 +0000 (15:45 -0400)
We have seen one too many reports of people trying to use 9.1 extension
files in the old-fashioned way of sourcing them in psql.  Not only does
that usually not work (due to failure to substitute for MODULE_PATHNAME
and/or @extschema@), but if it did work they'd get a collection of loose
objects not an extension.  To prevent this, insert an \echo ... \quit
line that prints a suitable error message into each extension script file,
and teach commands/extension.c to ignore lines starting with \echo.
That should not only prevent any adverse consequences of loading a script
file the wrong way, but make it crystal clear to users that they need to
do it differently now.

Tom Lane, following an idea of Andrew Dunstan's.  Back-patch into 9.1
... there is not going to be much value in this if we wait till 9.2.

78 files changed:
contrib/adminpack/adminpack--1.0.sql
contrib/btree_gin/btree_gin--1.0.sql
contrib/btree_gin/btree_gin--unpackaged--1.0.sql
contrib/btree_gist/btree_gist--1.0.sql
contrib/btree_gist/btree_gist--unpackaged--1.0.sql
contrib/chkpass/chkpass--1.0.sql
contrib/chkpass/chkpass--unpackaged--1.0.sql
contrib/citext/citext--1.0.sql
contrib/citext/citext--unpackaged--1.0.sql
contrib/cube/cube--1.0.sql
contrib/cube/cube--unpackaged--1.0.sql
contrib/dblink/dblink--1.0.sql
contrib/dblink/dblink--unpackaged--1.0.sql
contrib/dict_int/dict_int--1.0.sql
contrib/dict_int/dict_int--unpackaged--1.0.sql
contrib/dict_xsyn/dict_xsyn--1.0.sql
contrib/dict_xsyn/dict_xsyn--unpackaged--1.0.sql
contrib/earthdistance/earthdistance--1.0.sql
contrib/earthdistance/earthdistance--unpackaged--1.0.sql
contrib/file_fdw/file_fdw--1.0.sql
contrib/fuzzystrmatch/fuzzystrmatch--1.0.sql
contrib/fuzzystrmatch/fuzzystrmatch--unpackaged--1.0.sql
contrib/hstore/hstore--1.0.sql
contrib/hstore/hstore--unpackaged--1.0.sql
contrib/intagg/intagg--1.0.sql
contrib/intagg/intagg--unpackaged--1.0.sql
contrib/intarray/intarray--1.0.sql
contrib/intarray/intarray--unpackaged--1.0.sql
contrib/isn/isn--1.0.sql
contrib/isn/isn--unpackaged--1.0.sql
contrib/lo/lo--1.0.sql
contrib/lo/lo--unpackaged--1.0.sql
contrib/ltree/ltree--1.0.sql
contrib/ltree/ltree--unpackaged--1.0.sql
contrib/pageinspect/pageinspect--1.0.sql
contrib/pageinspect/pageinspect--unpackaged--1.0.sql
contrib/pg_buffercache/pg_buffercache--1.0.sql
contrib/pg_buffercache/pg_buffercache--unpackaged--1.0.sql
contrib/pg_freespacemap/pg_freespacemap--1.0.sql
contrib/pg_freespacemap/pg_freespacemap--unpackaged--1.0.sql
contrib/pg_stat_statements/pg_stat_statements--1.0.sql
contrib/pg_stat_statements/pg_stat_statements--unpackaged--1.0.sql
contrib/pg_trgm/pg_trgm--1.0.sql
contrib/pg_trgm/pg_trgm--unpackaged--1.0.sql
contrib/pgcrypto/pgcrypto--1.0.sql
contrib/pgcrypto/pgcrypto--unpackaged--1.0.sql
contrib/pgrowlocks/pgrowlocks--1.0.sql
contrib/pgrowlocks/pgrowlocks--unpackaged--1.0.sql
contrib/pgstattuple/pgstattuple--1.0.sql
contrib/pgstattuple/pgstattuple--unpackaged--1.0.sql
contrib/seg/seg--1.0.sql
contrib/seg/seg--unpackaged--1.0.sql
contrib/spi/autoinc--1.0.sql
contrib/spi/autoinc--unpackaged--1.0.sql
contrib/spi/insert_username--1.0.sql
contrib/spi/insert_username--unpackaged--1.0.sql
contrib/spi/moddatetime--1.0.sql
contrib/spi/moddatetime--unpackaged--1.0.sql
contrib/spi/refint--1.0.sql
contrib/spi/refint--unpackaged--1.0.sql
contrib/spi/timetravel--1.0.sql
contrib/spi/timetravel--unpackaged--1.0.sql
contrib/sslinfo/sslinfo--1.0.sql
contrib/sslinfo/sslinfo--unpackaged--1.0.sql
contrib/tablefunc/tablefunc--1.0.sql
contrib/tablefunc/tablefunc--unpackaged--1.0.sql
contrib/test_parser/test_parser--1.0.sql
contrib/test_parser/test_parser--unpackaged--1.0.sql
contrib/tsearch2/tsearch2--1.0.sql
contrib/tsearch2/tsearch2--unpackaged--1.0.sql
contrib/unaccent/unaccent--1.0.sql
contrib/unaccent/unaccent--unpackaged--1.0.sql
contrib/uuid-ossp/uuid-ossp--1.0.sql
contrib/uuid-ossp/uuid-ossp--unpackaged--1.0.sql
contrib/xml2/xml2--1.0.sql
contrib/xml2/xml2--unpackaged--1.0.sql
doc/src/sgml/extend.sgml
src/backend/commands/extension.c

index 090702231c0cf8ee336be621c41ef2a0778d846f..f76f5c3cdf71978a37a9bf5e4e0fe83e5631e21d 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/adminpack/adminpack--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION adminpack" to load this file. \quit
+
 /* ***********************************************
  * Administrative functions for PostgreSQL
  * *********************************************** */
index 07f93640f3382d3fba84cbf51390f6342ecff563..cf867ef68735762ec8c570dcf7079f19479a0b72 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/btree_gin/btree_gin--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION btree_gin" to load this file. \quit
+
 CREATE FUNCTION gin_btree_consistent(internal, int2, anyelement, int4, internal, internal)
 RETURNS bool
 AS 'MODULE_PATHNAME'
index fe1ddeab878ab97ce5fa49ee5e90bd6c367cb8a4..8dfafc1e8b9256bce3d950a8f8aa9784fe19e218 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/btree_gin/btree_gin--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION btree_gin" to load this file. \quit
+
 ALTER EXTENSION btree_gin ADD function gin_btree_consistent(internal,smallint,anyelement,integer,internal,internal);
 ALTER EXTENSION btree_gin ADD function gin_extract_value_int2(smallint,internal);
 ALTER EXTENSION btree_gin ADD function gin_compare_prefix_int2(smallint,smallint,smallint,internal);
index dd428995c185a09519ed65433081752b83b71bb7..c5c958753e38a78459317eac8dad46f8b637adba 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/btree_gist/btree_gist--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION btree_gist" to load this file. \quit
+
 CREATE FUNCTION gbtreekey4_in(cstring)
 RETURNS gbtreekey4
 AS 'MODULE_PATHNAME', 'gbtreekey_in'
index 00252bf7c380a999e4f67e3a45c4a53f40d7b20c..838ad7ec1e1dd5c61cbe87dfaa4c401ab5bfa11f 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/btree_gist/btree_gist--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION btree_gist" to load this file. \quit
+
 ALTER EXTENSION btree_gist ADD type gbtreekey4;
 ALTER EXTENSION btree_gist ADD function gbtreekey4_in(cstring);
 ALTER EXTENSION btree_gist ADD function gbtreekey4_out(gbtreekey4);
index 755fee3bc3fc81a35181a2a9fc3bc4f10499b357..d1fbedc4468a118e00f0d372de3a606c0ebc9d39 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/chkpass/chkpass--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION chkpass" to load this file. \quit
+
 --
 --     Input and output functions and the type itself:
 --
index bf91950f3c631926ba4982935eda5b7fd1b09863..7bbfb142a6a8747784b20d175c338a5a9a54aaa4 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/chkpass/chkpass--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION chkpass" to load this file. \quit
+
 ALTER EXTENSION chkpass ADD type chkpass;
 ALTER EXTENSION chkpass ADD function chkpass_in(cstring);
 ALTER EXTENSION chkpass ADD function chkpass_out(chkpass);
index 2760f7e08d9071357a6e0d45184435e5491ee130..1dd19973d778640974302f7ab4bc9db638081e76 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/citext/citext--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION citext" to load this file. \quit
+
 --
 --  PostgreSQL code for CITEXT.
 --
index a59df36797cba6768a617a2c750c9f14cb4db523..42d7aeeb7ffcfa0349583dabb9b95d0be7fbeb06 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/citext/citext--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION citext" to load this file. \quit
+
 ALTER EXTENSION citext ADD type citext;
 ALTER EXTENSION citext ADD function citextin(cstring);
 ALTER EXTENSION citext ADD function citextout(citext);
index ee9febe005315bf13e93a9ef216a7411fc13a445..0307811ceb9c6e3216ef781edc8f44aaa1b3a38f 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/cube/cube--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION cube" to load this file. \quit
+
 -- Create the user-defined type for N-dimensional boxes
 
 CREATE FUNCTION cube_in(cstring)
index 866c18a2898550bcb9017f7df5915f2ae2cfe7a4..68596827861643ab8173cbf3ca3f8a1052b6209b 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/cube/cube--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION cube" to load this file. \quit
+
 ALTER EXTENSION cube ADD type cube;
 ALTER EXTENSION cube ADD function cube_in(cstring);
 ALTER EXTENSION cube ADD function cube(double precision[],double precision[]);
index 4ac551446198b020c9567fa04e9f1cdb744f0ab7..1fec9e39441273b50939752fb457262204f4e535 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/dblink/dblink--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION dblink" to load this file. \quit
+
 -- dblink_connect now restricts non-superusers to password
 -- authenticated connections
 CREATE FUNCTION dblink_connect (text)
index b6d184b4a2c096484d7c19c20644bee0d5249f17..29f5bed0c13a2a1ab5ead15ba2bcf8f29c3a223e 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/dblink/dblink--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION dblink" to load this file. \quit
+
 ALTER EXTENSION dblink ADD function dblink_connect(text);
 ALTER EXTENSION dblink ADD function dblink_connect(text,text);
 ALTER EXTENSION dblink ADD function dblink_connect_u(text);
index 585a56552d66186245ff9daa5167923734c6d897..acb1461b569908733228d4082fa78b6477317f81 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/dict_int/dict_int--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION dict_int" to load this file. \quit
+
 CREATE FUNCTION dintdict_init(internal)
         RETURNS internal
         AS 'MODULE_PATHNAME'
index f89218a565c0c43b018b7f46c66328316b913350..ef59b046ee67f1afa4858e3cc063218eae6ed93c 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/dict_int/dict_int--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION dict_int" to load this file. \quit
+
 ALTER EXTENSION dict_int ADD function dintdict_init(internal);
 ALTER EXTENSION dict_int ADD function dintdict_lexize(internal,internal,internal,internal);
 ALTER EXTENSION dict_int ADD text search template intdict_template;
index 30eaff4db5a92ab8ebec7eecf06b47d3fae806c3..3d6bb51ca893e40409396b5b7686f4880664a74b 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/dict_xsyn/dict_xsyn--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION dict_xsyn" to load this file. \quit
+
 CREATE FUNCTION dxsyn_init(internal)
         RETURNS internal
         AS 'MODULE_PATHNAME'
index 6fe0285f799f96552272b3d5bfd72a121f6f041a..1d193f7981a42f1c0cd780066b15d14f26d08bf4 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/dict_xsyn/dict_xsyn--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION dict_xsyn" to load this file. \quit
+
 ALTER EXTENSION dict_xsyn ADD function dxsyn_init(internal);
 ALTER EXTENSION dict_xsyn ADD function dxsyn_lexize(internal,internal,internal,internal);
 ALTER EXTENSION dict_xsyn ADD text search template xsyn_template;
index 71e4025f6f8a96b92edccef40c1953020d9a9cc3..4af9062e7d8536126bbabfcac2f25adf0a943b7c 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/earthdistance/earthdistance--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION earthdistance" to load this file. \quit
+
 -- earth() returns the radius of the earth in meters. This is the only
 -- place you need to change things for the cube base distance functions
 -- in order to use different units (or a better value for the Earth's radius).
index 2d5919cc72d70b7bd0bf88628289e56a58fbafaa..362e0ac1071c3a6c06fb78d98a02b443958a4918 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/earthdistance/earthdistance--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION earthdistance" to load this file. \quit
+
 ALTER EXTENSION earthdistance ADD function earth();
 ALTER EXTENSION earthdistance ADD type earth;
 ALTER EXTENSION earthdistance ADD function sec_to_gc(double precision);
index 0cca65f46381d758beee56c9c228aa265e510c19..856e6bf0a71f0a58fd4b06dc3235b029e27af33f 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/file_fdw/file_fdw--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION file_fdw" to load this file. \quit
+
 CREATE FUNCTION file_fdw_handler()
 RETURNS fdw_handler
 AS 'MODULE_PATHNAME'
index d9b8987adf562ff436331f4e7e19253e2fdf64a8..1cf9b6188cc04e7cbea382f737cecb5653aaf2fb 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/fuzzystrmatch/fuzzystrmatch--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION fuzzystrmatch" to load this file. \quit
+
 CREATE FUNCTION levenshtein (text,text) RETURNS int
 AS 'MODULE_PATHNAME','levenshtein'
 LANGUAGE C IMMUTABLE STRICT;
index b99510bcddc998c7350eac91e4daddecfbb114b7..b9a805a4fe51779d2d304b16b54fc9b8dd5f0715 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/fuzzystrmatch/fuzzystrmatch--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION fuzzystrmatch" to load this file. \quit
+
 ALTER EXTENSION fuzzystrmatch ADD function levenshtein(text,text);
 ALTER EXTENSION fuzzystrmatch ADD function levenshtein(text,text,integer,integer,integer);
 ALTER EXTENSION fuzzystrmatch ADD function metaphone(text,integer);
index 247a2773f5ad8da91901dfccb16d9eac53076c21..8b211c4669f0a8e60f9926111570e2c7725493e7 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/hstore/hstore--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION hstore" to load this file. \quit
+
 CREATE TYPE hstore;
 
 CREATE FUNCTION hstore_in(cstring)
index 0eb300ecf511607b8d6ba81839baba5ce255f376..b7e73f41232cd7a0fbe97c7d745ddceaede360a5 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/hstore/hstore--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION hstore" to load this file. \quit
+
 ALTER EXTENSION hstore ADD type hstore;
 ALTER EXTENSION hstore ADD function hstore_in(cstring);
 ALTER EXTENSION hstore ADD function hstore_out(hstore);
index 19a57c079b8dc7017066d738f19846bcc8f52914..f96b6e2e9b7b4eb6a58d8a5ad2a4aa7fd83d97b7 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/intagg/intagg--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION intagg" to load this file. \quit
+
 -- Internal function for the aggregate
 -- Is called for each item in an aggregation
 CREATE FUNCTION int_agg_state (internal, int4)
index 95238d9c675606dc84f9f217f3e2d890fc89ec54..6a6663d092c6640d6dd777f6d8266430cb396866 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/intagg/intagg--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION intagg" to load this file. \quit
+
 ALTER EXTENSION intagg ADD function int_agg_state(internal,integer);
 ALTER EXTENSION intagg ADD function int_agg_final_array(internal);
 ALTER EXTENSION intagg ADD function int_array_aggregate(integer);
index 3b77c516cbc12a60d5250d91095793d9029536ed..0b89e0f55e52ac74a41239f70bc4be9ca1ad6a09 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/intarray/intarray--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION intarray" to load this file. \quit
+
 --
 -- Create the user-defined type for the 1-D integer arrays (_int4)
 --
index 5a2829c9f53b93a10d5cc14ff1baadbb417285bb..5de64bf0aba1813db32c566874a1b49bcc641ab8 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/intarray/intarray--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION intarray" to load this file. \quit
+
 ALTER EXTENSION intarray ADD type query_int;
 ALTER EXTENSION intarray ADD function bqarr_in(cstring);
 ALTER EXTENSION intarray ADD function bqarr_out(query_int);
index 336ad1db3ce101d014867a912c12b230f95986bd..0df7bba3b32998f922d0f31cedef6bd79b3ceee8 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/isn/isn--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION isn" to load this file. \quit
+
 -- Example:
 --   create table test ( id isbn );
 --   insert into test values('978-0-393-04002-9');
index 6130a43e5157f6bd264b4135562a24719c9252e6..30e5012156602415d8cd4964a2746b07deb520e0 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/isn/isn--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION isn" to load this file. \quit
+
 ALTER EXTENSION isn ADD type ean13;
 ALTER EXTENSION isn ADD function ean13_in(cstring);
 ALTER EXTENSION isn ADD function ean13_out(ean13);
index 4b9a7dee32e41f1c89b0dc94f145ddbe3288f2cf..cb350e0b8a008f0411b844c19e756f9762a307f4 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/lo/lo--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION lo" to load this file. \quit
+
 --
 --     Create the data type ... now just a domain over OID
 --
index 54de61686eae9e8a8fa6980b9fc8505561c465ef..053185ba1d8576ccb6bd86a589679d2136d57664 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/lo/lo--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION lo" to load this file. \quit
+
 ALTER EXTENSION lo ADD domain lo;
 ALTER EXTENSION lo ADD function lo_oid(lo);
 ALTER EXTENSION lo ADD function lo_manage();
index 32969538a023c62b3c087bdc07d6cbdf6243f15a..5a2f375a4f3f4a215cff9f45fb27060cdb59afd7 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/ltree/ltree--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION ltree" to load this file. \quit
+
 CREATE FUNCTION ltree_in(cstring)
 RETURNS ltree
 AS 'MODULE_PATHNAME'
index f483725b4afd59a945e3bf9f7d66226be39beaa3..1e24fa56c688c75dc6f5b154a564a0581aa9aebe 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/ltree/ltree--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION ltree" to load this file. \quit
+
 ALTER EXTENSION ltree ADD type ltree;
 ALTER EXTENSION ltree ADD function ltree_in(cstring);
 ALTER EXTENSION ltree ADD function ltree_out(ltree);
index a711f581e266141565e7b2284b6898d0a787546f..5613956fd8c74d495b51d42ae198210c9ecb7e7d 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pageinspect/pageinspect--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pageinspect" to load this file. \quit
+
 --
 -- get_raw_page()
 --
index 7d4feaf034ae40198355b49b2862ef20a07df1bc..13e2167dfc1acbf117b5c2848d4dc2bd38f20be5 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pageinspect/pageinspect--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pageinspect" to load this file. \quit
+
 DROP FUNCTION heap_page_items(bytea);
 CREATE FUNCTION heap_page_items(IN page bytea,
        OUT lp smallint,
index 9407d214108c78a92e059e930f27d3322660a600..4ca4c44256c8a0e5e44eb0eadca3345ede63ca6f 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pg_buffercache/pg_buffercache--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pg_buffercache" to load this file. \quit
+
 -- Register the function.
 CREATE FUNCTION pg_buffercache_pages()
 RETURNS SETOF RECORD
index f00a954d86e89ced9ef1c3f6c76b2ed6e01a7f27..bfe6e52f8f40e9d7bb9f706a8e4dd869e213f8ac 100644 (file)
@@ -1,4 +1,7 @@
 /* contrib/pg_buffercache/pg_buffercache--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pg_buffercache" to load this file. \quit
+
 ALTER EXTENSION pg_buffercache ADD function pg_buffercache_pages();
 ALTER EXTENSION pg_buffercache ADD view pg_buffercache;
index d63420e33a4eca70f66d4b6321bb15da0329bbe4..2adb52a3753fc1ab71a2a88e562ab348b5d0eaa1 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pg_freespacemap/pg_freespacemap--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pg_freespacemap" to load this file. \quit
+
 -- Register the C function.
 CREATE FUNCTION pg_freespace(regclass, bigint)
 RETURNS int2
index 4c7487fa4e78da9a6daae7f97d47b5fff9382a61..5e8d7e472ee901e448e01dda4950a2352e391a4c 100644 (file)
@@ -1,4 +1,7 @@
 /* contrib/pg_freespacemap/pg_freespacemap--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pg_freespacemap" to load this file. \quit
+
 ALTER EXTENSION pg_freespacemap ADD function pg_freespace(regclass,bigint);
 ALTER EXTENSION pg_freespacemap ADD function pg_freespace(regclass);
index e17b82c616a86666da33a906ceb0708ef6915d83..5294a01dd52816e373a6c718fcb2fe0e6b0ca3cb 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pg_stat_statements/pg_stat_statements--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pg_stat_statements" to load this file. \quit
+
 -- Register functions.
 CREATE FUNCTION pg_stat_statements_reset()
 RETURNS void
index 9dda85cbdfc384014571b707ba60ad2dacafac4c..e84a3cbafc2c7d4340009b439351c226d31adf58 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pg_stat_statements/pg_stat_statements--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pg_stat_statements" to load this file. \quit
+
 ALTER EXTENSION pg_stat_statements ADD function pg_stat_statements_reset();
 ALTER EXTENSION pg_stat_statements ADD function pg_stat_statements();
 ALTER EXTENSION pg_stat_statements ADD view pg_stat_statements;
index d9cdd23d85f1fe987b4c4ed237ad197ec900c0a7..8067bd60339a2ea2aaea238324315a7cd9c792ec 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pg_trgm/pg_trgm--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pg_trgm" to load this file. \quit
+
 CREATE FUNCTION set_limit(float4)
 RETURNS float4
 AS 'MODULE_PATHNAME'
index 0e1c63f0752d7e7794e3775e5cca635d4b42b29e..7243a6a410f93d911c123d7e38f2590321ca3c4a 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pg_trgm/pg_trgm--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pg_trgm" to load this file. \quit
+
 ALTER EXTENSION pg_trgm ADD function set_limit(real);
 ALTER EXTENSION pg_trgm ADD function show_limit();
 ALTER EXTENSION pg_trgm ADD function show_trgm(text);
index 52be0950ce6391d064d61d404a44084404e461f6..d95a51bc406777c84855227fc7cf460667636d97 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pgcrypto/pgcrypto--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pgcrypto" to load this file. \quit
+
 CREATE FUNCTION digest(text, text)
 RETURNS bytea
 AS 'MODULE_PATHNAME', 'pg_digest'
index 64f0cdf23ac41af213c1aa99a8340d771b887313..fe8d4c4e72ce9e8746a83b40a8a785dfd9766c66 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pgcrypto/pgcrypto--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pgcrypto" to load this file. \quit
+
 ALTER EXTENSION pgcrypto ADD function digest(text,text);
 ALTER EXTENSION pgcrypto ADD function digest(bytea,text);
 ALTER EXTENSION pgcrypto ADD function hmac(text,text,text);
index 0b60fdcd07f6028fd702ebe6f84f64b2bf6d22fe..a909b7430d8fffa80006c503f892b08a24640c28 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pgrowlocks/pgrowlocks--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pgrowlocks" to load this file. \quit
+
 CREATE FUNCTION pgrowlocks(IN relname text,
     OUT locked_row TID,                -- row TID
     OUT lock_type TEXT,                -- lock type
index 2d9d1eed41a98054bc39c74aab50eed6024bd489..b8c3faf1c7678fde8f9c9605e1c46a2ebc166352 100644 (file)
@@ -1,3 +1,6 @@
 /* contrib/pgrowlocks/pgrowlocks--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pgrowlocks" to load this file. \quit
+
 ALTER EXTENSION pgrowlocks ADD function pgrowlocks(text);
index 83445ec4aee6e9be53310db73cab09a6c321203f..f7e03083ad7e90844d0270724dce625a12052cbc 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pgstattuple/pgstattuple--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pgstattuple" to load this file. \quit
+
 CREATE FUNCTION pgstattuple(IN relname text,
     OUT table_len BIGINT,              -- physical table length in bytes
     OUT tuple_count BIGINT,            -- number of live tuples
index 3cfb8db53475002511628062c25b3757948d8dab..14b63cafcf5fe00d2ab15d45648daabd1b34ae4b 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/pgstattuple/pgstattuple--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pgstattuple" to load this file. \quit
+
 ALTER EXTENSION pgstattuple ADD function pgstattuple(text);
 ALTER EXTENSION pgstattuple ADD function pgstattuple(oid);
 ALTER EXTENSION pgstattuple ADD function pgstatindex(text);
index 563411da6a0e1ff787bbf2023bc18740ed90dda5..3230b94f4090e6c4bc69e1f4b185da839fe2b456 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/seg/seg--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION seg" to load this file. \quit
+
 -- Create the user-defined type for 1-D floating point intervals (seg)
 
 CREATE FUNCTION seg_in(cstring)
index 9fefbfc9aa4efd4134d511c71e465a7b5859a67d..ebd6b3bc5b53c28b86dc637731c144848577f9ee 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/seg/seg--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION seg" to load this file. \quit
+
 ALTER EXTENSION seg ADD type seg;
 ALTER EXTENSION seg ADD function seg_in(cstring);
 ALTER EXTENSION seg ADD function seg_out(seg);
index 9c9df9ce0bdce2f760e9e19b619ba6fb7554d3a2..22721e003de669821c8f9a69a670790ad0eac2da 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/spi/autoinc--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION autoinc" to load this file. \quit
+
 CREATE FUNCTION autoinc()
 RETURNS trigger
 AS 'MODULE_PATHNAME'
index 232e9170fc61e8703afc5af6790dcd4f498aa7db..cfe2065d3d860b5f43a891b7aa8643191d1b8170 100644 (file)
@@ -1,3 +1,6 @@
 /* contrib/spi/autoinc--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION autoinc" to load this file. \quit
+
 ALTER EXTENSION autoinc ADD function autoinc();
index bd854587e0316fc1061479594d80a125f4929046..0deb0bf3f8be5a4ba124873e5898b9527354cf04 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/spi/insert_username--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION insert_username" to load this file. \quit
+
 CREATE FUNCTION insert_username()
 RETURNS trigger
 AS 'MODULE_PATHNAME'
index f53cb690f12a55159069e34d65cbece3581a2789..91a5d1f30958cc980011c57777ec626e2e19a17b 100644 (file)
@@ -1,3 +1,6 @@
 /* contrib/spi/insert_username--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION insert_username" to load this file. \quit
+
 ALTER EXTENSION insert_username ADD function insert_username();
index 97cc63289fe97c2f28e74ed9706a5c8c7a9f0ea5..2ee61b814f36126449754fc35370a27798978e7f 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/spi/moddatetime--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION moddatetime" to load this file. \quit
+
 CREATE FUNCTION moddatetime()
 RETURNS trigger
 AS 'MODULE_PATHNAME'
index f3a0a968371fa5071dd03f6645f9c011a5e5ae5e..caa49ce0dc90a790cbf2aab5ba1d6ffbc2fb54b9 100644 (file)
@@ -1,3 +1,6 @@
 /* contrib/spi/moddatetime--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION moddatetime" to load this file. \quit
+
 ALTER EXTENSION moddatetime ADD function moddatetime();
index 9e5d931df5ec8275564be270f72d30f36b54e4ef..faf797c215767ac33c04e4d46ab6d80e5d18dfa8 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/spi/refint--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION refint" to load this file. \quit
+
 CREATE FUNCTION check_primary_key()
 RETURNS trigger
 AS 'MODULE_PATHNAME'
index 54fece055a306e9cf4f8e40bef05ac32337efd2f..cd9c9b0c3656eaf41cba8e26dac97b08c1c5e050 100644 (file)
@@ -1,4 +1,7 @@
 /* contrib/spi/refint--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION refint" to load this file. \quit
+
 ALTER EXTENSION refint ADD function check_primary_key();
 ALTER EXTENSION refint ADD function check_foreign_key();
index b68cf2f2475c01430467a1723225f4b2d70d2d37..c34ca09965b2f87a07d058afbd2e71e62f0fc23c 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/spi/timetravel--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION timetravel" to load this file. \quit
+
 CREATE FUNCTION timetravel()
 RETURNS trigger
 AS 'MODULE_PATHNAME'
index e3716afe95acd7fd7d94c2124031261ef30c7189..dd07a133a5004deb76eb09a281c14ea926b3b4c3 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/spi/timetravel--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION timetravel" to load this file. \quit
+
 ALTER EXTENSION timetravel ADD function timetravel();
 ALTER EXTENSION timetravel ADD function set_timetravel(name,integer);
 ALTER EXTENSION timetravel ADD function get_timetravel(name);
index ef745a0a2e6c2717f62296a5441a8aee3a225114..79ce656786f9a762b57ae2924b5152f584fc6fd7 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/sslinfo/sslinfo--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION sslinfo" to load this file. \quit
+
 CREATE FUNCTION ssl_client_serial() RETURNS numeric
 AS 'MODULE_PATHNAME', 'ssl_client_serial'
 LANGUAGE C STRICT;
index befa96e908bae81e9b9192cbe003670feab4c31b..e4b868423b305b830040d00ef638d8b2c94f4f7f 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/sslinfo/sslinfo--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION sslinfo" to load this file. \quit
+
 ALTER EXTENSION sslinfo ADD function ssl_client_serial();
 ALTER EXTENSION sslinfo ADD function ssl_is_used();
 ALTER EXTENSION sslinfo ADD function ssl_client_cert_present();
index 7bf117cb5c0fcd4ab990368ea181142fb3b117ab..8681ff470662924510dc81e4574cee44dbc35008 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/tablefunc/tablefunc--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION tablefunc" to load this file. \quit
+
 CREATE FUNCTION normal_rand(int4, float8, float8)
 RETURNS setof float8
 AS 'MODULE_PATHNAME','normal_rand'
index 20e09816e9dd1de65b8dd771c0de77c5eed79173..e5e9619c52f93530cd84e05914b349ed185e5ddf 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/tablefunc/tablefunc--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION tablefunc" to load this file. \quit
+
 ALTER EXTENSION tablefunc ADD function normal_rand(integer,double precision,double precision);
 ALTER EXTENSION tablefunc ADD function crosstab(text);
 ALTER EXTENSION tablefunc ADD type tablefunc_crosstab_2;
index 5b8b04bb05b26fb20651051d785d617283633460..06c94d353be27246d81b9e18d4c03c03233c5137 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/test_parser/test_parser--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION test_parser" to load this file. \quit
+
 CREATE FUNCTION testprs_start(internal, int4)
 RETURNS internal
 AS 'MODULE_PATHNAME'
index e240ab2b5bb076db66c4dbdbdb0b74efa1cc6487..34120f2346bc7afc6a4483fec457e9f43721b872 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/test_parser/test_parser--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION test_parser" to load this file. \quit
+
 ALTER EXTENSION test_parser ADD function testprs_start(internal,integer);
 ALTER EXTENSION test_parser ADD function testprs_getlexeme(internal,internal,internal);
 ALTER EXTENSION test_parser ADD function testprs_end(internal);
index 369507e8f56006f30465925bfdf13b7a7e6699b4..4777df8d914a21cd174f89e2f903564ae9722181 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/tsearch2/tsearch2--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION tsearch2" to load this file. \quit
+
 -- These domains are just to catch schema-qualified references to the
 -- old data types.
 CREATE DOMAIN tsvector AS pg_catalog.tsvector;
index d04d5aa57e363b62f1ed8319f6a85acb93988285..af970a4862ff08da0386524694a87f1d940b0055 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/tsearch2/tsearch2--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION tsearch2" to load this file. \quit
+
 ALTER EXTENSION tsearch2 ADD type @extschema@.tsvector;
 ALTER EXTENSION tsearch2 ADD type @extschema@.tsquery;
 ALTER EXTENSION tsearch2 ADD type @extschema@.gtsvector;
index b5909e0b556f38ed9853d62d2d790da99d1746d1..9085ca473fbbd548c2b01c1cc0f4e60fd0e8a2bd 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/unaccent/unaccent--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION unaccent" to load this file. \quit
+
 CREATE FUNCTION unaccent(regdictionary, text)
        RETURNS text
        AS 'MODULE_PATHNAME', 'unaccent_dict'
index eeb9c532f98d5ebd770f24f2c4f756e08911dbdf..abd06983ac4ca87d78ac871b08a0cd84d66ef88c 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/unaccent/unaccent--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION unaccent" to load this file. \quit
+
 ALTER EXTENSION unaccent ADD function unaccent(regdictionary,text);
 ALTER EXTENSION unaccent ADD function unaccent(text);
 ALTER EXTENSION unaccent ADD function unaccent_init(internal);
index 43ae0b38a0bb186dfea8648dd4944369e1c098bf..45ada1b23bc30578496036c9f849e6bf0156e24f 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/uuid-ossp/uuid-ossp--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION uuid-ossp" to load this file. \quit
+
 CREATE FUNCTION uuid_nil()
 RETURNS uuid
 AS 'MODULE_PATHNAME', 'uuid_nil'
index bc984dd8c09d58898335a64f2cdae87ff9ca5843..5c0dbfef9c0f5b7abdbd3fccefe1264178ba9748 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/uuid-ossp/uuid-ossp--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION uuid-ossp" to load this file. \quit
+
 ALTER EXTENSION "uuid-ossp" ADD function uuid_nil();
 ALTER EXTENSION "uuid-ossp" ADD function uuid_ns_dns();
 ALTER EXTENSION "uuid-ossp" ADD function uuid_ns_url();
index bc27dc89ca5ebbbdfc474740b2987352ae1393af..0b6afc63d05f5a66b0fa9e5f33629b61347e8e72 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/xml2/xml2--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION xml2" to load this file. \quit
+
 --SQL for XML parser
 
 -- deprecated old name for xml_is_well_formed
index 1aa894a61927e4e6619b5eaa031e6b7bfe5d5822..b02dabffc2a034b564b9adb872bb40ecd4edd186 100644 (file)
@@ -1,5 +1,8 @@
 /* contrib/xml2/xml2--unpackaged--1.0.sql */
 
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION xml2" to load this file. \quit
+
 ALTER EXTENSION xml2 ADD function xslt_process(text,text);
 ALTER EXTENSION xml2 ADD function xslt_process(text,text,text);
 ALTER EXTENSION xml2 ADD function xpath_table(text,text,text,text,text);
index 35a5ae8fd424680ff4008a99e740f78951607bd1..7079db3ed3f7be7f55bef76b5fae4b9958f4c4aa 100644 (file)
      script files are implicitly executed within a transaction block.
     </para>
 
+    <para>
+     An extension's <acronym>SQL</> script files can also contain lines
+     beginning with <literal>\echo</>, which will be ignored (treated as
+     comments) by the extension mechanism.  This provision is commonly used
+     to throw an error if the script file is fed to <application>psql</>
+     rather than being loaded via <command>CREATE EXTENSION</> (see example
+     script below).  Without that, users might accidentally load the
+     extension's contents as <quote>loose</> objects rather than as an
+     extension, a state of affairs that's a bit tedious to recover from.
+    </para>
+
     <para>
      While the script files can contain any characters allowed by the specified
      encoding, control files should contain only plain ASCII, because there
@@ -808,6 +819,9 @@ SELECT * FROM pg_extension_update_paths('<replaceable>extension_name</>');
      The script file <filename>pair--1.0.sql</> looks like this:
 
 <programlisting><![CDATA[
+-- complain if script is sourced in psql, rather than via CREATE EXTENSION
+\echo Use "CREATE EXTENSION pair" to load this file. \quit
+
 CREATE TYPE pair AS ( k text, v text );
 
 CREATE OR REPLACE FUNCTION pair(anyelement, text)
index 3af15dd38bb7044ec6f733787cad6897b204ccd3..ba1e2c45cd97c89265912d338a98f52bf48ea4b0 100644 (file)
@@ -33,6 +33,7 @@
 #include "catalog/indexing.h"
 #include "catalog/namespace.h"
 #include "catalog/objectaccess.h"
+#include "catalog/pg_collation.h"
 #include "catalog/pg_depend.h"
 #include "catalog/pg_extension.h"
 #include "catalog/pg_namespace.h"
@@ -855,26 +856,39 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control,
        CurrentExtensionObject = extensionOid;
        PG_TRY();
        {
-               char       *sql = read_extension_script_file(control, filename);
+               char       *c_sql = read_extension_script_file(control, filename);
+               Datum           t_sql;
+
+               /* We use various functions that want to operate on text datums */
+               t_sql = CStringGetTextDatum(c_sql);
+
+               /*
+                * Reduce any lines beginning with "\echo" to empty.  This allows
+                * scripts to contain messages telling people not to run them via
+                * psql, which has been found to be necessary due to old habits.
+                */
+               t_sql = DirectFunctionCall4Coll(textregexreplace,
+                                                                               C_COLLATION_OID,
+                                                                               t_sql,
+                                                                               CStringGetTextDatum("^\\\\echo.*$"),
+                                                                               CStringGetTextDatum(""),
+                                                                               CStringGetTextDatum("ng"));
 
                /*
                 * If it's not relocatable, substitute the target schema name for
                 * occcurrences of @extschema@.
                 *
-                * For a relocatable extension, we just run the script as-is. There
-                * cannot be any need for @extschema@, else it wouldn't be
-                * relocatable.
+                * For a relocatable extension, we needn't do this.  There cannot be
+                * any need for @extschema@, else it wouldn't be relocatable.
                 */
                if (!control->relocatable)
                {
                        const char *qSchemaName = quote_identifier(schemaName);
 
-                       sql = text_to_cstring(
-                                                                 DatumGetTextPP(
-                                                                                       DirectFunctionCall3(replace_text,
-                                                                                                       CStringGetTextDatum(sql),
-                                                                                 CStringGetTextDatum("@extschema@"),
-                                                                                CStringGetTextDatum(qSchemaName))));
+                       t_sql = DirectFunctionCall3(replace_text,
+                                                                               t_sql,
+                                                                               CStringGetTextDatum("@extschema@"),
+                                                                               CStringGetTextDatum(qSchemaName));
                }
 
                /*
@@ -883,15 +897,16 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control,
                 */
                if (control->module_pathname)
                {
-                       sql = text_to_cstring(
-                                                                 DatumGetTextPP(
-                                                                                       DirectFunctionCall3(replace_text,
-                                                                                                       CStringGetTextDatum(sql),
-                                                                         CStringGetTextDatum("MODULE_PATHNAME"),
-                                                       CStringGetTextDatum(control->module_pathname))));
+                       t_sql = DirectFunctionCall3(replace_text,
+                                                                               t_sql,
+                                                                               CStringGetTextDatum("MODULE_PATHNAME"),
+                                                       CStringGetTextDatum(control->module_pathname));
                }
 
-               execute_sql_string(sql, filename);
+               /* And now back to C string */
+               c_sql = text_to_cstring(DatumGetTextPP(t_sql));
+
+               execute_sql_string(c_sql, filename);
        }
        PG_CATCH();
        {