mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Refactor typcache.c's record typmod hash table.
Previously, tuple descriptors were stored in chains keyed by a fixed size array of OIDs. That meant there were effectively two levels of collision chain -- one inside and one outside the hash table. Instead, let dynahash.c look after conflicts for us by supplying a proper hash and equal function pair. This is a nice cleanup on its own, but also simplifies followup changes allowing blessed TupleDescs to be shared between backends participating in parallel query. Author: Thomas Munro Reviewed-By: Andres Freund Discussion: https://postgr.es/m/CAEepm%3D34GVhOL%2BarUx56yx7OPk7%3DqpGsv3CpO54feqjAwQKm5g%40mail.gmail.com
This commit is contained in:
@ -19,6 +19,7 @@
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#include "access/hash.h"
|
||||
#include "access/htup_details.h"
|
||||
#include "catalog/pg_collation.h"
|
||||
#include "catalog/pg_type.h"
|
||||
@ -26,6 +27,7 @@
|
||||
#include "parser/parse_type.h"
|
||||
#include "utils/acl.h"
|
||||
#include "utils/builtins.h"
|
||||
#include "utils/hashutils.h"
|
||||
#include "utils/resowner_private.h"
|
||||
#include "utils/syscache.h"
|
||||
|
||||
@ -443,6 +445,31 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* hashTupleDesc
|
||||
* Compute a hash value for a tuple descriptor.
|
||||
*
|
||||
* If two tuple descriptors would be considered equal by equalTupleDescs()
|
||||
* then their hash value will be equal according to this function.
|
||||
*
|
||||
* Note that currently contents of constraint are not hashed - it'd be a bit
|
||||
* painful to do so, and conflicts just due to constraints are unlikely.
|
||||
*/
|
||||
uint32
|
||||
hashTupleDesc(TupleDesc desc)
|
||||
{
|
||||
uint32 s;
|
||||
int i;
|
||||
|
||||
s = hash_combine(0, hash_uint32(desc->natts));
|
||||
s = hash_combine(s, hash_uint32(desc->tdtypeid));
|
||||
s = hash_combine(s, hash_uint32(desc->tdhasoid));
|
||||
for (i = 0; i < desc->natts; ++i)
|
||||
s = hash_combine(s, hash_uint32(TupleDescAttr(desc, i)->atttypid));
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
/*
|
||||
* TupleDescInitEntry
|
||||
* This function initializes a single attribute structure in
|
||||
|
Reference in New Issue
Block a user