diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2018-10-17 00:04:48 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2018-10-17 00:04:48 -0400 |
commit | e15aae829e3eb686bdf03dea9022a61f8039a7ef (patch) | |
tree | 2614a76258667353b324d7fe81e7f61b68e5a48a /src | |
parent | 92dff341160ae896dcfff2dac59fd0c860892f26 (diff) | |
download | postgresql-e15aae829e3eb686bdf03dea9022a61f8039a7ef.tar.gz postgresql-e15aae829e3eb686bdf03dea9022a61f8039a7ef.zip |
Avoid statically allocating statement cache in ecpglib/prepare.c.
This removes a megabyte of storage that isn't used at all in ecpglib's
default operating mode --- you have to enable auto-prepare to get any
use out of it. Seems well worth the trouble to allocate on demand.
Discussion: https://postgr.es/m/20181015200754.7y7zfuzsoux2c4ya@alap3.anarazel.de
Diffstat (limited to 'src')
-rw-r--r-- | src/interfaces/ecpg/ecpglib/prepare.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c index bc0ac4afadb..f904d326e48 100644 --- a/src/interfaces/ecpg/ecpglib/prepare.c +++ b/src/interfaces/ecpg/ecpglib/prepare.c @@ -13,6 +13,8 @@ #define STMTID_SIZE 32 +#define N_STMTCACHE_ENTRIES 16384 + typedef struct { int lineno; @@ -25,7 +27,7 @@ typedef struct static int nextStmtID = 1; static const int stmtCacheNBuckets = 2039; /* # buckets - a prime # */ static const int stmtCacheEntPerBucket = 8; /* # entries/bucket */ -static stmtCacheEntry stmtCacheEntries[16384] = {{0, {0}, 0, 0, 0}}; +static stmtCacheEntry *stmtCacheEntries = NULL; static bool deallocate_one(int lineno, enum COMPAT_MODE c, struct connection *con, struct prepared_statement *prev, struct prepared_statement *this); @@ -362,6 +364,10 @@ SearchStmtCache(const char *ecpgQuery) int entNo, entIx; + /* quick failure if cache not set up */ + if (stmtCacheEntries == NULL) + return 0; + /* hash the statement */ entNo = HashStmt(ecpgQuery); @@ -397,6 +403,10 @@ ecpg_freeStmtCacheEntry(int lineno, int compat, struct prepared_statement *this, *prev; + /* fail if cache isn't set up */ + if (stmtCacheEntries == NULL) + return -1; + entry = &stmtCacheEntries[entNo]; if (!entry->stmtID[0]) /* return if the entry isn't in use */ return 0; @@ -437,6 +447,15 @@ AddStmtToCache(int lineno, /* line # of statement */ entNo; stmtCacheEntry *entry; + /* allocate and zero cache array if we haven't already */ + if (stmtCacheEntries == NULL) + { + stmtCacheEntries = (stmtCacheEntry *) + ecpg_alloc(sizeof(stmtCacheEntry) * N_STMTCACHE_ENTRIES, lineno); + if (stmtCacheEntries == NULL) + return -1; + } + /* hash the statement */ initEntNo = HashStmt(ecpgQuery); |