Support retrieval of results in chunks with libpq.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 7 Apr 2024 00:41:32 +0000 (20:41 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 7 Apr 2024 00:45:11 +0000 (20:45 -0400)
commit4643a2b265e967cc5f13ffa0c7c6912dbb3466d0
treeae3c3e182c5e0586dcecd93f0957deb2d0416b68
parent92641d8d651e685b49a6e2842d306aa5fe7ba500
Support retrieval of results in chunks with libpq.

This patch generalizes libpq's existing single-row mode to allow
individual partial-result PGresults to contain up to N rows, rather
than always one row.  This reduces malloc overhead compared to plain
single-row mode, and it is very useful for psql's FETCH_COUNT feature,
since otherwise we'd have to add code (and cycles) to either merge
single-row PGresults into a bigger one or teach psql's
results-printing logic to accept arrays of PGresults.

To avoid API breakage, PQsetSingleRowMode() remains the same, and we
add a new function PQsetChunkedRowsMode() to invoke the more general
case.  Also, PGresults obtained the old way continue to carry the
PGRES_SINGLE_TUPLE status code, while if PQsetChunkedRowsMode() is
used then their status code is PGRES_TUPLES_CHUNK.  The underlying
logic is the same either way, though.

Daniel Vérité, reviewed by Laurenz Albe and myself (and whacked
around a bit by me, so any remaining bugs are my fault)

Discussion: https://postgr.es/m/CAKZiRmxsVTkO928CM+-ADvsMyePmU3L9DQCa9NwqjvLPcEe5QA@mail.gmail.com
doc/src/sgml/libpq.sgml
src/backend/replication/libpqwalreceiver/libpqwalreceiver.c
src/bin/pg_amcheck/pg_amcheck.c
src/interfaces/libpq/exports.txt
src/interfaces/libpq/fe-exec.c
src/interfaces/libpq/fe-protocol3.c
src/interfaces/libpq/libpq-fe.h
src/interfaces/libpq/libpq-int.h
src/test/modules/libpq_pipeline/libpq_pipeline.c
src/test/modules/libpq_pipeline/traces/singlerow.trace