On Thu, Nov 6, 2025 at 8:38 AM Chao Li <[email protected]> wrote:
> I just eyeball reviewed v20 and got a doubt:
Thanks for the review!
> +static void
> +discardAvailableResults(CState *st)
> +{
> + PGresult *res = NULL;
> +
> + for (;;)
> + {
> + res = PQgetResult(st->con);
> +
> + /*
> + * Read and discard results until PQgetResult() returns NULL
> (no more
> + * results) or a connection failure is detected. If the
> pipeline
> + * status is PQ_PIPELINE_ABORTED, more results may still be
> available
> + * even after PQgetResult() returns NULL, so continue reading
> in that
> + * case.
> + */
> + if ((res == NULL && PQpipelineStatus(st->con) !=
> PQ_PIPELINE_ABORTED) ||
> + PQstatus(st->con) == CONNECTION_BAD)
> + break;
> +
> + PQclear(res);
> + }
> + PQclear(res);
> +}
> ```
>
> If pipeline is aborted and no more results, then the “if” will be "true &&
> false”. And in this case, I guess PQstatus(st->con) != CONNECTION_BAD because
> it’s not a connection error, then overall, the “if” will be “false”, and it
> falls into an infinite loop.
Can this situation actually happen? It would be helpful if you could share
the custom script that triggers it.
When the pipeline is aborted, PGRES_PIPELINE_SYNC should arrive afterward,
changing the status from PQ_PIPELINE_ABORTED to PQ_PIPELINE_ON. That should
make the condition true and prevent an infinite loop, right?
Regards,
--
Fujii Masao