On Tue, Feb 6, 2024 at 8:59 PM Peter Eisentraut <pe...@eisentraut.org> wrote: > > In a recent patch thread it was discussed[0] which fields should be > compared by equalTupleDescs() and whether it is ok to remove a field > from tuple descriptors and how that should affect their equality > (attstattarget in that case). > > After analyzing all the callers, I have noticed that there are two > classes of callers of equalTupleDescs(): > > The first want to compare what I call row-type equality, which means > they want to check specifically for equal number of attributes, and the > same attribute names, types, and typmods for each attribute. Most > callers actually want that behavior. The remaining callers just want to > compare the tuple descriptors as they are, they don't care why the > fields are in there, they just want to compare all of them. > > In the attached patch, I add a new function equalRowTypes() that is > effectively a subset of equalTupleDescs() and switch most callers to that. > > The purpose of this patch is to make the semantics less uncertain. > Questions like the one in [0] about attstattarget now have a clear > answer for both functions. I think this would be useful to have, as we > are thinking about more changes in pg_attribute and tuple descriptors. > > > [0]: > https://www.postgresql.org/message-id/202401101316.k4s3fomwjx52@alvherre.pgsql
function name record_type_typmod_hash imply that hashRowType should also hash atttypmod field? also: bool equalRowTypes(TupleDesc tupdesc1, TupleDesc tupdesc2) { if (tupdesc1->natts != tupdesc2->natts) return false; if (tupdesc1->tdtypeid != tupdesc2->tdtypeid) return false; for (int i = 0; i < tupdesc1->natts; i++) { Form_pg_attribute attr1 = TupleDescAttr(tupdesc1, i); Form_pg_attribute attr2 = TupleDescAttr(tupdesc2, i); 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; } return true; } /* * hashRowType * * If two tuple descriptors would be considered equal by equalRowTypes() * then their hash value will be equal according to this function. */ uint32 hashRowType(TupleDesc desc) { uint32 s; int i; s = hash_combine(0, hash_uint32(desc->natts)); s = hash_combine(s, hash_uint32(desc->tdtypeid)); for (i = 0; i < desc->natts; ++i) s = hash_combine(s, hash_uint32(TupleDescAttr(desc, i)->atttypid)); return s; } from the hashRowType comment, should we also hash attname and atttypmod?