@@ -79,22 +79,23 @@ static HTAB *TypeCacheHash = NULL;
79
79
static TypeCacheEntry * firstDomainTypeEntry = NULL ;
80
80
81
81
/* Private flag bits in the TypeCacheEntry.flags field */
82
- #define TCFLAGS_CHECKED_BTREE_OPCLASS 0x0001
83
- #define TCFLAGS_CHECKED_HASH_OPCLASS 0x0002
84
- #define TCFLAGS_CHECKED_EQ_OPR 0x0004
85
- #define TCFLAGS_CHECKED_LT_OPR 0x0008
86
- #define TCFLAGS_CHECKED_GT_OPR 0x0010
87
- #define TCFLAGS_CHECKED_CMP_PROC 0x0020
88
- #define TCFLAGS_CHECKED_HASH_PROC 0x0040
89
- #define TCFLAGS_CHECKED_ELEM_PROPERTIES 0x0080
90
- #define TCFLAGS_HAVE_ELEM_EQUALITY 0x0100
91
- #define TCFLAGS_HAVE_ELEM_COMPARE 0x0200
92
- #define TCFLAGS_HAVE_ELEM_HASHING 0x0400
93
- #define TCFLAGS_CHECKED_FIELD_PROPERTIES 0x0800
94
- #define TCFLAGS_HAVE_FIELD_EQUALITY 0x1000
95
- #define TCFLAGS_HAVE_FIELD_COMPARE 0x2000
96
- #define TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS 0x4000
97
- #define TCFLAGS_CHECKED_HASH_EXTENDED_PROC 0x8000
82
+ #define TCFLAGS_CHECKED_BTREE_OPCLASS 0x000001
83
+ #define TCFLAGS_CHECKED_HASH_OPCLASS 0x000002
84
+ #define TCFLAGS_CHECKED_EQ_OPR 0x000004
85
+ #define TCFLAGS_CHECKED_LT_OPR 0x000008
86
+ #define TCFLAGS_CHECKED_GT_OPR 0x000010
87
+ #define TCFLAGS_CHECKED_CMP_PROC 0x000020
88
+ #define TCFLAGS_CHECKED_HASH_PROC 0x000040
89
+ #define TCFLAGS_CHECKED_HASH_EXTENDED_PROC 0x000080
90
+ #define TCFLAGS_CHECKED_ELEM_PROPERTIES 0x000100
91
+ #define TCFLAGS_HAVE_ELEM_EQUALITY 0x000200
92
+ #define TCFLAGS_HAVE_ELEM_COMPARE 0x000400
93
+ #define TCFLAGS_HAVE_ELEM_HASHING 0x000800
94
+ #define TCFLAGS_HAVE_ELEM_EXTENDED_HASHING 0x001000
95
+ #define TCFLAGS_CHECKED_FIELD_PROPERTIES 0x002000
96
+ #define TCFLAGS_HAVE_FIELD_EQUALITY 0x004000
97
+ #define TCFLAGS_HAVE_FIELD_COMPARE 0x008000
98
+ #define TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS 0x010000
98
99
99
100
/*
100
101
* Data stored about a domain type's constraints. Note that we do not create
@@ -273,6 +274,7 @@ static List *prep_domain_constraints(List *constraints, MemoryContext execctx);
273
274
static bool array_element_has_equality (TypeCacheEntry * typentry );
274
275
static bool array_element_has_compare (TypeCacheEntry * typentry );
275
276
static bool array_element_has_hashing (TypeCacheEntry * typentry );
277
+ static bool array_element_has_extended_hashing (TypeCacheEntry * typentry );
276
278
static void cache_array_element_properties (TypeCacheEntry * typentry );
277
279
static bool record_fields_have_equality (TypeCacheEntry * typentry );
278
280
static bool record_fields_have_compare (TypeCacheEntry * typentry );
@@ -451,8 +453,8 @@ lookup_type_cache(Oid type_id, int flags)
451
453
* eq_opr; if we already found one from the btree opclass, that
452
454
* decision is still good.
453
455
*/
454
- typentry -> flags &= ~(TCFLAGS_CHECKED_HASH_PROC );
455
- typentry -> flags &= ~( TCFLAGS_CHECKED_HASH_EXTENDED_PROC );
456
+ typentry -> flags &= ~(TCFLAGS_CHECKED_HASH_PROC |
457
+ TCFLAGS_CHECKED_HASH_EXTENDED_PROC );
456
458
typentry -> flags |= TCFLAGS_CHECKED_HASH_OPCLASS ;
457
459
}
458
460
@@ -500,8 +502,8 @@ lookup_type_cache(Oid type_id, int flags)
500
502
* equality operator. This is so we can ensure that the hash
501
503
* functions match the operator.
502
504
*/
503
- typentry -> flags &= ~(TCFLAGS_CHECKED_HASH_PROC );
504
- typentry -> flags &= ~( TCFLAGS_CHECKED_HASH_EXTENDED_PROC );
505
+ typentry -> flags &= ~(TCFLAGS_CHECKED_HASH_PROC |
506
+ TCFLAGS_CHECKED_HASH_EXTENDED_PROC );
505
507
typentry -> flags |= TCFLAGS_CHECKED_EQ_OPR ;
506
508
}
507
509
if ((flags & TYPECACHE_LT_OPR ) &&
@@ -637,10 +639,10 @@ lookup_type_cache(Oid type_id, int flags)
637
639
* we'll need more logic here to check that case too.
638
640
*/
639
641
if (hash_extended_proc == F_HASH_ARRAY_EXTENDED &&
640
- !array_element_has_hashing (typentry ))
642
+ !array_element_has_extended_hashing (typentry ))
641
643
hash_extended_proc = InvalidOid ;
642
644
643
- /* Force update of hash_proc_finfo only if we're changing state */
645
+ /* Force update of proc finfo only if we're changing state */
644
646
if (typentry -> hash_extended_proc != hash_extended_proc )
645
647
typentry -> hash_extended_proc_finfo .fn_oid = InvalidOid ;
646
648
@@ -1269,6 +1271,14 @@ array_element_has_hashing(TypeCacheEntry *typentry)
1269
1271
return (typentry -> flags & TCFLAGS_HAVE_ELEM_HASHING ) != 0 ;
1270
1272
}
1271
1273
1274
+ static bool
1275
+ array_element_has_extended_hashing (TypeCacheEntry * typentry )
1276
+ {
1277
+ if (!(typentry -> flags & TCFLAGS_CHECKED_ELEM_PROPERTIES ))
1278
+ cache_array_element_properties (typentry );
1279
+ return (typentry -> flags & TCFLAGS_HAVE_ELEM_EXTENDED_HASHING ) != 0 ;
1280
+ }
1281
+
1272
1282
static void
1273
1283
cache_array_element_properties (TypeCacheEntry * typentry )
1274
1284
{
@@ -1281,13 +1291,16 @@ cache_array_element_properties(TypeCacheEntry *typentry)
1281
1291
elementry = lookup_type_cache (elem_type ,
1282
1292
TYPECACHE_EQ_OPR |
1283
1293
TYPECACHE_CMP_PROC |
1284
- TYPECACHE_HASH_PROC );
1294
+ TYPECACHE_HASH_PROC |
1295
+ TYPECACHE_HASH_EXTENDED_PROC );
1285
1296
if (OidIsValid (elementry -> eq_opr ))
1286
1297
typentry -> flags |= TCFLAGS_HAVE_ELEM_EQUALITY ;
1287
1298
if (OidIsValid (elementry -> cmp_proc ))
1288
1299
typentry -> flags |= TCFLAGS_HAVE_ELEM_COMPARE ;
1289
1300
if (OidIsValid (elementry -> hash_proc ))
1290
1301
typentry -> flags |= TCFLAGS_HAVE_ELEM_HASHING ;
1302
+ if (OidIsValid (elementry -> hash_extended_proc ))
1303
+ typentry -> flags |= TCFLAGS_HAVE_ELEM_EXTENDED_HASHING ;
1291
1304
}
1292
1305
typentry -> flags |= TCFLAGS_CHECKED_ELEM_PROPERTIES ;
1293
1306
}
0 commit comments