From: Sandro Santilli <strk@kbt.io>
To: Regina Obe <lr@pcorp.us>
Cc: Christoph Berg <cb@df7cb.de>
Cc: pgsql-hackers@lists.postgresql.org, pgsql-hackers@postgresql.org, 'Laurenz Albe' <laurenz.albe@cybertec.at>
Cc: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Paul Ramsey <pramsey@cleverelephant.ca>
Subject: Re: [PATCH] Support % wildcard in extension upgrade filenames
Date: Thu, 17 Nov 2022 00:09:33 +0100
Message-ID: <20221116230933.6ynksku66i436ozm@c19> (raw)
In-Reply-To: <000001d8f7e4$1c840d50$558c27f0$@pcorp.us>
References: <YgakFklJyM5pNdt+@c19>
<001d01d87211$edbd5b50$c93811f0$@pcorp.us>
<d3924670ba8fefa42f4bd462c5b7f6349d63f4d3.camel@cybertec.at>
<Ypsj95RJSARwfQt6@c19>
<YyJPHOfwLIjxxi9u@c19>
<Y25zMZG45ENExfNL@msg.df7cb.de>
<000001d8f7e4$1c840d50$558c27f0$@pcorp.us>
On Sun, Nov 13, 2022 at 11:46:50PM -0500, Regina Obe wrote:
> > Re: Sandro Santilli
> > > I'm attaching an updated version of the patch. This time the patch is
> > > tested. Nothing changes unless the .control file for the subject
> > > extension doesn't have a "wildcard_upgrades = true" statement.
> > >
> > > When wildcard upgrades are enabled, a file with a "%" symbol as the
> > > "source" part of the upgrade path will match any version and
> >
> > Fwiw I believe wildcard_upgrades isn't necessary in the .control file.
> > If there are no % files, none would be used anyway, and if there are, it's
> clear
> > it's meant as wildcard since % won't appear in any remotely sane version
> > number.
>
> I also like the idea of skipping the wildcard_upgrades syntax.
> Then there is no need to have a conditional control file for PG 16 vs. older
> versions.
Here we go. Attached a version of the patch with no
"wildcard_upgrades" controlling it.
--strk;
Attachments:
[text/x-diff] 0001-Allow-wildcard-in-extension-upgrade-paths.patch (8.3K, ../20221116230933.6ynksku66i436ozm@c19/2-0001-Allow-wildcard-in-extension-upgrade-paths.patch)
download | inline diff:
From 9b138eae95e0d389bee3776247ba9d7d5144bcc5 Mon Sep 17 00:00:00 2001
From: Sandro Santilli <strk@kbt.io>
Date: Wed, 14 Sep 2022 11:10:10 +0200
Subject: [PATCH] Allow wildcard (%) in extension upgrade paths
A wildcard character "%" will be accepted in the
"source" side of the upgrade script and be considered
usable to upgrade any version to the "target" side.
Includes regression test and documentation.
---
doc/src/sgml/extend.sgml | 8 ++++
src/backend/commands/extension.c | 42 ++++++++++++++++---
src/test/modules/test_extensions/Makefile | 6 ++-
.../expected/test_extensions.out | 15 +++++++
.../test_extensions/sql/test_extensions.sql | 7 ++++
.../test_ext_wildcard1--%--2.0.sql | 6 +++
.../test_ext_wildcard1--1.0.sql | 6 +++
.../test_ext_wildcard1.control | 3 ++
8 files changed, 85 insertions(+), 8 deletions(-)
create mode 100644 src/test/modules/test_extensions/test_ext_wildcard1--%--2.0.sql
create mode 100644 src/test/modules/test_extensions/test_ext_wildcard1--1.0.sql
create mode 100644 src/test/modules/test_extensions/test_ext_wildcard1.control
diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgmlindex 46e873a166..c79140f669 100644--- a/doc/src/sgml/extend.sgml+++ b/doc/src/sgml/extend.sgml@@ -1081,6 +1081,14 @@ SELECT pg_catalog.pg_extension_config_dump('my_config', 'WHERE NOT standard_entr
<literal>1.1</literal>).
</para>
+ <para>+ The literal value <literal>%</literal> can be used as the+ <replaceable>old_version</replaceable> component in an extension+ update script for it to match any version. Such wildcard update+ scripts will only be used when no explicit path is found from+ old to target version.+ </para>+
<para>
Given that a suitable update script is available, the command
<command>ALTER EXTENSION UPDATE</command> will update an installed extension
diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.cindex 1a62e5dac5..e3ea9dba30 100644--- a/src/backend/commands/extension.c+++ b/src/backend/commands/extension.c@@ -128,6 +128,7 @@ static void ApplyExtensionUpdates(Oid extensionOid,
bool cascade,
bool is_create);
static char *read_whole_file(const char *filename, int *length);
+static bool file_exists(const char *name);
/*
@@ -890,7 +891,14 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control,
if (from_version == NULL)
elog(DEBUG1, "executing extension script for \"%s\" version '%s'", control->name, version);
else
+ {+ if ( ! file_exists(filename) )+ {+ /* if filename does not exist, try wildcard */+ filename = get_extension_script_filename(control, "%", version);+ }
elog(DEBUG1, "executing extension script for \"%s\" update from version '%s' to '%s'", control->name, from_version, version);
+ }
/*
* If installing a trusted extension on behalf of a non-superuser, become
@@ -1214,14 +1222,19 @@ identify_update_path(ExtensionControlFile *control,
/* Find shortest path */
result = find_update_path(evi_list, evi_start, evi_target, false, false);
+ if (result != NIL)+ return result;- if (result == NIL)- ereport(ERROR,- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),- errmsg("extension \"%s\" has no update path from version \"%s\" to version \"%s\"",- control->name, oldVersion, newVersion)));+ /* Find wildcard path, if no explicit path was found */+ evi_start = get_ext_ver_info("%", &evi_list);+ result = find_update_path(evi_list, evi_start, evi_target, false, false);+ if (result != NIL)+ return result;- return result;+ ereport(ERROR,+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),+ errmsg("extension \"%s\" has no update path from version \"%s\" to version \"%s\"",+ control->name, oldVersion, newVersion)));
}
/*
@@ -3392,3 +3405,20 @@ read_whole_file(const char *filename, int *length)
buf[*length] = '\0';
return buf;
}
++static bool+file_exists(const char *name)+{+ struct stat st;++ Assert(name != NULL);++ if (stat(name, &st) == 0)+ return !S_ISDIR(st.st_mode);+ else if (!(errno == ENOENT || errno == ENOTDIR || errno == EACCES))+ ereport(ERROR,+ (errcode_for_file_access(),+ errmsg("could not access file \"%s\": %m", name)));++ return false;+}diff --git a/src/test/modules/test_extensions/Makefile b/src/test/modules/test_extensions/Makefileindex c3139ab0fc..4fe2d82b6e 100644--- a/src/test/modules/test_extensions/Makefile+++ b/src/test/modules/test_extensions/Makefile@@ -6,14 +6,16 @@ PGFILEDESC = "test_extensions - regression testing for EXTENSION support"
EXTENSION = test_ext1 test_ext2 test_ext3 test_ext4 test_ext5 test_ext6 \
test_ext7 test_ext8 test_ext_cine test_ext_cor \
test_ext_cyclic1 test_ext_cyclic2 \
- test_ext_evttrig+ test_ext_evttrig test_ext_wildcard1
DATA = test_ext1--1.0.sql test_ext2--1.0.sql test_ext3--1.0.sql \
test_ext4--1.0.sql test_ext5--1.0.sql test_ext6--1.0.sql \
test_ext7--1.0.sql test_ext7--1.0--2.0.sql test_ext8--1.0.sql \
test_ext_cine--1.0.sql test_ext_cine--1.0--1.1.sql \
test_ext_cor--1.0.sql \
test_ext_cyclic1--1.0.sql test_ext_cyclic2--1.0.sql \
- test_ext_evttrig--1.0.sql test_ext_evttrig--1.0--2.0.sql+ test_ext_evttrig--1.0.sql test_ext_evttrig--1.0--2.0.sql \+ test_ext_wildcard1--1.0.sql test_ext_wildcard1--%--2.0.sql \+
REGRESS = test_extensions test_extdepend
diff --git a/src/test/modules/test_extensions/expected/test_extensions.out b/src/test/modules/test_extensions/expected/test_extensions.outindex 821fed38d1..1c4dc5be42 100644--- a/src/test/modules/test_extensions/expected/test_extensions.out+++ b/src/test/modules/test_extensions/expected/test_extensions.out@@ -312,3 +312,18 @@ Objects in extension "test_ext_cine"
table ext_cine_tab3
(9 rows)
+CREATE EXTENSION test_ext_wildcard1;+SELECT ext_wildcard1_version();+ ext_wildcard1_version +-----------------------+ 1.0+(1 row)++ALTER EXTENSION test_ext_wildcard1 UPDATE TO '2.0';+SELECT ext_wildcard1_version();+ ext_wildcard1_version +-----------------------+ 2.0+(1 row)++DROP EXTENSION test_ext_wildcard1;diff --git a/src/test/modules/test_extensions/sql/test_extensions.sql b/src/test/modules/test_extensions/sql/test_extensions.sqlindex 41b6cddf0b..071845e8df 100644--- a/src/test/modules/test_extensions/sql/test_extensions.sql+++ b/src/test/modules/test_extensions/sql/test_extensions.sql@@ -209,3 +209,10 @@ CREATE EXTENSION test_ext_cine;
ALTER EXTENSION test_ext_cine UPDATE TO '1.1';
\dx+ test_ext_cine
+++CREATE EXTENSION test_ext_wildcard1;+SELECT ext_wildcard1_version();+ALTER EXTENSION test_ext_wildcard1 UPDATE TO '2.0';+SELECT ext_wildcard1_version();+DROP EXTENSION test_ext_wildcard1;diff --git a/src/test/modules/test_extensions/test_ext_wildcard1--%--2.0.sql b/src/test/modules/test_extensions/test_ext_wildcard1--%--2.0.sqlnew file mode 100644index 0000000000..75154e5c55--- /dev/null+++ b/src/test/modules/test_extensions/test_ext_wildcard1--%--2.0.sql@@ -0,0 +1,6 @@+/* src/test/modules/test_extensions/test_ext_wildcard1--%--2.0.sql */+-- complain if script is sourced in psql, rather than via ALTER EXTENSION+\echo Use "ALTER EXTENSION test_ext_wildcard1 UPDATE TO '2.0'" to load this file. \quit++CREATE OR REPLACE FUNCTION ext_wildcard1_version() returns TEXT+AS 'SELECT 2.0' LANGUAGE 'sql';diff --git a/src/test/modules/test_extensions/test_ext_wildcard1--1.0.sql b/src/test/modules/test_extensions/test_ext_wildcard1--1.0.sqlnew file mode 100644index 0000000000..a69e791fda--- /dev/null+++ b/src/test/modules/test_extensions/test_ext_wildcard1--1.0.sql@@ -0,0 +1,6 @@+/* src/test/modules/test_extensions/test_ext_wildcard1--1.0.sql */+-- complain if script is sourced in psql, rather than via ALTER EXTENSION+\echo Use "CREATE EXTENSION test_ext_wildcard1" to load this file. \quit++CREATE FUNCTION ext_wildcard1_version() returns TEXT+AS 'SELECT 1.0' LANGUAGE 'sql';diff --git a/src/test/modules/test_extensions/test_ext_wildcard1.control b/src/test/modules/test_extensions/test_ext_wildcard1.controlnew file mode 100644index 0000000000..0c2fc6fca6--- /dev/null+++ b/src/test/modules/test_extensions/test_ext_wildcard1.control@@ -0,0 +1,3 @@+comment = 'Test extension wildcard 1'+default_version = '1.0'+relocatable = true--
2.34.1
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: strk@kbt.io, lr@pcorp.us, cb@df7cb.de, laurenz.albe@cybertec.at, tgl@sss.pgh.pa.us, pramsey@cleverelephant.ca
Subject: Re: [PATCH] Support % wildcard in extension upgrade filenames
In-Reply-To: <20221116230933.6ynksku66i436ozm@c19>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox