mirror of
https://github.com/postgres/postgres.git
synced 2025-07-14 08:21:07 +03:00
Provide hashing support for arrays.
The core of this patch is hash_array() and associated typcache infrastructure, which works just about exactly like the existing support for array comparison. In addition I did some work to ensure that the planner won't think that an array type is hashable unless its element type is hashable, and similarly for sorting. This includes adding a datatype parameter to op_hashjoinable and op_mergejoinable, and adding an explicit "hashable" flag to SortGroupClause. The lack of a cross-check on the element type was a pre-existing bug in mergejoin support --- but it didn't matter so much before, because if you couldn't sort the element type there wasn't any good alternative to failing anyhow. Now that we have the alternative of hashing the array type, there are cases where we can avoid a failure by being picky at the planner stage, so it's time to be picky. The issue of exactly how to combine the per-element hash values to produce an array hash is still open for discussion, but the rest of this is pretty solid, so I'll commit it as-is.
This commit is contained in:
@ -49,16 +49,18 @@ typedef struct TypeCacheEntry
|
||||
Oid lt_opr; /* the less-than operator */
|
||||
Oid gt_opr; /* the greater-than operator */
|
||||
Oid cmp_proc; /* the btree comparison function */
|
||||
Oid hash_proc; /* the hash calculation function */
|
||||
|
||||
/*
|
||||
* Pre-set-up fmgr call info for the equality operator and the btree
|
||||
* comparison function. These are kept in the type cache to avoid
|
||||
* problems with memory leaks in repeated calls to array_eq and array_cmp.
|
||||
* There is not currently a need to maintain call info for the lt_opr or
|
||||
* gt_opr.
|
||||
* Pre-set-up fmgr call info for the equality operator, the btree
|
||||
* comparison function, and the hash calculation function. These are kept
|
||||
* in the type cache to avoid problems with memory leaks in repeated calls
|
||||
* to array_eq, array_cmp, hash_array. There is not currently a need to
|
||||
* maintain call info for the lt_opr or gt_opr.
|
||||
*/
|
||||
FmgrInfo eq_opr_finfo;
|
||||
FmgrInfo cmp_proc_finfo;
|
||||
FmgrInfo hash_proc_finfo;
|
||||
|
||||
/*
|
||||
* Tuple descriptor if it's a composite type (row type). NULL if not
|
||||
@ -79,10 +81,13 @@ typedef struct TypeCacheEntry
|
||||
#define TYPECACHE_LT_OPR 0x0002
|
||||
#define TYPECACHE_GT_OPR 0x0004
|
||||
#define TYPECACHE_CMP_PROC 0x0008
|
||||
#define TYPECACHE_EQ_OPR_FINFO 0x0010
|
||||
#define TYPECACHE_CMP_PROC_FINFO 0x0020
|
||||
#define TYPECACHE_TUPDESC 0x0040
|
||||
#define TYPECACHE_BTREE_OPFAMILY 0x0080
|
||||
#define TYPECACHE_HASH_PROC 0x0010
|
||||
#define TYPECACHE_EQ_OPR_FINFO 0x0020
|
||||
#define TYPECACHE_CMP_PROC_FINFO 0x0040
|
||||
#define TYPECACHE_HASH_PROC_FINFO 0x0080
|
||||
#define TYPECACHE_TUPDESC 0x0100
|
||||
#define TYPECACHE_BTREE_OPFAMILY 0x0200
|
||||
#define TYPECACHE_HASH_OPFAMILY 0x0400
|
||||
|
||||
extern TypeCacheEntry *lookup_type_cache(Oid type_id, int flags);
|
||||
|
||||
|
Reference in New Issue
Block a user