diff options
Diffstat (limited to 'src/backend/access/common/tupdesc.c')
-rw-r--r-- | src/backend/access/common/tupdesc.c | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c index 567fcab1cd8..b2af4ff932e 100644 --- a/src/backend/access/common/tupdesc.c +++ b/src/backend/access/common/tupdesc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.60 2000/01/26 05:55:53 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.61 2000/01/31 04:35:48 tgl Exp $ * * NOTES * some of the executor utility code such as "ExecTypeFromTL" should be @@ -226,6 +226,71 @@ FreeTupleDesc(TupleDesc tupdesc) } +bool +equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) +{ + int i; + + if (tupdesc1->natts != tupdesc2->natts) + return false; + for (i = 0; i < tupdesc1->natts; i++) + { + Form_pg_attribute attr1 = tupdesc1->attrs[i]; + Form_pg_attribute attr2 = tupdesc2->attrs[i]; + + /* We do not need to check every single field here, and in fact + * some fields such as attdisbursion probably shouldn't be compared. + */ + if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0) + return false; + if (attr1->atttypid != attr2->atttypid) + return false; + if (attr1->atttypmod != attr2->atttypmod) + return false; + if (attr1->attstorage != attr2->attstorage) + return false; + if (attr1->attnotnull != attr2->attnotnull) + return false; + } + if (tupdesc1->constr != NULL) + { + TupleConstr *constr1 = tupdesc1->constr; + TupleConstr *constr2 = tupdesc2->constr; + + if (constr2 == NULL) + return false; + if (constr1->num_defval != constr2->num_defval) + return false; + for (i = 0; i < (int) constr1->num_defval; i++) + { + AttrDefault *defval1 = constr1->defval + i; + AttrDefault *defval2 = constr2->defval + i; + + if (defval1->adnum != defval2->adnum) + return false; + if (strcmp(defval1->adbin, defval2->adbin) != 0) + return false; + } + if (constr1->num_check != constr2->num_check) + return false; + for (i = 0; i < (int) constr1->num_check; i++) + { + ConstrCheck *check1 = constr1->check + i; + ConstrCheck *check2 = constr2->check + i; + + if (strcmp(check1->ccname, check2->ccname) != 0) + return false; + if (strcmp(check1->ccbin, check2->ccbin) != 0) + return false; + } + if (constr1->has_not_null != constr2->has_not_null) + return false; + } + else if (tupdesc2->constr != NULL) + return false; + return true; +} + /* ---------------------------------------------------------------- * TupleDescInitEntry * |