Re: ICU for global collation

From: Thomas Munro <thomas(dot)munro(at)gmail(dot)com>
To: Marius Timmer <marius(dot)timmer(at)uni-muenster(dot)de>
Cc: Daniel Verite <daniel(at)manitou-mail(dot)org>, Peter Eisentraut <peter(dot)eisentraut(at)2ndquadrant(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Arne Scheffer <scheffa(at)uni-muenster(dot)de>
Subject: Re: ICU for global collation
Date: 2019-10-17 21:43:06
Message-ID: CA+hUKGJqw0hqjE77B88j_-w-0geR_kYHPcJF6wGoUc=Qf2N7OA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, Oct 17, 2019 at 3:52 PM Thomas Munro <thomas(dot)munro(at)gmail(dot)com> wrote:
> I rebased this patch, and tweaked get_collation_action_version() very
> slightly so that you get collation version change detection (of the
> ersatz kind provided by commit d5ac14f9) for the default collation
> even when not using ICU. Please see attached.

It should also remove the sentence I recently added to
alter_collation.sgml to say that the default collation doesn't have
version tracking. Rereading that section, it's also clear that the
query introduced with:

"The following query can be used to identify all collations in the current
database that need to be refreshed and the objects that depend on them:"

… is wrong with this patch applied. The right query is quite hard to
come up with, since we don't explicitly track dependencies on the
default collation. That is, there is no pg_depend entry pointing from
the index to the collation when you write CREATE INDEX ON t(x) for a
text column using the default collation, but there is one when you
write CREATE INDEX ON t(x COLLATE "fr_FR"), or when you write CREATE
INDEX ON t(x) for a text column that was explicitly defined to use
COLLATE "fr_FR". One solution is that we could start tracking those
dependencies explicitly too.

A preexisting problem with that query is that it doesn't report
transitive dependencies. An index on t(x) of a user defined type
defined with CREATE TYPE my_type AS (x text COLLATE "fr_FR") doesn't
result in a pg_depend row from index to collation, so the query fails
to report that as an index needing to be rebuilt. You could fix that
with a sprinkle of recursive magic, but you'd need a different kind of
magic to deal with transitive dependencies on the default collation
unless we start listing such dependencies explicitly. In that
example, my_type would need to depend on collation "default". You
can't just do some kind of search for transitive dependencies on type
"text", because they aren't tracked either.

In my longer term proposal to track per-dependency versions, either by
adding refobjversion to pg_depend or by creating another
pg_depend-like catalog, you'd almost certainly need to add an explicit
record for dependencies on the default collation.

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Stephen Frost 2019-10-17 22:02:57 Re: v12 and pg_restore -f-
Previous Message Lars Kanis 2019-10-17 20:10:17 Re: libpq: Fix wrong connection status on invalid "connect_timeout"