diff options
author | Etsuro Fujita <efujita@postgresql.org> | 2021-08-02 12:45:00 +0900 |
---|---|---|
committer | Etsuro Fujita <efujita@postgresql.org> | 2021-08-02 12:45:00 +0900 |
commit | a8ed9bd59d48c13da50ed2358911721b2baf1de3 (patch) | |
tree | 1f9469ec35097d0d16cb4e23e807cd2768796123 /src/backend/executor | |
parent | eaf5321c352478266cebe2aa50ea4c34a8fdd2c7 (diff) | |
download | postgresql-a8ed9bd59d48c13da50ed2358911721b2baf1de3.tar.gz postgresql-a8ed9bd59d48c13da50ed2358911721b2baf1de3.zip |
Fix oversight in commit 1ec7fca8592178281cd5cdada0f27a340fb813fc.
I failed to account for the possibility that when
ExecAppendAsyncEventWait() notifies multiple async-capable nodes using
postgres_fdw, a preceding node might invoke process_pending_request() to
process a pending asynchronous request made by a succeeding node. In
that case the succeeding node should produce a tuple to return to the
parent Append node from tuples fetched by process_pending_request() when
notified. Repair.
Per buildfarm via Michael Paquier. Back-patch to v14, like the previous
commit.
Thanks to Tom Lane for testing.
Discussion: https://postgr.es/m/YQP0UPT8KmPiHTMs%40paquier.xyz
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/nodeAppend.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index a4eef19d7f4..6a2daa6e767 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -1082,16 +1082,18 @@ ExecAppendAsyncEventWait(AppendState *node) { AsyncRequest *areq = (AsyncRequest *) w->user_data; - /* - * Mark it as no longer needing a callback. We must do this - * before dispatching the callback in case the callback resets the - * flag. - */ - Assert(areq->callback_pending); - areq->callback_pending = false; - - /* Do the actual work. */ - ExecAsyncNotify(areq); + if (areq->callback_pending) + { + /* + * Mark it as no longer needing a callback. We must do this + * before dispatching the callback in case the callback resets + * the flag. + */ + areq->callback_pending = false; + + /* Do the actual work. */ + ExecAsyncNotify(areq); + } } } } |