diff options
author | Thomas Munro <tmunro@postgresql.org> | 2021-05-07 20:17:42 +1200 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2021-05-07 21:10:11 +1200 |
commit | ec48314708262d8ea6cdcb83f803fc83dd89e721 (patch) | |
tree | f5b7c82ea571ce78aaa355095dd588dce07349ff /src/test | |
parent | a288d94c91e345ebeb10ac30f247270c8c8e380a (diff) |
Revert per-index collation version tracking feature.
Design problems were discovered in the handling of composite types and
record types that would cause some relevant versions not to be recorded.
Misgivings were also expressed about the use of the pg_depend catalog
for this purpose. We're out of time for this release so we'll revert
and try again.
Commits reverted:
1bf946bd: Doc: Document known problem with Windows collation versions.
cf002008: Remove no-longer-relevant test case.
ef387bed: Fix bogus collation-version-recording logic.
0fb0a050: Hide internal error for pg_collation_actual_version(<bad OID>).
ff942057: Suppress "warning: variable 'collcollate' set but not used".
d50e3b1f: Fix assertion in collation version lookup.
f24b1569: Rethink extraction of collation dependencies.
257836a7: Track collation versions for indexes.
cd6f479e: Add pg_depend.refobjversion.
7d1297df: Remove pg_collation.collversion.
Discussion: https://postgr.es/m/CA%2BhUKGLhj5t1fcjqAu8iD9B3ixJtsTNqyCCD4V0aTO9kAKAjjA%40mail.gmail.com
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/Makefile | 3 | ||||
-rw-r--r-- | src/test/locale/.gitignore | 1 | ||||
-rw-r--r-- | src/test/locale/Makefile | 7 | ||||
-rw-r--r-- | src/test/locale/t/001_index.pl | 67 | ||||
-rw-r--r-- | src/test/regress/expected/collate.icu.utf8.out | 195 | ||||
-rw-r--r-- | src/test/regress/expected/collate.linux.utf8.out | 3 | ||||
-rw-r--r-- | src/test/regress/expected/create_index.out | 6 | ||||
-rw-r--r-- | src/test/regress/expected/misc_sanity.out | 4 | ||||
-rw-r--r-- | src/test/regress/sql/collate.icu.utf8.sql | 138 | ||||
-rw-r--r-- | src/test/regress/sql/collate.linux.utf8.sql | 5 | ||||
-rw-r--r-- | src/test/regress/sql/create_index.sql | 4 |
11 files changed, 24 insertions, 409 deletions
diff --git a/src/test/Makefile b/src/test/Makefile index f7859c2fd5e..46275915ff3 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -12,8 +12,7 @@ subdir = src/test top_builddir = ../.. include $(top_builddir)/src/Makefile.global -SUBDIRS = perl regress isolation modules authentication recovery subscription \ - locale +SUBDIRS = perl regress isolation modules authentication recovery subscription # Test suites that are not safe by default but can be run if selected # by the user via the whitespace-separated list in variable diff --git a/src/test/locale/.gitignore b/src/test/locale/.gitignore index 64e1bf2a803..620d3df4254 100644 --- a/src/test/locale/.gitignore +++ b/src/test/locale/.gitignore @@ -1,2 +1 @@ /test-ctype -/tmp_check/ diff --git a/src/test/locale/Makefile b/src/test/locale/Makefile index 673e14dcd08..7ba096b5427 100644 --- a/src/test/locale/Makefile +++ b/src/test/locale/Makefile @@ -4,7 +4,6 @@ subdir = src/test/locale top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -export with_icu PROGS = test-ctype DIRS = de_DE.ISO8859-1 gr_GR.ISO8859-7 koi8-r koi8-to-win1251 @@ -21,9 +20,3 @@ clean distclean maintainer-clean: # These behave like installcheck targets. check-%: all @$(MAKE) -C `echo $@ | sed 's/^check-//'` test - -check: - $(prove_check) - -installcheck: - $(prove_installcheck) diff --git a/src/test/locale/t/001_index.pl b/src/test/locale/t/001_index.pl deleted file mode 100644 index a67f78cb719..00000000000 --- a/src/test/locale/t/001_index.pl +++ /dev/null @@ -1,67 +0,0 @@ -use strict; -use warnings; - -use Config; -use PostgresNode; -use TestLib; -use Test::More; - -if ($ENV{with_icu} eq 'yes') -{ - plan tests => 10; -} -else -{ - plan skip_all => 'ICU not supported by this build'; -} - -#### Set up the server - -note "setting up data directory"; -my $node = get_new_node('main'); -$node->init(extra => [ '--encoding=UTF8' ]); - -$ENV{PGHOST} = $node->host; -$ENV{PGPORT} = $node->port; -$node->start; - -sub test_index -{ - my ($err_like, $err_comm) = @_; - my ($ret, $out, $err) = $node->psql('postgres', "SELECT * FROM icu1"); - is($ret, 0, 'SELECT should succeed.'); - like($err, $err_like, $err_comm); -} - -$node->safe_psql('postgres', 'CREATE TABLE icu1(val text);'); -$node->safe_psql('postgres', 'CREATE INDEX icu1_fr ON icu1 (val COLLATE "fr-x-icu");'); - -test_index(qr/^$/, 'No warning should be raised'); - -# Simulate different collation version -$node->safe_psql('postgres', - "UPDATE pg_depend SET refobjversion = 'not_a_version'" - . " WHERE refobjversion IS NOT NULL" - . " AND objid::regclass::text = 'icu1_fr';"); - -test_index(qr/index "icu1_fr" depends on collation "fr-x-icu" version "not_a_version", but the current version is/, - 'Different collation version warning should be raised.'); - -$node->safe_psql('postgres', 'ALTER INDEX icu1_fr ALTER COLLATION "fr-x-icu" REFRESH VERSION;'); - -test_index(qr/^$/, 'No warning should be raised'); - -# Simulate different collation version -$node->safe_psql('postgres', - "UPDATE pg_depend SET refobjversion = 'not_a_version'" - . " WHERE refobjversion IS NOT NULL" - . " AND objid::regclass::text = 'icu1_fr';"); - -test_index(qr/index "icu1_fr" depends on collation "fr-x-icu" version "not_a_version", but the current version is/, - 'Different collation version warning should be raised.'); - -$node->safe_psql('postgres', 'REINDEX TABLE icu1;'); - -test_index(qr/^$/, 'No warning should be raised'); - -$node->stop; diff --git a/src/test/regress/expected/collate.icu.utf8.out b/src/test/regress/expected/collate.icu.utf8.out index faf99f76b54..70133df8042 100644 --- a/src/test/regress/expected/collate.icu.utf8.out +++ b/src/test/regress/expected/collate.icu.utf8.out @@ -1082,6 +1082,9 @@ SELECT collname FROM pg_collation WHERE collname LIKE 'test%'; DROP SCHEMA test_schema; DROP ROLE regress_test_role; +-- ALTER +ALTER COLLATION "en-x-icu" REFRESH VERSION; +NOTICE: version has not changed -- dependencies CREATE COLLATION test0 FROM "C"; CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0); @@ -1947,184 +1950,6 @@ SELECT (SELECT count(*) FROM test33_0) <> (SELECT count(*) FROM test33_1); t (1 row) --- collation versioning support -CREATE TYPE t_en_fr AS (fr text COLLATE "fr-x-icu", en text COLLATE "en-x-icu"); -CREATE DOMAIN d_en_fr AS t_en_fr; -CREATE DOMAIN d_es AS text COLLATE "es-x-icu"; -CREATE TYPE t_en_fr_ga AS (en_fr t_en_fr, ga text COLLATE "ga-x-icu"); -CREATE DOMAIN d_en_fr_ga AS t_en_fr_ga; -CREATE TYPE t_custom AS (meh text, meh2 text); -CREATE DOMAIN d_custom AS t_custom; -CREATE COLLATION custom ( - LOCALE = 'fr-x-icu', PROVIDER = 'icu' -); -CREATE TYPE myrange AS range (subtype = text, collation = "POSIX"); -CREATE TYPE myrange_en_fr_ga AS range(subtype = t_en_fr_ga); -CREATE TABLE collate_test ( - id integer, - val text COLLATE "fr-x-icu", - t_en_fr t_en_fr, - d_en_fr d_en_fr, - d_es d_es, - t_en_fr_ga t_en_fr_ga, - d_en_fr_ga d_en_fr_ga, - d_en_fr_ga_arr d_en_fr_ga[], - myrange myrange, - myrange_en_fr_ga myrange_en_fr_ga -); -CREATE INDEX icuidx00_val ON collate_test(val); --- shouldn't get duplicated dependencies -CREATE INDEX icuidx00_val_val ON collate_test(val, val); --- shouldn't track version -CREATE INDEX icuidx00_val_pattern ON collate_test(val text_pattern_ops); --- should have single dependency, no version -CREATE INDEX icuidx00_val_pattern_val_pattern ON collate_test(val text_pattern_ops, val text_pattern_ops); --- should have single dependency, with version -CREATE INDEX icuidx00_val_pattern_val ON collate_test(val text_pattern_ops, val); --- should have single dependency, with version -CREATE INDEX icuidx00_val_val_pattern ON collate_test(val, val text_pattern_ops); --- two rows expected, only one a version, because we don't try to merge these yet -CREATE INDEX icuidx00_val_pattern_where ON collate_test(val text_pattern_ops) WHERE val >= val; --- two rows expected with version, because we don't try to merge these yet -CREATE INDEX icuidx00_val_where ON collate_test(val) WHERE val >= val; --- two rows expected with version (expression walker + attribute) -CREATE INDEX icuidx00_val_pattern_expr ON collate_test(val varchar_pattern_ops, (val || val)); --- two rows expected, one with a version (expression walker + attribute) -CREATE INDEX icuidx00_val_pattern_expr_pattern ON collate_test(val varchar_pattern_ops, (val || val) text_pattern_ops); --- should have single dependency, with version tracked -CREATE INDEX icuidx01_t_en_fr__d_es ON collate_test (t_en_fr, d_es); -CREATE INDEX icuidx02_d_en_fr ON collate_test (d_en_fr); -CREATE INDEX icuidx03_t_en_fr_ga ON collate_test (t_en_fr_ga); -CREATE INDEX icuidx04_d_en_fr_ga ON collate_test (d_en_fr_ga); -CREATE INDEX icuidx05_d_en_fr_ga_arr ON collate_test (d_en_fr_ga_arr); -CREATE INDEX icuidx06_d_en_fr_ga ON collate_test(id) WHERE (d_en_fr_ga).en_fr.fr = 'foo'; -CREATE INDEX icuidx07_d_en_fr_ga ON collate_test(id) WHERE (d_en_fr_ga).ga = 'foo'; -CREATE INDEX icuidx08_d_en_fr_ga ON collate_test(id) WHERE (t_en_fr_ga) = ('foo', 'bar', 'baz'); -CREATE INDEX icuidx09_d_en_fr_ga ON collate_test(id) WHERE (d_en_fr_ga) = ('foo', 'bar', 'baz'); -CREATE INDEX icuidx10_d_en_fr_ga_es ON collate_test(id) WHERE (d_en_fr_ga) = ('foo', 'bar', 'baz' COLLATE "es-x-icu"); -CREATE INDEX icuidx11_d_es ON collate_test(id) WHERE (d_es) = ('foo'); -CREATE INDEX icuidx12_custom ON collate_test(id) WHERE ('foo', 'bar')::d_custom = ('foo', 'bar' COLLATE custom)::d_custom; -CREATE INDEX icuidx13_custom ON collate_test(id) WHERE ('foo' COLLATE custom, 'bar')::d_custom = ('foo', 'bar')::d_custom; -CREATE INDEX icuidx14_myrange ON collate_test(myrange); -CREATE INDEX icuidx15_myrange_en_fr_ga ON collate_test USING gist (myrange_en_fr_ga); -CREATE TABLE collate_part(id integer, val text COLLATE "en-x-icu") PARTITION BY range(id); -CREATE TABLE collate_part_0 PARTITION OF collate_part FOR VALUES FROM (0) TO (1); -CREATE TABLE collate_part_1 PARTITION OF collate_part FOR VALUES FROM (1) TO (1000000); -CREATE INDEX icuidx17_part ON collate_part_1 (val); -SELECT objid::regclass::text collate "C", refobjid::regcollation::text collate "C", -CASE -WHEN refobjid = 'default'::regcollation THEN 'XXX' -- depends on libc version support -WHEN refobjversion IS NULL THEN 'version not tracked' -WHEN refobjversion = pg_collation_actual_version(refobjid) THEN 'up to date' -ELSE 'out of date' -END AS version -FROM pg_depend d -LEFT JOIN pg_class c ON c.oid = d.objid -WHERE refclassid = 'pg_collation'::regclass -AND coalesce(relkind, 'i') = 'i' -AND relname LIKE 'icuidx%' -ORDER BY 1, 2, 3; - objid | refobjid | version ------------------------------------+------------+--------------------- - icuidx00_val | "fr-x-icu" | up to date - icuidx00_val_pattern | "fr-x-icu" | version not tracked - icuidx00_val_pattern_expr | "fr-x-icu" | up to date - icuidx00_val_pattern_expr | "fr-x-icu" | up to date - icuidx00_val_pattern_expr_pattern | "fr-x-icu" | up to date - icuidx00_val_pattern_expr_pattern | "fr-x-icu" | version not tracked - icuidx00_val_pattern_val | "fr-x-icu" | up to date - icuidx00_val_pattern_val_pattern | "fr-x-icu" | version not tracked - icuidx00_val_pattern_where | "fr-x-icu" | up to date - icuidx00_val_pattern_where | "fr-x-icu" | version not tracked - icuidx00_val_val | "fr-x-icu" | up to date - icuidx00_val_val_pattern | "fr-x-icu" | up to date - icuidx00_val_where | "fr-x-icu" | up to date - icuidx00_val_where | "fr-x-icu" | up to date - icuidx01_t_en_fr__d_es | "en-x-icu" | up to date - icuidx01_t_en_fr__d_es | "es-x-icu" | up to date - icuidx01_t_en_fr__d_es | "fr-x-icu" | up to date - icuidx02_d_en_fr | "en-x-icu" | up to date - icuidx02_d_en_fr | "fr-x-icu" | up to date - icuidx03_t_en_fr_ga | "en-x-icu" | up to date - icuidx03_t_en_fr_ga | "fr-x-icu" | up to date - icuidx03_t_en_fr_ga | "ga-x-icu" | up to date - icuidx04_d_en_fr_ga | "en-x-icu" | up to date - icuidx04_d_en_fr_ga | "fr-x-icu" | up to date - icuidx04_d_en_fr_ga | "ga-x-icu" | up to date - icuidx05_d_en_fr_ga_arr | "en-x-icu" | up to date - icuidx05_d_en_fr_ga_arr | "fr-x-icu" | up to date - icuidx05_d_en_fr_ga_arr | "ga-x-icu" | up to date - icuidx06_d_en_fr_ga | "fr-x-icu" | up to date - icuidx07_d_en_fr_ga | "ga-x-icu" | up to date - icuidx10_d_en_fr_ga_es | "es-x-icu" | up to date - icuidx11_d_es | "es-x-icu" | up to date - icuidx12_custom | custom | up to date - icuidx13_custom | custom | up to date - icuidx15_myrange_en_fr_ga | "en-x-icu" | up to date - icuidx15_myrange_en_fr_ga | "fr-x-icu" | up to date - icuidx15_myrange_en_fr_ga | "ga-x-icu" | up to date - icuidx17_part | "en-x-icu" | up to date -(38 rows) - --- Validate that REINDEX will update the stored version. -UPDATE pg_depend SET refobjversion = 'not a version' -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text LIKE 'icuidx%' -AND refobjversion IS NOT NULL; -REINDEX TABLE collate_test; -REINDEX TABLE collate_part_0; -REINDEX TABLE collate_part_1; -SELECT objid::regclass FROM pg_depend WHERE refobjversion = 'not a version'; - objid -------- -(0 rows) - --- Validate that REINDEX CONCURRENTLY will update the stored version. -UPDATE pg_depend SET refobjversion = 'not a version' -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text LIKE 'icuidx%' -AND refobjversion IS NOT NULL; -REINDEX TABLE CONCURRENTLY collate_test; -REINDEX TABLE CONCURRENTLY collate_part_0; -REINDEX INDEX CONCURRENTLY icuidx17_part; -SELECT objid::regclass FROM pg_depend WHERE refobjversion = 'not a version'; - objid -------- -(0 rows) - --- Validate that VACUUM FULL will update the stored version. -UPDATE pg_depend SET refobjversion = 'not a version' -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text LIKE 'icuidx%' -AND refobjversion IS NOT NULL; -VACUUM FULL collate_test; -VACUUM FULL collate_part_0; -VACUUM FULL collate_part_1; -SELECT objid::regclass FROM pg_depend WHERE refobjversion = 'not a version'; - objid -------- -(0 rows) - --- Test ALTER INDEX name ALTER COLLATION name REFRESH VERSION -UPDATE pg_depend SET refobjversion = 'not a version' -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text = 'icuidx17_part' -AND refobjversion IS NOT NULL; -SELECT objid::regclass FROM pg_depend WHERE refobjversion = 'not a version'; - objid ---------------- - icuidx17_part -(1 row) - -ALTER INDEX icuidx17_part ALTER COLLATION "en-x-icu" REFRESH VERSION; -SELECT objid::regclass, refobjversion = 'not a version' AS ver FROM pg_depend -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text = 'icuidx17_part'; - objid | ver ----------------+----- - icuidx17_part | f -(1 row) - -- cleanup RESET search_path; SET client_min_messages TO warning; @@ -2132,17 +1957,3 @@ DROP SCHEMA collate_tests CASCADE; RESET client_min_messages; -- leave a collation for pg_upgrade test CREATE COLLATION coll_icu_upgrade FROM "und-x-icu"; --- Test user-visible function for inspecting versions -SELECT pg_collation_actual_version('"en-x-icu"'::regcollation) is not null; - ?column? ----------- - t -(1 row) - --- Invalid OIDs are silently ignored -SELECT pg_collation_actual_version(0) is null; - ?column? ----------- - t -(1 row) - diff --git a/src/test/regress/expected/collate.linux.utf8.out b/src/test/regress/expected/collate.linux.utf8.out index 580b00eea79..f06ae543e49 100644 --- a/src/test/regress/expected/collate.linux.utf8.out +++ b/src/test/regress/expected/collate.linux.utf8.out @@ -1093,6 +1093,9 @@ SELECT collname FROM pg_collation WHERE collname LIKE 'test%'; DROP SCHEMA test_schema; DROP ROLE regress_test_role; +-- ALTER +ALTER COLLATION "en_US" REFRESH VERSION; +NOTICE: version has not changed -- dependencies CREATE COLLATION test0 FROM "C"; CREATE TABLE collate_dep_test1 (a int, b text COLLATE test0); diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index 7f8f91b92c6..49f2a158c1f 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -2026,10 +2026,10 @@ REINDEX TABLE concur_reindex_tab; -- notice NOTICE: table "concur_reindex_tab" has no indexes to reindex REINDEX (CONCURRENTLY) TABLE concur_reindex_tab; -- notice NOTICE: table "concur_reindex_tab" has no indexes that can be reindexed concurrently -ALTER TABLE concur_reindex_tab ADD COLUMN c2 text COLLATE "C"; -- add toast index +ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index -- Normal index with integer column CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1); --- Normal index with text column (with unversioned collation) +-- Normal index with text column CREATE INDEX concur_reindex_ind2 ON concur_reindex_tab(c2); -- UNIQUE index with expression CREATE UNIQUE INDEX concur_reindex_ind3 ON concur_reindex_tab(abs(c1)); @@ -2483,7 +2483,7 @@ WARNING: cannot reindex system catalogs concurrently, skipping all Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- c1 | integer | | not null | - c2 | text | C | | + c2 | text | | | Indexes: "concur_reindex_ind1" PRIMARY KEY, btree (c1) "concur_reindex_ind2" btree (c2) diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out index 9ebe28a78da..a67f40198a4 100644 --- a/src/test/regress/expected/misc_sanity.out +++ b/src/test/regress/expected/misc_sanity.out @@ -18,8 +18,8 @@ WHERE refclassid = 0 OR refobjid = 0 OR deptype NOT IN ('a', 'e', 'i', 'n', 'p') OR (deptype != 'p' AND (classid = 0 OR objid = 0)) OR (deptype = 'p' AND (classid != 0 OR objid != 0 OR objsubid != 0)); - classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype | refobjversion ----------+-------+----------+------------+----------+-------------+---------+--------------- + classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype +---------+-------+----------+------------+----------+-------------+--------- (0 rows) -- **************** pg_shdepend **************** diff --git a/src/test/regress/sql/collate.icu.utf8.sql b/src/test/regress/sql/collate.icu.utf8.sql index 4c71f4d249e..9cee3d0042b 100644 --- a/src/test/regress/sql/collate.icu.utf8.sql +++ b/src/test/regress/sql/collate.icu.utf8.sql @@ -405,6 +405,11 @@ DROP SCHEMA test_schema; DROP ROLE regress_test_role; +-- ALTER + +ALTER COLLATION "en-x-icu" REFRESH VERSION; + + -- dependencies CREATE COLLATION test0 FROM "C"; @@ -742,134 +747,6 @@ INSERT INTO test33 VALUES (2, 'DEF'); -- they end up in the same partition (but it's platform-dependent which one) SELECT (SELECT count(*) FROM test33_0) <> (SELECT count(*) FROM test33_1); --- collation versioning support -CREATE TYPE t_en_fr AS (fr text COLLATE "fr-x-icu", en text COLLATE "en-x-icu"); -CREATE DOMAIN d_en_fr AS t_en_fr; -CREATE DOMAIN d_es AS text COLLATE "es-x-icu"; -CREATE TYPE t_en_fr_ga AS (en_fr t_en_fr, ga text COLLATE "ga-x-icu"); -CREATE DOMAIN d_en_fr_ga AS t_en_fr_ga; -CREATE TYPE t_custom AS (meh text, meh2 text); -CREATE DOMAIN d_custom AS t_custom; - -CREATE COLLATION custom ( - LOCALE = 'fr-x-icu', PROVIDER = 'icu' -); - -CREATE TYPE myrange AS range (subtype = text, collation = "POSIX"); -CREATE TYPE myrange_en_fr_ga AS range(subtype = t_en_fr_ga); - -CREATE TABLE collate_test ( - id integer, - val text COLLATE "fr-x-icu", - t_en_fr t_en_fr, - d_en_fr d_en_fr, - d_es d_es, - t_en_fr_ga t_en_fr_ga, - d_en_fr_ga d_en_fr_ga, - d_en_fr_ga_arr d_en_fr_ga[], - myrange myrange, - myrange_en_fr_ga myrange_en_fr_ga -); - -CREATE INDEX icuidx00_val ON collate_test(val); --- shouldn't get duplicated dependencies -CREATE INDEX icuidx00_val_val ON collate_test(val, val); --- shouldn't track version -CREATE INDEX icuidx00_val_pattern ON collate_test(val text_pattern_ops); --- should have single dependency, no version -CREATE INDEX icuidx00_val_pattern_val_pattern ON collate_test(val text_pattern_ops, val text_pattern_ops); --- should have single dependency, with version -CREATE INDEX icuidx00_val_pattern_val ON collate_test(val text_pattern_ops, val); --- should have single dependency, with version -CREATE INDEX icuidx00_val_val_pattern ON collate_test(val, val text_pattern_ops); --- two rows expected, only one a version, because we don't try to merge these yet -CREATE INDEX icuidx00_val_pattern_where ON collate_test(val text_pattern_ops) WHERE val >= val; --- two rows expected with version, because we don't try to merge these yet -CREATE INDEX icuidx00_val_where ON collate_test(val) WHERE val >= val; --- two rows expected with version (expression walker + attribute) -CREATE INDEX icuidx00_val_pattern_expr ON collate_test(val varchar_pattern_ops, (val || val)); --- two rows expected, one with a version (expression walker + attribute) -CREATE INDEX icuidx00_val_pattern_expr_pattern ON collate_test(val varchar_pattern_ops, (val || val) text_pattern_ops); --- should have single dependency, with version tracked -CREATE INDEX icuidx01_t_en_fr__d_es ON collate_test (t_en_fr, d_es); -CREATE INDEX icuidx02_d_en_fr ON collate_test (d_en_fr); -CREATE INDEX icuidx03_t_en_fr_ga ON collate_test (t_en_fr_ga); -CREATE INDEX icuidx04_d_en_fr_ga ON collate_test (d_en_fr_ga); -CREATE INDEX icuidx05_d_en_fr_ga_arr ON collate_test (d_en_fr_ga_arr); -CREATE INDEX icuidx06_d_en_fr_ga ON collate_test(id) WHERE (d_en_fr_ga).en_fr.fr = 'foo'; -CREATE INDEX icuidx07_d_en_fr_ga ON collate_test(id) WHERE (d_en_fr_ga).ga = 'foo'; -CREATE INDEX icuidx08_d_en_fr_ga ON collate_test(id) WHERE (t_en_fr_ga) = ('foo', 'bar', 'baz'); -CREATE INDEX icuidx09_d_en_fr_ga ON collate_test(id) WHERE (d_en_fr_ga) = ('foo', 'bar', 'baz'); -CREATE INDEX icuidx10_d_en_fr_ga_es ON collate_test(id) WHERE (d_en_fr_ga) = ('foo', 'bar', 'baz' COLLATE "es-x-icu"); -CREATE INDEX icuidx11_d_es ON collate_test(id) WHERE (d_es) = ('foo'); -CREATE INDEX icuidx12_custom ON collate_test(id) WHERE ('foo', 'bar')::d_custom = ('foo', 'bar' COLLATE custom)::d_custom; -CREATE INDEX icuidx13_custom ON collate_test(id) WHERE ('foo' COLLATE custom, 'bar')::d_custom = ('foo', 'bar')::d_custom; -CREATE INDEX icuidx14_myrange ON collate_test(myrange); -CREATE INDEX icuidx15_myrange_en_fr_ga ON collate_test USING gist (myrange_en_fr_ga); - -CREATE TABLE collate_part(id integer, val text COLLATE "en-x-icu") PARTITION BY range(id); -CREATE TABLE collate_part_0 PARTITION OF collate_part FOR VALUES FROM (0) TO (1); -CREATE TABLE collate_part_1 PARTITION OF collate_part FOR VALUES FROM (1) TO (1000000); -CREATE INDEX icuidx17_part ON collate_part_1 (val); - -SELECT objid::regclass::text collate "C", refobjid::regcollation::text collate "C", -CASE -WHEN refobjid = 'default'::regcollation THEN 'XXX' -- depends on libc version support -WHEN refobjversion IS NULL THEN 'version not tracked' -WHEN refobjversion = pg_collation_actual_version(refobjid) THEN 'up to date' -ELSE 'out of date' -END AS version -FROM pg_depend d -LEFT JOIN pg_class c ON c.oid = d.objid -WHERE refclassid = 'pg_collation'::regclass -AND coalesce(relkind, 'i') = 'i' -AND relname LIKE 'icuidx%' -ORDER BY 1, 2, 3; - --- Validate that REINDEX will update the stored version. -UPDATE pg_depend SET refobjversion = 'not a version' -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text LIKE 'icuidx%' -AND refobjversion IS NOT NULL; - -REINDEX TABLE collate_test; -REINDEX TABLE collate_part_0; -REINDEX TABLE collate_part_1; - -SELECT objid::regclass FROM pg_depend WHERE refobjversion = 'not a version'; - --- Validate that REINDEX CONCURRENTLY will update the stored version. -UPDATE pg_depend SET refobjversion = 'not a version' -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text LIKE 'icuidx%' -AND refobjversion IS NOT NULL; -REINDEX TABLE CONCURRENTLY collate_test; -REINDEX TABLE CONCURRENTLY collate_part_0; -REINDEX INDEX CONCURRENTLY icuidx17_part; - -SELECT objid::regclass FROM pg_depend WHERE refobjversion = 'not a version'; - --- Validate that VACUUM FULL will update the stored version. -UPDATE pg_depend SET refobjversion = 'not a version' -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text LIKE 'icuidx%' -AND refobjversion IS NOT NULL; -VACUUM FULL collate_test; -VACUUM FULL collate_part_0; -VACUUM FULL collate_part_1; - -SELECT objid::regclass FROM pg_depend WHERE refobjversion = 'not a version'; - --- Test ALTER INDEX name ALTER COLLATION name REFRESH VERSION -UPDATE pg_depend SET refobjversion = 'not a version' -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text = 'icuidx17_part' -AND refobjversion IS NOT NULL; -SELECT objid::regclass FROM pg_depend WHERE refobjversion = 'not a version'; -ALTER INDEX icuidx17_part ALTER COLLATION "en-x-icu" REFRESH VERSION; -SELECT objid::regclass, refobjversion = 'not a version' AS ver FROM pg_depend -WHERE refclassid = 'pg_collation'::regclass -AND objid::regclass::text = 'icuidx17_part'; -- cleanup RESET search_path; @@ -879,8 +756,3 @@ RESET client_min_messages; -- leave a collation for pg_upgrade test CREATE COLLATION coll_icu_upgrade FROM "und-x-icu"; - --- Test user-visible function for inspecting versions -SELECT pg_collation_actual_version('"en-x-icu"'::regcollation) is not null; --- Invalid OIDs are silently ignored -SELECT pg_collation_actual_version(0) is null; diff --git a/src/test/regress/sql/collate.linux.utf8.sql b/src/test/regress/sql/collate.linux.utf8.sql index c697c994880..cbbd2203e41 100644 --- a/src/test/regress/sql/collate.linux.utf8.sql +++ b/src/test/regress/sql/collate.linux.utf8.sql @@ -406,6 +406,11 @@ DROP SCHEMA test_schema; DROP ROLE regress_test_role; +-- ALTER + +ALTER COLLATION "en_US" REFRESH VERSION; + + -- dependencies CREATE COLLATION test0 FROM "C"; diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql index 51c9a121514..8bc76f7c6f1 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -797,10 +797,10 @@ CREATE TABLE concur_reindex_tab (c1 int); -- REINDEX REINDEX TABLE concur_reindex_tab; -- notice REINDEX (CONCURRENTLY) TABLE concur_reindex_tab; -- notice -ALTER TABLE concur_reindex_tab ADD COLUMN c2 text COLLATE "C"; -- add toast index +ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index -- Normal index with integer column CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1); --- Normal index with text column (with unversioned collation) +-- Normal index with text column CREATE INDEX concur_reindex_ind2 ON concur_reindex_tab(c2); -- UNIQUE index with expression CREATE UNIQUE INDEX concur_reindex_ind3 ON concur_reindex_tab(abs(c1)); |