mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Improve hash_create()'s API for some added robustness.
Invent a new flag bit HASH_STRINGS to specify C-string hashing, which
was formerly the default; and add assertions insisting that exactly
one of the bits HASH_STRINGS, HASH_BLOBS, and HASH_FUNCTION be set.
This is in hopes of preventing recurrences of the type of oversight
fixed in commit a1b8aa1e4
(i.e., mistakenly omitting HASH_BLOBS).
Also, when HASH_STRINGS is specified, insist that the keysize be
more than 8 bytes. This is a heuristic, but it should catch
accidental use of HASH_STRINGS for integer or pointer keys.
(Nearly all existing use-cases set the keysize to NAMEDATALEN or
more, so there's little reason to think this restriction should
be problematic.)
Tweak hash_create() to insist that the HASH_ELEM flag be set, and
remove the defaults it had for keysize and entrysize. Since those
defaults were undocumented and basically useless, no callers
omitted HASH_ELEM anyway.
Also, remove memset's zeroing the HASHCTL parameter struct from
those callers that had one. This has never been really necessary,
and while it wasn't a bad coding convention it was confusing that
some callers did it and some did not. We might as well save a few
cycles by standardizing on "not".
Also improve the documentation for hash_create().
In passing, improve reinit.c's usage of a hash table by storing
the key as a binary Oid rather than a string; and, since that's
a temporary hash table, allocate it in CurrentMemoryContext for
neatness.
Discussion: https://postgr.es/m/590625.1607878171@sss.pgh.pa.us
This commit is contained in:
@ -3439,14 +3439,13 @@ get_json_object_as_hash(char *json, int len, const char *funcname)
|
||||
JsonLexContext *lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true);
|
||||
JsonSemAction *sem;
|
||||
|
||||
memset(&ctl, 0, sizeof(ctl));
|
||||
ctl.keysize = NAMEDATALEN;
|
||||
ctl.entrysize = sizeof(JsonHashEntry);
|
||||
ctl.hcxt = CurrentMemoryContext;
|
||||
tab = hash_create("json object hashtable",
|
||||
100,
|
||||
&ctl,
|
||||
HASH_ELEM | HASH_CONTEXT);
|
||||
HASH_ELEM | HASH_STRINGS | HASH_CONTEXT);
|
||||
|
||||
state = palloc0(sizeof(JHashState));
|
||||
sem = palloc0(sizeof(JsonSemAction));
|
||||
@ -3831,14 +3830,13 @@ populate_recordset_object_start(void *state)
|
||||
return;
|
||||
|
||||
/* Object at level 1: set up a new hash table for this object */
|
||||
memset(&ctl, 0, sizeof(ctl));
|
||||
ctl.keysize = NAMEDATALEN;
|
||||
ctl.entrysize = sizeof(JsonHashEntry);
|
||||
ctl.hcxt = CurrentMemoryContext;
|
||||
_state->json_hash = hash_create("json object hashtable",
|
||||
100,
|
||||
&ctl,
|
||||
HASH_ELEM | HASH_CONTEXT);
|
||||
HASH_ELEM | HASH_STRINGS | HASH_CONTEXT);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Reference in New Issue
Block a user