@@ -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 ((unsigned char * )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 ((unsigned char * )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 ;
0 commit comments