Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita8f1efc

Browse files
committed
Fix misimplementation of typcache logic for extended hashing.
The previous coding would report that an array type supports extendedhashing if its element type supports regular hashing. This bug isonly latent at the moment, since AFAICS there is not yet any codethat depends on checking presence of extended-hashing support to makeany decisions. (And in any case it wouldn't matter unless the elementtype has only regular hashing, which isn't true of any core data type.)But that doesn't make it less broken. Extend thecache_array_element_properties infrastructure to check this properly.
1 parent2959213 commita8f1efc

File tree

1 file changed

+36
-23
lines changed

1 file changed

+36
-23
lines changed

‎src/backend/utils/cache/typcache.c

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -79,22 +79,23 @@ static HTAB *TypeCacheHash = NULL;
7979
staticTypeCacheEntry*firstDomainTypeEntry=NULL;
8080

8181
/* Private flag bits in the TypeCacheEntry.flags field */
82-
#defineTCFLAGS_CHECKED_BTREE_OPCLASS0x0001
83-
#defineTCFLAGS_CHECKED_HASH_OPCLASS0x0002
84-
#defineTCFLAGS_CHECKED_EQ_OPR0x0004
85-
#defineTCFLAGS_CHECKED_LT_OPR0x0008
86-
#defineTCFLAGS_CHECKED_GT_OPR0x0010
87-
#defineTCFLAGS_CHECKED_CMP_PROC0x0020
88-
#defineTCFLAGS_CHECKED_HASH_PROC0x0040
89-
#defineTCFLAGS_CHECKED_ELEM_PROPERTIES0x0080
90-
#defineTCFLAGS_HAVE_ELEM_EQUALITY0x0100
91-
#defineTCFLAGS_HAVE_ELEM_COMPARE0x0200
92-
#defineTCFLAGS_HAVE_ELEM_HASHING0x0400
93-
#defineTCFLAGS_CHECKED_FIELD_PROPERTIES0x0800
94-
#defineTCFLAGS_HAVE_FIELD_EQUALITY0x1000
95-
#defineTCFLAGS_HAVE_FIELD_COMPARE0x2000
96-
#defineTCFLAGS_CHECKED_DOMAIN_CONSTRAINTS0x4000
97-
#defineTCFLAGS_CHECKED_HASH_EXTENDED_PROC0x8000
82+
#defineTCFLAGS_CHECKED_BTREE_OPCLASS0x000001
83+
#defineTCFLAGS_CHECKED_HASH_OPCLASS0x000002
84+
#defineTCFLAGS_CHECKED_EQ_OPR0x000004
85+
#defineTCFLAGS_CHECKED_LT_OPR0x000008
86+
#defineTCFLAGS_CHECKED_GT_OPR0x000010
87+
#defineTCFLAGS_CHECKED_CMP_PROC0x000020
88+
#defineTCFLAGS_CHECKED_HASH_PROC0x000040
89+
#defineTCFLAGS_CHECKED_HASH_EXTENDED_PROC0x000080
90+
#defineTCFLAGS_CHECKED_ELEM_PROPERTIES0x000100
91+
#defineTCFLAGS_HAVE_ELEM_EQUALITY0x000200
92+
#defineTCFLAGS_HAVE_ELEM_COMPARE0x000400
93+
#defineTCFLAGS_HAVE_ELEM_HASHING0x000800
94+
#defineTCFLAGS_HAVE_ELEM_EXTENDED_HASHING0x001000
95+
#defineTCFLAGS_CHECKED_FIELD_PROPERTIES0x002000
96+
#defineTCFLAGS_HAVE_FIELD_EQUALITY0x004000
97+
#defineTCFLAGS_HAVE_FIELD_COMPARE0x008000
98+
#defineTCFLAGS_CHECKED_DOMAIN_CONSTRAINTS0x010000
9899

99100
/*
100101
* 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);
273274
staticboolarray_element_has_equality(TypeCacheEntry*typentry);
274275
staticboolarray_element_has_compare(TypeCacheEntry*typentry);
275276
staticboolarray_element_has_hashing(TypeCacheEntry*typentry);
277+
staticboolarray_element_has_extended_hashing(TypeCacheEntry*typentry);
276278
staticvoidcache_array_element_properties(TypeCacheEntry*typentry);
277279
staticboolrecord_fields_have_equality(TypeCacheEntry*typentry);
278280
staticboolrecord_fields_have_compare(TypeCacheEntry*typentry);
@@ -451,8 +453,8 @@ lookup_type_cache(Oid type_id, int flags)
451453
* eq_opr; if we already found one from the btree opclass, that
452454
* decision is still good.
453455
*/
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);
456458
typentry->flags |=TCFLAGS_CHECKED_HASH_OPCLASS;
457459
}
458460

@@ -500,8 +502,8 @@ lookup_type_cache(Oid type_id, int flags)
500502
* equality operator. This is so we can ensure that the hash
501503
* functions match the operator.
502504
*/
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);
505507
typentry->flags |=TCFLAGS_CHECKED_EQ_OPR;
506508
}
507509
if ((flags&TYPECACHE_LT_OPR)&&
@@ -637,10 +639,10 @@ lookup_type_cache(Oid type_id, int flags)
637639
* we'll need more logic here to check that case too.
638640
*/
639641
if (hash_extended_proc==F_HASH_ARRAY_EXTENDED&&
640-
!array_element_has_hashing(typentry))
642+
!array_element_has_extended_hashing(typentry))
641643
hash_extended_proc=InvalidOid;
642644

643-
/* Force update ofhash_proc_finfo only if we're changing state */
645+
/* Force update ofproc finfo only if we're changing state */
644646
if (typentry->hash_extended_proc!=hash_extended_proc)
645647
typentry->hash_extended_proc_finfo.fn_oid=InvalidOid;
646648

@@ -1269,6 +1271,14 @@ array_element_has_hashing(TypeCacheEntry *typentry)
12691271
return (typentry->flags&TCFLAGS_HAVE_ELEM_HASHING)!=0;
12701272
}
12711273

1274+
staticbool
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+
12721282
staticvoid
12731283
cache_array_element_properties(TypeCacheEntry*typentry)
12741284
{
@@ -1281,13 +1291,16 @@ cache_array_element_properties(TypeCacheEntry *typentry)
12811291
elementry=lookup_type_cache(elem_type,
12821292
TYPECACHE_EQ_OPR |
12831293
TYPECACHE_CMP_PROC |
1284-
TYPECACHE_HASH_PROC);
1294+
TYPECACHE_HASH_PROC |
1295+
TYPECACHE_HASH_EXTENDED_PROC);
12851296
if (OidIsValid(elementry->eq_opr))
12861297
typentry->flags |=TCFLAGS_HAVE_ELEM_EQUALITY;
12871298
if (OidIsValid(elementry->cmp_proc))
12881299
typentry->flags |=TCFLAGS_HAVE_ELEM_COMPARE;
12891300
if (OidIsValid(elementry->hash_proc))
12901301
typentry->flags |=TCFLAGS_HAVE_ELEM_HASHING;
1302+
if (OidIsValid(elementry->hash_extended_proc))
1303+
typentry->flags |=TCFLAGS_HAVE_ELEM_EXTENDED_HASHING;
12911304
}
12921305
typentry->flags |=TCFLAGS_CHECKED_ELEM_PROPERTIES;
12931306
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp