Hash indexes had better pass the index collation to support functions, too.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 23 Apr 2011 18:13:09 +0000 (14:13 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 23 Apr 2011 18:13:09 +0000 (14:13 -0400)
Per experimentation with contrib/citext, whose hash function assumes that
it'll be passed a collation.

src/backend/access/hash/hashutil.c

index ac238d9f7d803b54dce99c6f8b502ef357297d81..6283f4a82b59c73bafccf2d83937aeff92ef3246 100644 (file)
@@ -80,11 +80,13 @@ uint32
 _hash_datum2hashkey(Relation rel, Datum key)
 {
    FmgrInfo   *procinfo;
+   Oid         collation;
 
    /* XXX assumes index has only one attribute */
    procinfo = index_getprocinfo(rel, 1, HASHPROC);
+   collation = rel->rd_indcollation[0];
 
-   return DatumGetUInt32(FunctionCall1(procinfo, key));
+   return DatumGetUInt32(FunctionCall1Coll(procinfo, collation, key));
 }
 
 /*
@@ -98,6 +100,7 @@ uint32
 _hash_datum2hashkey_type(Relation rel, Datum key, Oid keytype)
 {
    RegProcedure hash_proc;
+   Oid         collation;
 
    /* XXX assumes index has only one attribute */
    hash_proc = get_opfamily_proc(rel->rd_opfamily[0],
@@ -108,8 +111,9 @@ _hash_datum2hashkey_type(Relation rel, Datum key, Oid keytype)
        elog(ERROR, "missing support function %d(%u,%u) for index \"%s\"",
             HASHPROC, keytype, keytype,
             RelationGetRelationName(rel));
+   collation = rel->rd_indcollation[0];
 
-   return DatumGetUInt32(OidFunctionCall1(hash_proc, key));
+   return DatumGetUInt32(OidFunctionCall1Coll(hash_proc, collation, key));
 }
 
 /*