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


Reply via email to