@@ -26,10 +26,9 @@ typedef struct
26
26
27
27
#define GINKEYLEN offsetof(GINKey, data)
28
28
29
- #define GINKeyLenString ( len ) ( offsetof(GINKey, data) +len )
29
+ #define GINKeyLenString (INTALIGN( offsetof(GINKey, data)) +sizeof(uint32) )
30
30
#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))))
33
32
#define GINKeyDataNumeric (key ) ((Pointer)key + INTALIGN(offsetof(GINKey, data)))
34
33
#define GINKeyType (key ) ((key)->type & 0x7F)
35
34
#define GINKeyIsTrue (key ) ((key)->type & 0x80)
@@ -220,10 +219,7 @@ log_gin_key(GINKey *key)
220
219
}
221
220
else if (GINKeyType (key )== jbvString )
222
221
{
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 ));
227
223
}
228
224
else
229
225
{
@@ -258,10 +254,11 @@ make_gin_key(JsonbValue *v, uint32 hash)
258
254
}
259
255
else if (v -> type == jbvString )
260
256
{
261
- key = (GINKey * )palloc (GINKeyLenString ( v -> val . string . len ) );
257
+ key = (GINKey * )palloc (GINKeyLenString );
262
258
key -> 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 );
265
262
}
266
263
else
267
264
{
@@ -288,10 +285,11 @@ make_gin_query_key(JsQueryValue *value, uint32 hash)
288
285
break ;
289
286
case jqiString :
290
287
read_int32 (len ,jqBase ,jqPos );
291
- key = (GINKey * )palloc (GINKeyLenString ( len ) );
288
+ key = (GINKey * )palloc (GINKeyLenString );
292
289
key -> 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 );
295
293
break ;
296
294
case jqiBool :
297
295
read_byte (len ,jqBase ,jqPos );
@@ -411,8 +409,12 @@ compare_gin_key_value(GINKey *arg1, GINKey *arg2)
411
409
PointerGetDatum (GINKeyDataNumeric (arg1 )),
412
410
PointerGetDatum (GINKeyDataNumeric (arg2 ))));
413
411
case 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 ;
416
418
default :
417
419
elog (ERROR ,"GINKey must be scalar" );
418
420
return 0 ;