Bonjour Michaël,
I was running a long query this morning and wondered why the
cancellation was suddenly broken. So I am not alone, and here you are
with already a solution :)
So, studying through 3a51306, this stuff has changed the query
execution from a sync PQexec() to an async PQsendQuery().
Yes, because we want to handle all results whereas PQexec jumps to the
last one.
And the proposed fix changes back to the behavior where the cancellation
reset happens after getting a result, as there is no need to cancel
anything.
Yep. ISTM that was what happens internally in PQexec.
No strong objections from here if the consensus is to make
SendQueryAndProcessResults() handle the cancel reset properly though I
am not sure if this is the cleanest way to do things,
I was wondering as well, I did a quick fix because it can be irritating
and put off looking at it more precisely over the week-end.
but let's make at least the whole business consistent in the code for
all those code paths.
There are quite a few of them, some which reset the stuff and some which
do not depending on various conditions, some with early exits, all of
which required brain cells and a little time to investigate…
For example, PSQLexecWatch() does an extra ResetCancelConn() that would
be useless once we are done with SendQueryAndProcessResults(). Also, I
can see that SendQueryAndProcessResults() would not issue a cancel reset
if the query fails, for \watch when cancel is pressed, and for \watch
with COPY.
So, my opinion here would be to keep ResetCancelConn() within
PSQLexecWatch(), just add an extra one in SendQuery() to make all the
three code paths printing results consistent, and leave
SendQueryAndProcessResults() out of the cancellation logic.
Yep, it looks much better. I found it strange that the later did a reset
but was not doing the set.
Attached v2 does as you suggest.
That's strange, I don't think you need special permission there. It's
working for me so I added an item with a link to the patch!
As long as you have a community account, you should have the
possibility to edit the page.
After login as "calvin", I have "Want to edit, but don't see an edit
button when logged in? Click here.".
So if you feel that any change is required, please feel free to do so,
of course.
--
Fabien.
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 028a357991..5355086fe2 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -1117,7 +1117,6 @@ SendQueryAndProcessResults(const char *query, double *pelapsed_msec, bool is_wat
INSTR_TIME_SET_CURRENT(before);
success = PQsendQuery(pset.db, query);
- ResetCancelConn();
if (!success)
{
@@ -1486,6 +1485,8 @@ SendQuery(const char *query)
sendquery_cleanup:
+ ResetCancelConn();
+
/* reset \g's output-to-filename trigger */
if (pset.gfname)
{