diff options
| author | Tom Lane | 2020-12-15 16:38:53 +0000 |
|---|---|---|
| committer | Tom Lane | 2020-12-15 16:38:53 +0000 |
| commit | b3817f5f774663d55931dd4fab9c5a94a15ae7ab (patch) | |
| tree | 2a74193a670d8409ff4c8ff86d58cbbfa1e6a4ce /contrib | |
| parent | a58db3aa10e62e4228aa409ba006014fa07a8ca2 (diff) | |
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
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/dblink/dblink.c | 3 | ||||
| -rw-r--r-- | contrib/pg_stat_statements/pg_stat_statements.c | 1 | ||||
| -rw-r--r-- | contrib/postgres_fdw/connection.c | 5 | ||||
| -rw-r--r-- | contrib/postgres_fdw/shippable.c | 1 | ||||
| -rw-r--r-- | contrib/tablefunc/tablefunc.c | 3 |
5 files changed, 4 insertions, 9 deletions
diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 2dc9e44ae65..651227f510e 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -2607,7 +2607,8 @@ createConnHash(void) ctl.keysize = NAMEDATALEN; ctl.entrysize = sizeof(remoteConnHashEnt); - return hash_create("Remote Con hash", NUMCONN, &ctl, HASH_ELEM); + return hash_create("Remote Con hash", NUMCONN, &ctl, + HASH_ELEM | HASH_STRINGS); } static void diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 70cfdb2c9d1..2f00344b7f8 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -567,7 +567,6 @@ pgss_shmem_startup(void) pgss->stats.dealloc = 0; } - memset(&info, 0, sizeof(info)); info.keysize = sizeof(pgssHashKey); info.entrysize = sizeof(pgssEntry); pgss_hash = ShmemInitHash("pg_stat_statements hash", diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index ab3226287d7..66581e54144 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -119,14 +119,11 @@ GetConnection(UserMapping *user, bool will_prep_stmt) { HASHCTL ctl; - MemSet(&ctl, 0, sizeof(ctl)); ctl.keysize = sizeof(ConnCacheKey); ctl.entrysize = sizeof(ConnCacheEntry); - /* allocate ConnectionHash in the cache context */ - ctl.hcxt = CacheMemoryContext; ConnectionHash = hash_create("postgres_fdw connections", 8, &ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); + HASH_ELEM | HASH_BLOBS); /* * Register some callback functions that manage connection cleanup. diff --git a/contrib/postgres_fdw/shippable.c b/contrib/postgres_fdw/shippable.c index 3433c197123..b4766dc5ff8 100644 --- a/contrib/postgres_fdw/shippable.c +++ b/contrib/postgres_fdw/shippable.c @@ -93,7 +93,6 @@ InitializeShippableCache(void) HASHCTL ctl; /* Create the hash table. */ - MemSet(&ctl, 0, sizeof(ctl)); ctl.keysize = sizeof(ShippableCacheKey); ctl.entrysize = sizeof(ShippableCacheEntry); ShippableCacheHash = diff --git a/contrib/tablefunc/tablefunc.c b/contrib/tablefunc/tablefunc.c index 85986ec24ad..e9a9741154a 100644 --- a/contrib/tablefunc/tablefunc.c +++ b/contrib/tablefunc/tablefunc.c @@ -714,7 +714,6 @@ load_categories_hash(char *cats_sql, MemoryContext per_query_ctx) MemoryContext SPIcontext; /* initialize the category hash table */ - MemSet(&ctl, 0, sizeof(ctl)); ctl.keysize = MAX_CATNAME_LEN; ctl.entrysize = sizeof(crosstab_HashEnt); ctl.hcxt = per_query_ctx; @@ -726,7 +725,7 @@ load_categories_hash(char *cats_sql, MemoryContext per_query_ctx) crosstab_hash = hash_create("crosstab hash", INIT_CATS, &ctl, - HASH_ELEM | HASH_CONTEXT); + HASH_ELEM | HASH_STRINGS | HASH_CONTEXT); /* Connect to SPI manager */ if ((ret = SPI_connect()) < 0) |
