]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Make equalTupleDescs() compare attlen/attbyval/attalign rather than
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 14 Apr 2005 22:35:12 +0000 (22:35 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 14 Apr 2005 22:35:12 +0000 (22:35 +0000)
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.

src/backend/access/common/tupdesc.c

index bc79ec29ffcd978bb6a668ba72898dead8a14307..a3cfcd3ccbe8bbd1d77e5458adda4053c285f674 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.108 2004/12/31 21:59:07 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.108.4.1 2005/04/14 22:35:12 tgl Exp $
  *
  * NOTES
  *       some of the executor utility code such as "ExecTypeFromTL" should be
@@ -290,10 +290,15 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
 
                /*
                 * We do not need to check every single field here: we can
-                * disregard attrelid, attnum (it was used to place the row in the
-                * attrs array) and everything derived from the column datatype.
-                * Also, attcacheoff must NOT be checked since it's possibly not
-                * set in both copies.
+                * disregard attrelid and attnum (which were used to place the row
+                * in the attrs array in the first place).  It might look like we
+                * could dispense with checking attlen/attbyval/attalign, since these
+                * 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)
                        return false;
@@ -301,12 +306,18 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
                        return false;
                if (attr1->attstattarget != attr2->attstattarget)
                        return false;
+               if (attr1->attlen != attr2->attlen)
+                       return false;
                if (attr1->attndims != attr2->attndims)
                        return false;
                if (attr1->atttypmod != attr2->atttypmod)
                        return false;
+               if (attr1->attbyval != attr2->attbyval)
+                       return false;
                if (attr1->attstorage != attr2->attstorage)
                        return false;
+               if (attr1->attalign != attr2->attalign)
+                       return false;
                if (attr1->attnotnull != attr2->attnotnull)
                        return false;
                if (attr1->atthasdef != attr2->atthasdef)