Skip to content

Commit bd5ef18

Browse files
committed
Replace strings with their hashes.
1 parent d0b6840 commit bd5ef18

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

jsonb_gin_ops.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
221220
else 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
}
228224
else
229225
{
@@ -258,10 +254,11 @@ make_gin_key(JsonbValue *v, uint32 hash)
258254
}
259255
else if (v->type == jbvString)
260256
{
261-
key = (GINKey *)palloc(GINKeyLenString(v->val.string.len));
257+
key = (GINKey *)palloc(GINKeyLenString);
262258
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);
265262
}
266263
else
267264
{
@@ -288,10 +285,11 @@ make_gin_query_key(JsQueryValue *value, uint32 hash)
288285
break;
289286
case jqiString:
290287
read_int32(len, jqBase, jqPos);
291-
key = (GINKey *)palloc(GINKeyLenString(len));
288+
key = (GINKey *)palloc(GINKeyLenString);
292289
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);
295293
break;
296294
case jqiBool:
297295
read_byte(len, jqBase, jqPos);
@@ -411,8 +409,12 @@ compare_gin_key_value(GINKey *arg1, GINKey *arg2)
411409
PointerGetDatum(GINKeyDataNumeric(arg1)),
412410
PointerGetDatum(GINKeyDataNumeric(arg2))));
413411
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;
416418
default:
417419
elog(ERROR, "GINKey must be scalar");
418420
return 0;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy