*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
* Otherwise we have to search for the matching column by name.
* There's no guarantee it'll have the same column position, because
* 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.
*/
- for (new_attno = 0; new_attno < newnatts; new_attno++)
+ 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
{
- att = new_tupdesc->attrs[new_attno];
- if (att->attisdropped || att->attinhcount == 0)
- continue;
- if (strcmp(attname, NameStr(att->attname)) != 0)
- continue;
- /* Found it, check type */
- if (atttypid != att->atttypid || atttypmod != att->atttypmod)
- elog(ERROR, "attribute \"%s\" of relation \"%s\" does not match parent's type",
+ for (new_attno = 0; new_attno < newnatts; new_attno++)
+ {
+ att = new_tupdesc->attrs[new_attno];
+ if (!att->attisdropped && att->attinhcount != 0 &&
+ strcmp(attname, NameStr(att->attname)) == 0)
+ break;
+ }
+ if (new_attno >= newnatts)
+ elog(ERROR, "could not find inherited attribute \"%s\" of relation \"%s\"",
attname, RelationGetRelationName(newrelation));
-
- numbers = lappend_int(numbers, new_attno + 1);
- vars = lappend(vars, makeVar(newvarno,
- (AttrNumber) (new_attno + 1),
- atttypid,
- atttypmod,
- 0));
- break;
}
- if (new_attno >= newnatts)
- elog(ERROR, "could not find inherited attribute \"%s\" of relation \"%s\"",
+ /* Found it, check type */
+ if (atttypid != att->atttypid || atttypmod != att->atttypmod)
+ elog(ERROR, "attribute \"%s\" of relation \"%s\" does not match parent's type",
attname, RelationGetRelationName(newrelation));
+
+ numbers = lappend_int(numbers, new_attno + 1);
+ vars = lappend(vars, makeVar(newvarno,
+ (AttrNumber) (new_attno + 1),
+ atttypid,
+ atttypmod,
+ 0));
}
*col_mappings = numbers;