From: Tom Lane Date: Wed, 17 Oct 2018 04:04:48 +0000 (-0400) Subject: Avoid statically allocating statement cache in ecpglib/prepare.c. X-Git-Tag: REL_12_BETA1~1375 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e15aae829e3eb686bdf03dea9022a61f8039a7ef;p=postgresql 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 --- diff --git a/src/interfaces/ecpg/ecpglib/prepare.c b/src/interfaces/ecpg/ecpglib/prepare.c index bc0ac4afad..f904d326e4 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);