|
| 1 | +--TEST-- |
| 2 | +PDO PgSQL Pdo\Pgsql::ATTR_CHUNK_SIZE splits a result set into chunks of rows |
| 3 | +--EXTENSIONS-- |
| 4 | +pdo_pgsql |
| 5 | +--SKIPIF-- |
| 6 | +<?php |
| 7 | +require __DIR__ . '/config.inc'; |
| 8 | +require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc'; |
| 9 | +PDOTest::skip(); |
| 10 | +if (!defined('Pdo\Pgsql::ATTR_CHUNK_SIZE')) die('skip libpq >= 17 required'); |
| 11 | +?> |
| 12 | +--FILE-- |
| 13 | +<?php |
| 14 | + |
| 15 | +require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc'; |
| 16 | +$pdo = PDOTest::test_factory(__DIR__ . '/common.phpt'); |
| 17 | +$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 18 | + |
| 19 | +// rowCount() reports the size of the chunk being consumed while fetching unbuffered |
| 20 | +function run(PDO $pdo, string $label, array $options): void |
| 21 | +{ |
| 22 | + $stmt = $pdo->prepare("SELECT * FROM generate_series(1, 10)", $options); |
| 23 | + $stmt->execute(); |
| 24 | + |
| 25 | + $values = []; |
| 26 | + $sizes = []; |
| 27 | + |
| 28 | + while (($row = $stmt->fetch(PDO::FETCH_NUM))) { |
| 29 | + $values[] = $row[0]; |
| 30 | + $sizes[] = $stmt->rowCount(); |
| 31 | + } |
| 32 | + |
| 33 | + printf("%s\n values=%s\n chunk sizes=%s\n", |
| 34 | + $label, implode(',', $values), implode(',', $sizes)); |
| 35 | +} |
| 36 | + |
| 37 | +run($pdo, 'buffered (default)', []); |
| 38 | +run($pdo, 'ATTR_PREFETCH => 0', [PDO::ATTR_PREFETCH => 0]); |
| 39 | +run($pdo, 'ATTR_CHUNK_SIZE => 1', [Pdo\Pgsql::ATTR_CHUNK_SIZE => 1]); |
| 40 | +run($pdo, 'ATTR_CHUNK_SIZE => 4 (last chunk is partial)', [Pdo\Pgsql::ATTR_CHUNK_SIZE => 4]); |
| 41 | +run($pdo, 'ATTR_CHUNK_SIZE => 5 (divides evenly)', [Pdo\Pgsql::ATTR_CHUNK_SIZE => 5]); |
| 42 | +run($pdo, 'ATTR_CHUNK_SIZE => 99 (larger than the result)', [Pdo\Pgsql::ATTR_CHUNK_SIZE => 99]); |
| 43 | + |
| 44 | +?> |
| 45 | +--EXPECT-- |
| 46 | +buffered (default) |
| 47 | + values=1,2,3,4,5,6,7,8,9,10 |
| 48 | + chunk sizes=10,10,10,10,10,10,10,10,10,10 |
| 49 | +ATTR_PREFETCH => 0 |
| 50 | + values=1,2,3,4,5,6,7,8,9,10 |
| 51 | + chunk sizes=1,1,1,1,1,1,1,1,1,1 |
| 52 | +ATTR_CHUNK_SIZE => 1 |
| 53 | + values=1,2,3,4,5,6,7,8,9,10 |
| 54 | + chunk sizes=1,1,1,1,1,1,1,1,1,1 |
| 55 | +ATTR_CHUNK_SIZE => 4 (last chunk is partial) |
| 56 | + values=1,2,3,4,5,6,7,8,9,10 |
| 57 | + chunk sizes=4,4,4,4,4,4,4,4,2,2 |
| 58 | +ATTR_CHUNK_SIZE => 5 (divides evenly) |
| 59 | + values=1,2,3,4,5,6,7,8,9,10 |
| 60 | + chunk sizes=5,5,5,5,5,5,5,5,5,5 |
| 61 | +ATTR_CHUNK_SIZE => 99 (larger than the result) |
| 62 | + values=1,2,3,4,5,6,7,8,9,10 |
| 63 | + chunk sizes=10,10,10,10,10,10,10,10,10,10 |
0 commit comments