From f90874e3194a93b5259b2d9257a1cf8ebfa90afb Mon Sep 17 00:00:00 2001 From: "Stephen R. van den Berg" <srb@cuci.nl> Date: Sat, 4 Feb 2017 02:49:23 +0100 Subject: [PATCH] pgsql: Make _sync wait for executions instead of just parsing. --- lib/modules/Sql.pmod/pgsql.pike | 7 ++----- lib/modules/Sql.pmod/pgsql_util.pmod | 6 ++++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike index 07f11eefab..3a1da1cce3 100644 --- a/lib/modules/Sql.pmod/pgsql.pike +++ b/lib/modules/Sql.pmod/pgsql.pike @@ -1901,7 +1901,7 @@ private inline void throwdelayederror(object parent) { tp=UNDEFINED; .pgsql_util.sql_result portal; portal=.pgsql_util.sql_result(this,c,q, - portalbuffersize,_alltyped,from,forcetext,timeout); + portalbuffersize, _alltyped, from, forcetext, timeout, syncparse); portal._tprepared=tp; #ifdef PG_STATS portalsopened++; @@ -1922,11 +1922,8 @@ private inline void throwdelayederror(object parent) { if(!sizeof(preparedname) || !tp || !tp.preparedname) { if(!sizeof(preparedname)) preparedname= - (portal._unnamedstatementkey= - (syncparse?unnamedstatement->lock:unnamedstatement->trylock)(1)) + (portal._unnamedstatementkey = unnamedstatement->trylock(1)) ? "" : PTSTMTPREFIX+int2hex(ptstmtcount++); - else if(syncparse) - portal._unnamedstatementkey=unnamedstatement->lock(1); PD("Parse statement %O=%O\n",preparedname,q); plugbuffer=c->start()->add_int8('P') ->add_hstring(({preparedname,0,q,"\0\0\0"}),4,4) diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index b00c7212f9..2bda909292 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -488,6 +488,7 @@ class sql_result { final int _fetchlimit; private int alltext; final int _forcetext; + private int syncparse; final string _portalname; @@ -532,7 +533,7 @@ class sql_result { protected void create(object _pgsqlsess,conxion _c,string query, int _portalbuffersize,int alltyped,array params,int forcetext, - int _timeout) { + int _timeout, int _syncparse) { pgsqlsess = _pgsqlsess; cr = (c = _c)->i; _query = query; @@ -546,6 +547,7 @@ class sql_result { _forcetext = forcetext; _state = PORTALINIT; timeout = _timeout; + syncparse = _syncparse; gottimeout = _pgsqlsess->cancelquery; c->closecallbacks+=(<destroy>); } @@ -874,7 +876,7 @@ class sql_result { plugbuffer->add_int16(sizeof(datarowtypes)); if(sizeof(datarowtypes)) plugbuffer->add_ints(map(datarowtypes,oidformat),2); - else if(!paralleliseprefix->match(_query)) { + else if (syncparse || !paralleliseprefix->match(_query)) { lock=pgsqlsess->_shortmux->lock(); if(pgsqlsess->_portalsinflight) { pgsqlsess->_waittocommit++; -- GitLab