aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2018-10-17 00:04:48 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2018-10-17 00:04:48 -0400
commite15aae829e3eb686bdf03dea9022a61f8039a7ef (patch)
tree2614a76258667353b324d7fe81e7f61b68e5a48a /src
parent92dff341160ae896dcfff2dac59fd0c860892f26 (diff)
downloadpostgresql-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.c21
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);