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

Diff for: jsonb_gin_ops.c

+17-15
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)