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.
This commit is contained in:
Robert Haas 2012-01-26 08:21:31 -05:00
parent 9f9135d129
commit 9d35116611
3 changed files with 25 additions and 26 deletions

View File

@ -214,11 +214,20 @@ CheckIndexCompatible(Oid oldId,
ReleaseSysCache(tuple); ReleaseSysCache(tuple);
if (!ret)
return false;
/* For polymorphic opcintype, column type changes break compatibility. */ /* For polymorphic opcintype, column type changes break compatibility. */
irel = index_open(oldId, AccessShareLock); /* caller probably has a lock */ irel = index_open(oldId, AccessShareLock); /* caller probably has a lock */
for (i = 0; i < old_natts && ret; i++) for (i = 0; i < old_natts; i++)
ret = (!IsPolymorphicType(get_opclass_input_type(classObjectId[i])) || {
irel->rd_att->attrs[i]->atttypid == typeObjectId[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. */ /* Any change in exclusion operator selections breaks compatibility. */
if (ret && indexInfo->ii_ExclusionOps != NULL) if (ret && indexInfo->ii_ExclusionOps != NULL)
@ -231,14 +240,21 @@ CheckIndexCompatible(Oid oldId,
old_natts * sizeof(Oid)) == 0; old_natts * sizeof(Oid)) == 0;
/* Require an exact input type match for polymorphic operators. */ /* Require an exact input type match for polymorphic operators. */
for (i = 0; i < old_natts && ret; i++) if (ret)
{ {
Oid left, for (i = 0; i < old_natts && ret; i++)
right; {
Oid left,
right;
op_input_types(indexInfo->ii_ExclusionOps[i], &left, &right); op_input_types(indexInfo->ii_ExclusionOps[i], &left, &right);
ret = (!(IsPolymorphicType(left) || IsPolymorphicType(right)) || if ((IsPolymorphicType(left) || IsPolymorphicType(right)) &&
irel->rd_att->attrs[i]->atttypid == typeObjectId[i]); irel->rd_att->attrs[i]->atttypid != typeObjectId[i])
{
ret = false;
break;
}
}
} }
} }

View File

@ -1665,15 +1665,6 @@ where oid = 'test_storage'::regclass;
t t
(1 row) (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 -- lock levels
-- --

View File

@ -1197,14 +1197,6 @@ select reltoastrelid <> 0 as has_toast_table
from pg_class from pg_class
where oid = 'test_storage'::regclass; 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 -- lock levels
-- --