mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Rethink behavior of pg_import_system_collations().
Marco Atzeri reported that initdb would fail if "locale -a" reported the same locale name more than once. All previous versions of Postgres implicitly de-duplicated the results of "locale -a", but the rewrite to move the collation import logic into C had lost that property. It had also lost the property that locale names matching built-in collation names were silently ignored. The simplest way to fix this is to make initdb run the function in if-not-exists mode, which means that there's no real use-case for non if-not-exists mode; we might as well just drop the boolean argument and simplify the function's definition to be "add any collations not already known". This change also gets rid of some odd corner cases caused by the fact that aliases were added in if-not-exists mode even if the function argument said otherwise. While at it, adjust the behavior so that pg_import_system_collations() doesn't spew "collation foo already exists, skipping" messages during a re-run; that's completely unhelpful, especially since there are often hundreds of them. And make it return a count of the number of collations it did add, which seems like it might be helpful. Also, re-integrate the previous coding's property that it would make a deterministic selection of which alias to use if there were conflicting possibilities. This would only come into play if "locale -a" reports multiple equivalent locale names, say "de_DE.utf8" and "de_DE.UTF-8", but that hardly seems out of the question. In passing, fix incorrect behavior in pg_import_system_collations()'s ICU code path: it neglected CommandCounterIncrement, which would result in failures if ICU returns duplicate names, and it would try to create comments even if a new collation hadn't been created. Also, reorder operations in initdb so that the 'ucs_basic' collation is created before calling pg_import_system_collations() not after. This prevents a failure if "locale -a" were to report a locale named that. There's no reason to think that that ever happens in the wild, but the old coding would have survived it, so let's be equally robust. Discussion: https://postgr.es/m/20c74bc3-d6ca-243d-1bbc-12f17fa4fe9a@gmail.com
This commit is contained in:
@ -19711,9 +19711,9 @@ postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup());
|
||||
<row>
|
||||
<entry>
|
||||
<indexterm><primary>pg_import_system_collations</primary></indexterm>
|
||||
<literal><function>pg_import_system_collations(<parameter>if_not_exists</> <type>boolean</>, <parameter>schema</> <type>regnamespace</>)</function></literal>
|
||||
<literal><function>pg_import_system_collations(<parameter>schema</> <type>regnamespace</>)</function></literal>
|
||||
</entry>
|
||||
<entry><type>void</type></entry>
|
||||
<entry><type>integer</type></entry>
|
||||
<entry>Import operating system collations</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
@ -19730,18 +19730,20 @@ postgres=# SELECT * FROM pg_walfile_name_offset(pg_stop_backup());
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<function>pg_import_system_collations</> populates the system
|
||||
catalog <literal>pg_collation</literal> with collations based on all the
|
||||
locales it finds on the operating system. This is
|
||||
<function>pg_import_system_collations</> adds collations to the system
|
||||
catalog <literal>pg_collation</literal> based on all the
|
||||
locales it finds in the operating system. This is
|
||||
what <command>initdb</command> uses;
|
||||
see <xref linkend="collation-managing"> for more details. If additional
|
||||
locales are installed into the operating system later on, this function
|
||||
can be run again to add collations for the new locales. In that case, the
|
||||
parameter <parameter>if_not_exists</parameter> should be set to true to
|
||||
skip over existing collations. The <parameter>schema</parameter>
|
||||
parameter would typically be <literal>pg_catalog</literal>, but that is
|
||||
not a requirement. (Collation objects based on locales that are no longer
|
||||
present on the operating system are never removed by this function.)
|
||||
can be run again to add collations for the new locales. Locales that
|
||||
match existing entries in <literal>pg_collation</literal> will be skipped.
|
||||
(But collation objects based on locales that are no longer
|
||||
present in the operating system are not removed by this function.)
|
||||
The <parameter>schema</parameter> parameter would typically
|
||||
be <literal>pg_catalog</literal>, but that is not a requirement;
|
||||
the collations could be installed into some other schema as well.
|
||||
The function returns the number of new collation objects it created.
|
||||
</para>
|
||||
|
||||
</sect2>
|
||||
|
Reference in New Issue
Block a user