postgresql/src/test/modules/libpq_pipeline
Tom Lane 4643a2b265 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
2024-04-06 20:45:11 -04:00
..
t Update copyright for 2024 2024-01-03 20:49:05 -05:00
traces Support retrieval of results in chunks with libpq. 2024-04-06 20:45:11 -04:00
.gitignore Implement pipeline mode in libpq 2021-03-15 18:13:42 -03:00
Makefile Add Windows file version information to libpq_pipeline.exe. 2021-06-01 18:04:15 -07:00
README 001_libpq_pipeline.pl: use Test::Differences if available 2023-03-08 18:31:55 +01:00
libpq_pipeline.c Support retrieval of results in chunks with libpq. 2024-04-06 20:45:11 -04:00
meson.build Update copyright for 2024 2024-01-03 20:49:05 -05:00

README

Test programs and libraries for libpq

If you have Test::Differences installed, any differences in the trace files
are displayed in a format that's easier to read than the standard format.
=====================================

This module was developed to test libpq's "pipeline" mode, but it can
be used for any libpq test that requires specialized C code.

"make check" will run all the tests in the module against a temporary
server installation.

You can manually run a specific test by running:

    ./libpq_pipeline <name of test> [ <connection string> ]

This will not start a new server, but rather connect to the server
specified by the connection string, or your default server if you
leave that out.  To discover the available test names, run:

    ./libpq_pipeline tests

To add a new test to this module, you need to edit libpq_pipeline.c.
Add a function to perform the test, and arrange for main() to call it
when the name of your new test is passed to the program.  Don't forget
to add the name of your test to the print_test_list() function, else
the TAP test won't run it.

If the order in which Postgres protocol messages are sent is deterministic
in your test, you should arrange for the message sequence to be verified
by the TAP test.  First generate a reference trace file, using a command
like:

   ./libpq_pipeline -t traces/mynewtest.trace mynewtest

Then add your test's name to the list in the $cmptrace definition in the
t/001_libpq_pipeline.pl file.  Run "make check" a few times to verify
that the trace output actually is stable.