Commit 8e144080 authored by Tom Lane's avatar Tom Lane

Make equalTupleDescs() compare attlen/attbyval/attalign rather than

assuming comparison of atttypid is sufficient.  In a dropped column
atttypid will be 0, and we'd better check the physical-storage data
to make sure the tupdescs are physically compatible.
I do not believe there is a real risk before 8.0, since before that
we only used this routine to compare successive states of the tupdesc
for a particular relation.  But 8.0's typcache.c might be comparing
arbitrary tupdescs so we'd better play it safer.
parent 0453a997
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.110 2005/03/31 22:46:04 tgl Exp $ * $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.111 2005/04/14 22:34:48 tgl Exp $
* *
* NOTES * NOTES
* some of the executor utility code such as "ExecTypeFromTL" should be * some of the executor utility code such as "ExecTypeFromTL" should be
...@@ -274,10 +274,15 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) ...@@ -274,10 +274,15 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
/* /*
* We do not need to check every single field here: we can * We do not need to check every single field here: we can
* disregard attrelid, attnum (it was used to place the row in the * disregard attrelid and attnum (which were used to place the row
* attrs array) and everything derived from the column datatype. * in the attrs array in the first place). It might look like we
* Also, attcacheoff must NOT be checked since it's possibly not * could dispense with checking attlen/attbyval/attalign, since these
* set in both copies. * are derived from atttypid; but in the case of dropped columns
* we must check them (since atttypid will be zero for all dropped
* columns) and in general it seems safer to check them always.
*
* attcacheoff must NOT be checked since it's possibly not set
* in both copies.
*/ */
if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0) if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0)
return false; return false;
...@@ -285,12 +290,18 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) ...@@ -285,12 +290,18 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
return false; return false;
if (attr1->attstattarget != attr2->attstattarget) if (attr1->attstattarget != attr2->attstattarget)
return false; return false;
if (attr1->attlen != attr2->attlen)
return false;
if (attr1->attndims != attr2->attndims) if (attr1->attndims != attr2->attndims)
return false; return false;
if (attr1->atttypmod != attr2->atttypmod) if (attr1->atttypmod != attr2->atttypmod)
return false; return false;
if (attr1->attbyval != attr2->attbyval)
return false;
if (attr1->attstorage != attr2->attstorage) if (attr1->attstorage != attr2->attstorage)
return false; return false;
if (attr1->attalign != attr2->attalign)
return false;
if (attr1->attnotnull != attr2->attnotnull) if (attr1->attnotnull != attr2->attnotnull)
return false; return false;
if (attr1->atthasdef != attr2->atthasdef) if (attr1->atthasdef != attr2->atthasdef)
......
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