Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1j2ew4-0006gS-GO for pgsql-hackers@arkaria.postgresql.org; Fri, 14 Feb 2020 17:39:28 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1j2ew2-0004gG-MG for pgsql-hackers@arkaria.postgresql.org; Fri, 14 Feb 2020 17:39:26 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1j2ew2-0004g8-C5 for pgsql-hackers@lists.postgresql.org; Fri, 14 Feb 2020 17:39:26 +0000 Received: from sss.pgh.pa.us ([66.207.139.130]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1j2evz-0002oA-O5 for pgsql-hackers@lists.postgresql.org; Fri, 14 Feb 2020 17:39:26 +0000 Received: from sss1.sss.pgh.pa.us (localhost [127.0.0.1]) by sss.pgh.pa.us (8.14.4/8.14.4) with ESMTP id 01EHdJxB022389; Fri, 14 Feb 2020 12:39:19 -0500 From: Tom Lane To: Andres Freund cc: pgsql-hackers@lists.postgresql.org Subject: Re: Marking some contrib modules as trusted extensions In-reply-to: <20200214012638.ie6azbghhzg4jovm@alap3.anarazel.de> References: <32315.1580326876@sss.pgh.pa.us> <20200213233015.r6rnubcvl4egdh5r@alap3.anarazel.de> <13921.1581638230@sss.pgh.pa.us> <20200214012638.ie6azbghhzg4jovm@alap3.anarazel.de> Comments: In-reply-to Andres Freund message dated "Thu, 13 Feb 2020 17:26:38 -0800" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" Content-ID: <22377.1581701935.0@sss.pgh.pa.us> Date: Fri, 14 Feb 2020 12:39:19 -0500 Message-ID: <22388.1581701959@sss.pgh.pa.us> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <22377.1581701935.1@sss.pgh.pa.us> Andres Freund writes: > On 2020-02-13 18:57:10 -0500, Tom Lane wrote: >> Maybe we could decide that the time for supporting easy updates from >> pre-9.1 is past, and just remove all the unpackaged-to-XXX scripts? >> Maybe even remove the "FROM version" option altogether. > Yea, that strikes me as a reasonable thing to do. These days that just > seems to be dangerous, without much advantage. Here's a patch to remove the core-code support and documentation for that. I have not included the actual deletion of the contrib modules' 'unpackaged' scripts, as that seems both long and boring. regards, tom lane ------- =_aaaaaaaaaa0 Content-Type: text/x-diff; name="remove-create-extension-from-option-1.patch"; charset="us-ascii" Content-ID: <22377.1581701935.2@sss.pgh.pa.us> Content-Description: remove-create-extension-from-option-1.patch Content-Transfer-Encoding: quoted-printable diff --git a/doc/src/sgml/contrib.sgml b/doc/src/sgml/contrib.sgml index 08bb110..261a559 100644 --- a/doc/src/sgml/contrib.sgml +++ b/doc/src/sgml/contrib.sgml @@ -88,22 +88,6 @@ CREATE EXTENSION module_name= ; = - If your database was brought forward by dump and reload from a pre-9.1 - version of PostgreSQL, and you had been usin= g the pre-9.1 - version of the module in it, you should instead do - - -CREATE EXTENSION module_name FROM unpackaged; - - - This will update the pre-9.1 objects of the module into a proper - extension object. Future updates to the module = will be - managed by . - For more information about extension updates, see - . - - - Note, however, that some of these modules are not extensions in this sense, but are loaded into the server in some other way, for in= stance by way of diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml index ffe068b..9ec1af7 100644 --- a/doc/src/sgml/extend.sgml +++ b/doc/src/sgml/extend.sgml @@ -917,33 +917,6 @@ SELECT pg_catalog.pg_extension_config_dump('my_config= ', 'WHERE NOT standard_entr = - The update mechanism can be used to solve an important special case: - converting a loose collection of objects into an exte= nsion. - Before the extension mechanism was added to - PostgreSQL (in 9.1), many people wrote - extension modules that simply created assorted unpackaged objects. - Given an existing database containing such objects, how can we conve= rt - the objects into a properly packaged extension? Dropping them and t= hen - doing a plain CREATE EXTENSION is one way, but it= 's not - desirable if the objects have dependencies (for example, if there ar= e - table columns of a data type created by the extension). The way to = fix - this situation is to create an empty extension, then use AL= TER - EXTENSION ADD to attach each pre-existing object to the ex= tension, - then finally create any new objects that are in the current extensio= n - version but were not in the unpackaged release. CREATE - EXTENSION supports this case with its FROM old_version option, which causes i= t to not run the - normal installation script for the target version, but instead the u= pdate - script named - extension--old_vers= ion--target_version.sql= . - The choice of the dummy version name to use as old_version is up to the extension= author, though - unpackaged is a common convention. If you have m= ultiple - prior versions you need to be able to update into extension style, u= se - multiple dummy version names to identify them. - - - ALTER EXTENSION is able to execute sequences of u= pdate script files to achieve a requested update. For example, if only foo--1.0--1.1.sql and foo--1.1--2.0.sql<= /literal> are diff --git a/doc/src/sgml/ref/create_extension.sgml b/doc/src/sgml/ref/cre= ate_extension.sgml index d76ac3e..6a21bff 100644 --- a/doc/src/sgml/ref/create_extension.sgml +++ b/doc/src/sgml/ref/create_extension.sgml @@ -24,7 +24,6 @@ PostgreSQL documentation CREATE EXTENSION [ IF NOT EXISTS ] exten= sion_name [ WITH ] [ SCHEMA schema_name ] [ VERSION version ] - [ FROM old_version ] [ CASCADE ] @@ -48,8 +47,9 @@ CREATE EXTENSION [ IF NOT EXISTS ] extension_name = The user who runs CREATE EXTENSION becomes the - owner of the extension for purposes of later privilege checks, as well - as the owner of any objects created by the extension's script. + owner of the extension for purposes of later privilege checks, and + normally also becomes the owner of any objects created by the + extension's script. = @@ -142,33 +142,6 @@ CREATE EXTENSION [ IF NOT EXISTS ] extension_name = - old_version - - - FROM old_vers= ion - must be specified when, and only when, you are attempting to inst= all - an extension that replaces an old style module tha= t is just - a collection of objects not packaged into an extension. This opt= ion - causes CREATE EXTENSION to run an alternative = installation - script that absorbs the existing objects into the extension, inst= ead - of creating new objects. Be careful that SCHEMA specifies - the schema containing these pre-existing objects. - - - - The value to use for old_version is determined by th= e - extension's author, and might vary if there is more than one vers= ion - of the old-style module that can be upgraded into an extension. - For the standard additional modules supplied with pre-9.1 - PostgreSQL, use unpackaged - for old_version wh= en - updating a module to extension style. - - - - - CASCADE @@ -220,16 +193,6 @@ CREATE EXTENSION [ IF NOT EXISTS ] extension_name CREATE EXTENSION hstore; - - - Update a pre-9.1 installation of hstore into - extension style: - -CREATE EXTENSION hstore SCHEMA public FROM unpackaged; - - Be careful to specify the schema in which you installed the existing - hstore objects. - = diff --git a/src/backend/commands/extension.c b/src/backend/commands/exten= sion.c index ddd46f4..a0db7db 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -1357,7 +1357,6 @@ static ObjectAddress CreateExtensionInternal(char *extensionName, char *schemaName, const char *versionName, - const char *oldVersionName, bool cascade, List *parents, bool is_create) @@ -1367,6 +1366,8 @@ CreateExtensionInternal(char *extensionName, Oid extowner =3D GetUserId(); ExtensionControlFile *pcontrol; ExtensionControlFile *control; + char *filename; + struct stat fst; List *updateVersions; List *requiredExtensions; List *requiredSchemas; @@ -1401,56 +1402,6 @@ CreateExtensionInternal(char *extensionName, * does what is needed, we try to find a sequence of update scripts that * will get us there. */ - if (oldVersionName) - { - /* - * "FROM old_version" was specified, indicating that we're trying to - * update from some unpackaged version of the extension. Locate a - * series of update scripts that will do it. - */ - check_valid_version_name(oldVersionName); - - if (strcmp(oldVersionName, versionName) =3D=3D 0) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("FROM version must be different from installation target ver= sion \"%s\"", - versionName))); - - updateVersions =3D identify_update_path(pcontrol, - oldVersionName, - versionName); - - if (list_length(updateVersions) =3D=3D 1) - { - /* - * Simple case where there's just one update script to run. We - * will not need any follow-on update steps. - */ - Assert(strcmp((char *) linitial(updateVersions), versionName) =3D=3D 0= ); - updateVersions =3D NIL; - } - else - { - /* - * Multi-step sequence. We treat this as installing the version - * that is the target of the first script, followed by successive - * updates to the later versions. - */ - versionName =3D (char *) linitial(updateVersions); - updateVersions =3D list_delete_first(updateVersions); - } - } - else - { - /* - * No FROM, so we're installing from scratch. If there is an install - * script for the desired version, we only need to run that one. - */ - char *filename; - struct stat fst; - - oldVersionName =3D NULL; - filename =3D get_extension_script_filename(pcontrol, NULL, versionName)= ; if (stat(filename, &fst) =3D=3D 0) { @@ -1484,7 +1435,6 @@ CreateExtensionInternal(char *extensionName, /* Otherwise, install best starting point and then upgrade */ versionName =3D evi_start->name; } - } = /* * Fetch control parameters for installation target version @@ -1624,7 +1574,7 @@ CreateExtensionInternal(char *extensionName, * Execute the installation script file */ execute_extension_script(extensionOid, control, - oldVersionName, versionName, + NULL, versionName, requiredSchemas, schemaName, schemaOid); = @@ -1691,7 +1641,6 @@ get_required_extension(char *reqExtensionName, addr =3D CreateExtensionInternal(reqExtensionName, origSchemaName, NULL, - NULL, cascade, cascade_parents, is_create); @@ -1719,11 +1668,9 @@ CreateExtension(ParseState *pstate, CreateExtension= Stmt *stmt) { DefElem *d_schema =3D NULL; DefElem *d_new_version =3D NULL; - DefElem *d_old_version =3D NULL; DefElem *d_cascade =3D NULL; char *schemaName =3D NULL; char *versionName =3D NULL; - char *oldVersionName =3D NULL; bool cascade =3D false; ListCell *lc; = @@ -1787,16 +1734,6 @@ CreateExtension(ParseState *pstate, CreateExtension= Stmt *stmt) d_new_version =3D defel; versionName =3D defGetString(d_new_version); } - else if (strcmp(defel->defname, "old_version") =3D=3D 0) - { - if (d_old_version) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("conflicting or redundant options"), - parser_errposition(pstate, defel->location))); - d_old_version =3D defel; - oldVersionName =3D defGetString(d_old_version); - } else if (strcmp(defel->defname, "cascade") =3D=3D 0) { if (d_cascade) @@ -1815,7 +1752,6 @@ CreateExtension(ParseState *pstate, CreateExtensionS= tmt *stmt) return CreateExtensionInternal(stmt->extname, schemaName, versionName, - oldVersionName, cascade, NIL, true); diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 1b0edf5..96e7fdb 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -4460,7 +4460,7 @@ DropTableSpaceStmt: DROP TABLESPACE name * * QUERY: * CREATE EXTENSION extension - * [ WITH ] [ SCHEMA schema ] [ VERSION version ] [ FROM oldv= ersion ] + * [ WITH ] [ SCHEMA schema ] [ VERSION version ] * ************************************************************************= *****/ = @@ -4500,7 +4500,10 @@ create_extension_opt_item: } | FROM NonReservedWord_or_Sconst { - $$ =3D makeDefElem("old_version", (Node *)makeString($2), @1); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("CREATE EXTENSION ... FROM is no longer supported"), + parser_errposition(@1))); } | CASCADE { ------- =_aaaaaaaaaa0--