@@ -26,10 +26,9 @@ typedef struct
2626
2727#define GINKEYLEN offsetof(GINKey, data)
2828
29- #define GINKeyLenString ( len ) ( offsetof(GINKey, data) +len )
29+ #define GINKeyLenString (INTALIGN( offsetof(GINKey, data)) +sizeof(uint32) )
3030#define GINKeyLenNumeric (len ) (INTALIGN(offsetof(GINKey, data)) + len)
31- #define GINKeyStringLen (key ) (VARSIZE(key) - offsetof(GINKey, data))
32- #define GINKeyDataString (key ) ((key)->data)
31+ #define GINKeyDataString (key ) (*(uint32 *)((Pointer)key + INTALIGN(offsetof(GINKey, data))))
3332#define GINKeyDataNumeric (key ) ((Pointer)key + INTALIGN(offsetof(GINKey, data)))
3433#define GINKeyType (key ) ((key)->type & 0x7F)
3534#define GINKeyIsTrue (key ) ((key)->type & 0x80)
@@ -220,10 +219,7 @@ log_gin_key(GINKey *key)
220219}
221220else if (GINKeyType (key )== jbvString )
222221{
223- char * s = (char * )palloc (GINKeyStringLen (key )+ 1 );
224- s [GINKeyStringLen (key )]= '\0' ;
225- memcpy (s ,GINKeyDataString (key ),GINKeyStringLen (key ));
226- elog (NOTICE ,"hash = %X, \"%s\"" ,key -> hash ,s );
222+ elog (NOTICE ,"hash = %X, %X" ,key -> hash ,GINKeyDataString (key ));
227223}
228224else
229225{
@@ -258,10 +254,11 @@ make_gin_key(JsonbValue *v, uint32 hash)
258254}
259255else if (v -> type == jbvString )
260256{
261- key = (GINKey * )palloc (GINKeyLenString ( v -> val . string . len ) );
257+ key = (GINKey * )palloc (GINKeyLenString );
262258key -> type = v -> type ;
263- memcpy (GINKeyDataString (key ),v -> val .string .val ,v -> val .string .len );
264- SET_VARSIZE (key ,GINKeyLenString (v -> val .string .len ));
259+ GINKeyDataString (key )= hash_any ((unsignedchar * )v -> val .string .val ,
260+ v -> val .string .len );
261+ SET_VARSIZE (key ,GINKeyLenString );
265262}
266263else
267264{
@@ -288,10 +285,11 @@ make_gin_query_key(JsQueryValue *value, uint32 hash)
288285break ;
289286case jqiString :
290287read_int32 (len ,jqBase ,jqPos );
291- key = (GINKey * )palloc (GINKeyLenString ( len ) );
288+ key = (GINKey * )palloc (GINKeyLenString );
292289key -> type = jbvString ;
293- memcpy (GINKeyDataString (key ),jqBase + jqPos ,len );
294- SET_VARSIZE (key ,GINKeyLenString (len ));
290+ GINKeyDataString (key )= hash_any ((unsignedchar * )jqBase + jqPos ,
291+ len );
292+ SET_VARSIZE (key ,GINKeyLenString );
295293break ;
296294case jqiBool :
297295read_byte (len ,jqBase ,jqPos );
@@ -411,8 +409,12 @@ compare_gin_key_value(GINKey *arg1, GINKey *arg2)
411409PointerGetDatum (GINKeyDataNumeric (arg1 )),
412410PointerGetDatum (GINKeyDataNumeric (arg2 ))));
413411case jbvString :
414- return varstr_cmp (GINKeyDataString (arg1 ),GINKeyStringLen (arg1 ),
415- GINKeyDataString (arg2 ),GINKeyStringLen (arg2 ),C_COLLATION_OID );
412+ if (GINKeyDataString (arg1 )< GINKeyDataString (arg2 ))
413+ return -1 ;
414+ else if (GINKeyDataString (arg1 )== GINKeyDataString (arg2 ))
415+ return 0 ;
416+ else
417+ return 1 ;
416418default :
417419elog (ERROR ,"GINKey must be scalar" );
418420return 0 ;