On Wed, Feb 09, 2022 at 05:12:41PM +0100, Peter Eisentraut wrote:
> On 08.02.22 13:55, Julien Rouhaud wrote:
> > Apart from that I still think that we should check the collation version of the
> > source database when creating a new database. It won't cost much but will give
> > the DBA a chance to recreate the indexes before risking invalid index usage.
>
> A question on this: In essence, this would be putting code into createdb()
> similar to the code in postinit.c:CheckMyDatabase(). But what should we
> make it do and say exactly?
>
> After thinking about this for a bit, I suggest: If the actual collation
> version of the newly created database does not match the recorded collation
> version of the template database, we should error out and make the user fix
> the template database (by reindexing there etc.).
I'm not sure what you really mean by "actual collation version of the newly
created database". Is it really a check after having done all the work or just
checking a discrepancy when computing the to-be-created database version from
the source database, ie. something like
if (dbcollversion == NULL)
+ {
dbcollversion = src_collversion;
+ if src_collversion != get_collation_actual_version(the source db)
+ // raise error or warning
> The alternative is to warn, as it does now in postinit.c. But then the
> phrasing of the message becomes complicated: Should we make the user fix the
> new database or the template database or both? And if they don't fix the
> template database, they will have the same problem again. So making it a
> hard failure seems better to me.
Agreed, I'm in favor of a hard error. Maybe a message like:
errmsg(cannot create database %s)
errdetail(the template database %s was created using collation version %s, but
the operating system provides version %s)
Also, that check shouldn't be done when using the COLLATION_VERSION option of
create database, since it's there for pg_upgrade usage?