0001-Add-test-for-read_stream_resume.patch
text/x-patch
Filename: 0001-Add-test-for-read_stream_resume.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0001
Subject: Add test for read_stream_resume()
| File | + | − |
|---|---|---|
| src/test/modules/test_aio/t/004_read_stream.pl | 22 | 0 |
| src/test/modules/test_aio/test_aio--1.0.sql | 9 | 0 |
| src/test/modules/test_aio/test_aio.c | 71 | 0 |
| src/tools/pgindent/typedefs.list | 1 | 0 |
From 36668cc39dd8a6e249ece3ed53201cb3ea17073e Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 8 Apr 2026 13:40:16 -0400
Subject: [PATCH 1/2] Add test for read_stream_resume()
---
.../modules/test_aio/t/004_read_stream.pl | 22 ++++++
src/test/modules/test_aio/test_aio--1.0.sql | 9 +++
src/test/modules/test_aio/test_aio.c | 71 +++++++++++++++++++
src/tools/pgindent/typedefs.list | 1 +
4 files changed, 103 insertions(+)
diff --git a/src/test/modules/test_aio/t/004_read_stream.pl b/src/test/modules/test_aio/t/004_read_stream.pl
index 32311c07ac0..28aedd7d163 100644
--- a/src/test/modules/test_aio/t/004_read_stream.pl
+++ b/src/test/modules/test_aio/t/004_read_stream.pl
@@ -115,6 +115,27 @@ sub test_repeated_blocks
}
+sub test_read_stream_resume
+{
+ my $io_method = shift;
+ my $node = shift;
+
+ my $psql = $node->background_psql('postgres', on_error_stop => 0);
+
+ $psql->query_safe(
+ qq(
+CREATE TEMPORARY TABLE tmp_read_stream(data int not null);
+INSERT INTO tmp_read_stream SELECT generate_series(1, 10000);
+SELECT test_read_stream_resume('tmp_read_stream', 0);
+DROP TABLE tmp_read_stream;
+));
+
+ ok(1, "$io_method: read_stream_resume");
+
+ $psql->quit();
+}
+
+
sub test_inject_foreign
{
my $io_method = shift;
@@ -268,6 +289,7 @@ sub test_io_method
$io_method, "$io_method: io_method set correctly");
test_repeated_blocks($io_method, $node);
+ test_read_stream_resume($io_method, $node);
SKIP:
{
diff --git a/src/test/modules/test_aio/test_aio--1.0.sql b/src/test/modules/test_aio/test_aio--1.0.sql
index 762ac29512f..48caad25bda 100644
--- a/src/test/modules/test_aio/test_aio--1.0.sql
+++ b/src/test/modules/test_aio/test_aio--1.0.sql
@@ -128,3 +128,12 @@ AS 'MODULE_PATHNAME' LANGUAGE C;
CREATE FUNCTION inj_io_reopen_detach()
RETURNS pg_catalog.void STRICT
AS 'MODULE_PATHNAME' LANGUAGE C;
+
+
+
+/*
+ * Read stream related functions
+ */
+CREATE FUNCTION test_read_stream_resume(rel regclass, blockno int4)
+RETURNS pg_catalog.void STRICT
+AS 'MODULE_PATHNAME' LANGUAGE C;
diff --git a/src/test/modules/test_aio/test_aio.c b/src/test/modules/test_aio/test_aio.c
index 35efba1a5e3..9d2d32ad1a2 100644
--- a/src/test/modules/test_aio/test_aio.c
+++ b/src/test/modules/test_aio/test_aio.c
@@ -916,6 +916,77 @@ read_stream_for_blocks(PG_FUNCTION_ARGS)
}
+typedef struct
+{
+ BlockNumber blkno;
+ int count;
+} test_read_stream_resume_state;
+
+static BlockNumber
+test_read_stream_resume_cb(ReadStream *stream,
+ void *callback_private_data,
+ void *per_buffer_data)
+{
+ test_read_stream_resume_state *state = callback_private_data;
+
+ /* Periodic end-of-stream. */
+ if (++state->count % 3 == 0)
+ return read_stream_pause(stream);
+
+ return state->blkno;
+}
+
+/*
+ * Test read_stream_resume(), allowing a stream to end temporarily and then
+ * continue where it left off.
+ */
+PG_FUNCTION_INFO_V1(test_read_stream_resume);
+Datum
+test_read_stream_resume(PG_FUNCTION_ARGS)
+{
+ Oid relid = PG_GETARG_OID(0);
+ BlockNumber blkno = PG_GETARG_UINT32(1);
+ Relation rel;
+ Buffer buf;
+ ReadStream *stream;
+ test_read_stream_resume_state state = {.blkno = blkno};
+
+ rel = relation_open(relid, AccessShareLock);
+ stream = read_stream_begin_relation(READ_STREAM_DEFAULT,
+ NULL,
+ rel,
+ MAIN_FORKNUM,
+ test_read_stream_resume_cb,
+ &state,
+ 0);
+
+ for (int i = 0; i < 3; ++i)
+ {
+ /* Same block twice. */
+ buf = read_stream_next_buffer(stream, NULL);
+ Assert(BufferGetBlockNumber(buf) == blkno);
+ ReleaseBuffer(buf);
+ buf = read_stream_next_buffer(stream, NULL);
+ Assert(BufferGetBlockNumber(buf) == blkno);
+ ReleaseBuffer(buf);
+
+ /* End-of-stream. */
+ buf = read_stream_next_buffer(stream, NULL);
+ Assert(buf == InvalidBuffer);
+ buf = read_stream_next_buffer(stream, NULL);
+ Assert(buf == InvalidBuffer);
+
+ /* Resume. */
+ read_stream_resume(stream);
+ }
+
+ read_stream_end(stream);
+ relation_close(rel, NoLock);
+
+ PG_RETURN_VOID();
+}
+
+
PG_FUNCTION_INFO_V1(handle_get);
Datum
handle_get(PG_FUNCTION_ARGS)
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index ea95e7984bc..4236afefa2d 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -4329,6 +4329,7 @@ teSection
temp_tablespaces_extra
test128
test_re_flags
+test_read_stream_resume_state
test_regex_ctx
test_shm_mq_header
test_spec
--
2.43.0