Commit 925ca9d7 authored by Tom Lane's avatar Tom Lane

Tweak make_inh_translation_lists() to check the common case wherein parent and

child attnums are the same, before it grovels through each and every child
column looking for a name match.  Saves some time in large inheritance trees,
per example from Greg.
parent 402bd494
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.140 2007/03/17 00:11:04 tgl Exp $ * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepunion.c,v 1.141 2007/04/21 05:56:41 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -973,14 +973,31 @@ make_inh_translation_lists(Relation oldrelation, Relation newrelation, ...@@ -973,14 +973,31 @@ make_inh_translation_lists(Relation oldrelation, Relation newrelation,
* Otherwise we have to search for the matching column by name. * Otherwise we have to search for the matching column by name.
* There's no guarantee it'll have the same column position, because * There's no guarantee it'll have the same column position, because
* of cases like ALTER TABLE ADD COLUMN and multiple inheritance. * of cases like ALTER TABLE ADD COLUMN and multiple inheritance.
* However, in simple cases it will be the same column number, so
* try that before we go groveling through all the columns.
*
* Note: the test for (att = ...) != NULL cannot fail, it's just a
* notational device to include the assignment into the if-clause.
*/ */
if (old_attno < newnatts &&
(att = new_tupdesc->attrs[old_attno]) != NULL &&
!att->attisdropped && att->attinhcount != 0 &&
strcmp(attname, NameStr(att->attname)) == 0)
new_attno = old_attno;
else
{
for (new_attno = 0; new_attno < newnatts; new_attno++) for (new_attno = 0; new_attno < newnatts; new_attno++)
{ {
att = new_tupdesc->attrs[new_attno]; att = new_tupdesc->attrs[new_attno];
if (att->attisdropped || att->attinhcount == 0) if (!att->attisdropped && att->attinhcount != 0 &&
continue; strcmp(attname, NameStr(att->attname)) == 0)
if (strcmp(attname, NameStr(att->attname)) != 0) break;
continue; }
if (new_attno >= newnatts)
elog(ERROR, "could not find inherited attribute \"%s\" of relation \"%s\"",
attname, RelationGetRelationName(newrelation));
}
/* Found it, check type */ /* Found it, check type */
if (atttypid != att->atttypid || atttypmod != att->atttypmod) if (atttypid != att->atttypid || atttypmod != att->atttypmod)
elog(ERROR, "attribute \"%s\" of relation \"%s\" does not match parent's type", elog(ERROR, "attribute \"%s\" of relation \"%s\" does not match parent's type",
...@@ -992,12 +1009,6 @@ make_inh_translation_lists(Relation oldrelation, Relation newrelation, ...@@ -992,12 +1009,6 @@ make_inh_translation_lists(Relation oldrelation, Relation newrelation,
atttypid, atttypid,
atttypmod, atttypmod,
0)); 0));
break;
}
if (new_attno >= newnatts)
elog(ERROR, "could not find inherited attribute \"%s\" of relation \"%s\"",
attname, RelationGetRelationName(newrelation));
} }
*col_mappings = numbers; *col_mappings = numbers;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment