diff options
author | Robert Haas <rhaas@postgresql.org> | 2012-01-26 08:21:31 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2012-01-26 08:21:31 -0500 |
commit | 9d35116611e6a1fc10f2298944fbf0e4e1a826be (patch) | |
tree | e46a81e56c6ff83d1e4fd3d447823f4919f9ac43 /src | |
parent | 9f9135d129e915e72c8a2f770689fd72619ead49 (diff) | |
download | postgresql-9d35116611e6a1fc10f2298944fbf0e4e1a826be.tar.gz postgresql-9d35116611e6a1fc10f2298944fbf0e4e1a826be.zip |
Damage control for yesterday's CheckIndexCompatible changes.
Rip out a regression test that doesn't play well with settings put in
place by the build farm, and rewrite the code in CheckIndexCompatible
in a hopefully more transparent style.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/commands/indexcmds.c | 34 | ||||
-rw-r--r-- | src/test/regress/expected/alter_table.out | 9 | ||||
-rw-r--r-- | src/test/regress/sql/alter_table.sql | 8 |
3 files changed, 25 insertions, 26 deletions
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 1bf1de56f31..6c909298b7d 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -214,11 +214,20 @@ CheckIndexCompatible(Oid oldId, ReleaseSysCache(tuple); + if (!ret) + return false; + /* For polymorphic opcintype, column type changes break compatibility. */ irel = index_open(oldId, AccessShareLock); /* caller probably has a lock */ - for (i = 0; i < old_natts && ret; i++) - ret = (!IsPolymorphicType(get_opclass_input_type(classObjectId[i])) || - irel->rd_att->attrs[i]->atttypid == typeObjectId[i]); + for (i = 0; i < old_natts; i++) + { + if (IsPolymorphicType(get_opclass_input_type(classObjectId[i])) && + irel->rd_att->attrs[i]->atttypid != typeObjectId[i]) + { + ret = false; + break; + } + } /* Any change in exclusion operator selections breaks compatibility. */ if (ret && indexInfo->ii_ExclusionOps != NULL) @@ -231,14 +240,21 @@ CheckIndexCompatible(Oid oldId, old_natts * sizeof(Oid)) == 0; /* Require an exact input type match for polymorphic operators. */ - for (i = 0; i < old_natts && ret; i++) + if (ret) { - Oid left, - right; + for (i = 0; i < old_natts && ret; i++) + { + Oid left, + right; - op_input_types(indexInfo->ii_ExclusionOps[i], &left, &right); - ret = (!(IsPolymorphicType(left) || IsPolymorphicType(right)) || - irel->rd_att->attrs[i]->atttypid == typeObjectId[i]); + op_input_types(indexInfo->ii_ExclusionOps[i], &left, &right); + if ((IsPolymorphicType(left) || IsPolymorphicType(right)) && + irel->rd_att->attrs[i]->atttypid != typeObjectId[i]) + { + ret = false; + break; + } + } } } diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 41bfa857ddd..e9925495042 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -1665,15 +1665,6 @@ where oid = 'test_storage'::regclass; t (1 row) --- SET DATA TYPE without a rewrite -CREATE DOMAIN other_textarr AS text[]; -CREATE TABLE norewrite_array(c text[] PRIMARY KEY); -NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "norewrite_array_pkey" for table "norewrite_array" -SET client_min_messages = debug1; -ALTER TABLE norewrite_array ALTER c TYPE text[]; -- no work -ALTER TABLE norewrite_array ALTER c TYPE other_textarr; -- rebuild index -DEBUG: building index "norewrite_array_pkey" on table "norewrite_array" -RESET client_min_messages; -- -- lock levels -- diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 494c1504d78..d9bf08d6d50 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -1197,14 +1197,6 @@ select reltoastrelid <> 0 as has_toast_table from pg_class where oid = 'test_storage'::regclass; --- SET DATA TYPE without a rewrite -CREATE DOMAIN other_textarr AS text[]; -CREATE TABLE norewrite_array(c text[] PRIMARY KEY); -SET client_min_messages = debug1; -ALTER TABLE norewrite_array ALTER c TYPE text[]; -- no work -ALTER TABLE norewrite_array ALTER c TYPE other_textarr; -- rebuild index -RESET client_min_messages; - -- -- lock levels -- |