diff --git a/lib/modules/Sql.pmod/pgsql.pike b/lib/modules/Sql.pmod/pgsql.pike index 28ded5c82e25abf2db1d489444ad176f3f9e26e8..79ebad3ef0906e6623f29245147ef7e748bfbf69 100644 --- a/lib/modules/Sql.pmod/pgsql.pike +++ b/lib/modules/Sql.pmod/pgsql.pike @@ -1167,7 +1167,7 @@ private void startquery(int forcetext, .pgsql_util.sql_result portal, string q, ERROR("Current transaction is aborted, " "commands ignored until end of transaction"); } - if (transtype != NOTRANS) + if (transtype != NOTRANS || .pgsql_util.nodataresprefix->match(q)) tp = .pgsql_util.describenodata; // Description already known else if (!forcetext && forcecache == 1 || forcecache && sizeof(q) >= MINPREPARELENGTH) { diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index 0cc914194a05905363f954f2e54afb63ee3e964c..e2effa721d9580ef8cd3899a87f0d03cff7e8dc2 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -109,7 +109,7 @@ private Regexp dontcacheprefix = iregexp("^\a*(FETCH|COPY)\a"); private Regexp paralleliseprefix = iregexp("^\a*((SELEC|INSER)T|(UPDA|DELE)TE|(FETC|WIT)H)\a"); - /* Statements matching transbeginprefix will cause the driver + /* Statements matching transbeginprefix will cause the driver to * insert a sync after the statement. * Failure to do so, will result in portal synchronisation errors * in the event of an ErrorResponse. @@ -117,7 +117,7 @@ private Regexp paralleliseprefix final Regexp transbeginprefix = iregexp("^\a*(BEGIN|START)([; \t\f\r\n]|$)"); - /* Statements matching transendprefix will cause the driver + /* Statements matching transendprefix will cause the driver to * insert a sync after the statement. * Failure to do so, will result in portal synchronisation errors * in the event of an ErrorResponse. @@ -125,6 +125,13 @@ final Regexp transbeginprefix final Regexp transendprefix = iregexp("^\a*(COMMIT|ROLLBACK|END)([; \t\f\r\n]|$)"); + /* Statements matching nodataresprefix will cause the driver + * to skip asking for a query description and query results, since there + * are no arguments or results to begin with. + */ +final Regexp nodataresprefix + = iregexp("^\a*(RESET|CLOSE|DISCARD)\a"); + /* For statements matching execfetchlimit the resultrows will not be * fetched in pieces. This heuristic will be sub-optimal whenever * either an UPDATE/DELETE/INSERT statement is prefixed by WITH, or @@ -138,7 +145,7 @@ final Regexp transendprefix * tradeoff. */ private Regexp execfetchlimit - = iregexp("^\a*((UPDA|DELE)TE|INSERT" + = iregexp("^\a*((UPDA|DELE)TE|INSERT|CREATE|DROP" "|RESET|CLOSE|DISCARD)\a|\aLIMIT\a+[1-9][; \t\f\r\n]*$"); private void default_backend_runs() { // Runs as soon as the