public inbox for [email protected]help / color / mirror / Atom feed
[PATCH v12 11/17] table_scan_bitmap_next_block counts lossy and exact pages 12+ messages / 2 participants [nested] [flat]
* [PATCH v12 11/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 38c4fd5011c..46f1a374252 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2199,7 +2199,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2349,7 +2350,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 8b6f22bc3b6..fb79f57d7a6 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -119,7 +119,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -298,14 +297,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 592a8421bdf..a06ed271eb6 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -804,8 +804,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -822,8 +822,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2019,15 +2021,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2038,7 +2042,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --6jpz2j246qmht4bt Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v12-0012-Hard-code-TBMIterateResult-offsets-array-size.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v8 11/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 2ad785e511..266b34fe6b 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2114,7 +2114,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2267,7 +2268,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 7e73583fe5..96b55507a3 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -69,7 +69,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -267,14 +266,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index a820cc8c99..1d4b79a73f 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -797,8 +797,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -815,8 +815,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2013,15 +2015,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2032,7 +2036,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --xqq4defy3uncu6k6 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v8-0012-Separate-TBM-Shared-Iterator-and-TBMIterateResult.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v9 10/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 2ad785e511..266b34fe6b 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2114,7 +2114,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2267,7 +2268,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 7e73583fe5..96b55507a3 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -69,7 +69,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -267,14 +266,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index a820cc8c99..1d4b79a73f 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -797,8 +797,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -815,8 +815,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2013,15 +2015,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2032,7 +2036,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --7mdtsjmrzitrgzgx Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v9-0011-Hard-code-TBMIterateResult-offsets-array-size.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v10 11/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index c76849a98e..d85fee1e50 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2114,7 +2114,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2264,7 +2265,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index fe471a8a0c..076e1ff674 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -119,7 +119,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -298,14 +297,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 29387166c1..edc54ecffe 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -797,8 +797,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -815,8 +815,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -1994,15 +1996,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2013,7 +2017,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --3o7pc6dfau5a5hry Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0012-Hard-code-TBMIterateResult-offsets-array-size.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v11 11/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 2d9e0e1a9f..81a7488007 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2172,7 +2172,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2322,7 +2323,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index fe471a8a0c..076e1ff674 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -119,7 +119,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -298,14 +297,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 459e123e92..bb2b79717c 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -808,8 +808,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -826,8 +826,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2029,15 +2031,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2048,7 +2052,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --owzzsiozz6hgpp7e Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0012-Hard-code-TBMIterateResult-offsets-array-size.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v8 11/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 2ad785e511..266b34fe6b 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2114,7 +2114,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2267,7 +2268,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 7e73583fe5..96b55507a3 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -69,7 +69,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -267,14 +266,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index a820cc8c99..1d4b79a73f 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -797,8 +797,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -815,8 +815,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2013,15 +2015,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2032,7 +2036,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --xqq4defy3uncu6k6 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v8-0012-Separate-TBM-Shared-Iterator-and-TBMIterateResult.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v9 10/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 2ad785e511..266b34fe6b 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2114,7 +2114,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2267,7 +2268,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 7e73583fe5..96b55507a3 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -69,7 +69,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -267,14 +266,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index a820cc8c99..1d4b79a73f 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -797,8 +797,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -815,8 +815,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2013,15 +2015,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2032,7 +2036,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --7mdtsjmrzitrgzgx Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v9-0011-Hard-code-TBMIterateResult-offsets-array-size.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v8 11/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 2ad785e511..266b34fe6b 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2114,7 +2114,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2267,7 +2268,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 7e73583fe5..96b55507a3 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -69,7 +69,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -267,14 +266,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index a820cc8c99..1d4b79a73f 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -797,8 +797,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -815,8 +815,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2013,15 +2015,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2032,7 +2036,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --xqq4defy3uncu6k6 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v8-0012-Separate-TBM-Shared-Iterator-and-TBMIterateResult.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v9 10/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 2ad785e511..266b34fe6b 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2114,7 +2114,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2267,7 +2268,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 7e73583fe5..96b55507a3 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -69,7 +69,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -267,14 +266,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index a820cc8c99..1d4b79a73f 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -797,8 +797,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -815,8 +815,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2013,15 +2015,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2032,7 +2036,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --7mdtsjmrzitrgzgx Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v9-0011-Hard-code-TBMIterateResult-offsets-array-size.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v10 11/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index c76849a98e..d85fee1e50 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2114,7 +2114,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2264,7 +2265,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index fe471a8a0c..076e1ff674 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -119,7 +119,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -298,14 +297,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 29387166c1..edc54ecffe 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -797,8 +797,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -815,8 +815,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -1994,15 +1996,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2013,7 +2017,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --3o7pc6dfau5a5hry Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v10-0012-Hard-code-TBMIterateResult-offsets-array-size.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v11 11/17] table_scan_bitmap_next_block counts lossy and exact pages @ 2024-03-22 21:09 Melanie Plageman <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Melanie Plageman @ 2024-03-22 21:09 UTC (permalink / raw) Now that the table_scan_bitmap_next_block() callback only returns false when the bitmap is exhausted, it is simpler to move the management of the lossy and exact page counters into it. We will eventually remove this callback and table_scan_bitmap_next_tuple() will update those counters when a new block is read in. --- src/backend/access/heap/heapam_handler.c | 8 ++++++-- src/backend/executor/nodeBitmapHeapscan.c | 9 ++------- src/include/access/tableam.h | 21 +++++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 2d9e0e1a9f..81a7488007 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2172,7 +2172,8 @@ heapam_estimate_rel_size(Relation rel, int32 *attr_widths, static bool heapam_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { HeapScanDesc hscan = (HeapScanDesc) scan; BlockNumber block; @@ -2322,7 +2323,10 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; - *lossy = tbmres->ntuples < 0; + if (tbmres->ntuples < 0) + (*lossy_pages)++; + else + (*exact_pages)++; /* * Return true to indicate that a valid block was found and the bitmap is diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index fe471a8a0c..076e1ff674 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -119,7 +119,6 @@ BitmapHeapNext(BitmapHeapScanState *node) { ExprContext *econtext; TableScanDesc scan; - bool lossy; TIDBitmap *tbm; TupleTableSlot *slot; ParallelBitmapHeapState *pstate = node->pstate; @@ -298,14 +297,10 @@ new_page: BitmapAdjustPrefetchIterator(node); - if (!table_scan_bitmap_next_block(scan, &node->recheck, &lossy, &node->blockno)) + if (!table_scan_bitmap_next_block(scan, &node->recheck, &node->blockno, + &node->lossy_pages, &node->exact_pages)) break; - if (lossy) - node->lossy_pages++; - else - node->exact_pages++; - /* * If serial, we can error out if the the prefetch block doesn't stay * ahead of the current block. diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 459e123e92..bb2b79717c 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -808,8 +808,8 @@ typedef struct TableAmRoutine * work to allow scan_bitmap_next_tuple() to return tuples (e.g. it might * make sense to perform tuple visibility checks at this time). * - * lossy indicates whether or not the block's representation in the bitmap - * is lossy or exact. + * lossy_pages is incremented if the block's representation in the bitmap + * is lossy, otherwise, exact_pages is incremented. * * XXX: Currently this may only be implemented if the AM uses md.c as its * storage manager, and uses ItemPointer->ip_blkid in a manner that maps @@ -826,8 +826,10 @@ typedef struct TableAmRoutine * scan_bitmap_next_tuple need to exist, or neither. */ bool (*scan_bitmap_next_block) (TableScanDesc scan, - bool *recheck, bool *lossy, - BlockNumber *blockno); + bool *recheck, + BlockNumber *blockno, + long *lossy_pages, + long *exact_pages); /* * Fetch the next tuple of a bitmap table scan into `slot` and return true @@ -2029,15 +2031,17 @@ table_relation_estimate_size(Relation rel, int32 *attr_widths, /* * Prepare to fetch / check / return tuples as part of a bitmap table scan. * `scan` needs to have been started via table_beginscan_bm(). Returns false if - * there are no more blocks in the bitmap, true otherwise. lossy is set to true - * if bitmap is lossy for the selected block and false otherwise. + * there are no more blocks in the bitmap, true otherwise. lossy_pages is + * incremented if bitmap is lossy for the selected block and exact_pages is + * incremented otherwise. * * Note, this is an optionally implemented function, therefore should only be * used after verifying the presence (at plan time or such). */ static inline bool table_scan_bitmap_next_block(TableScanDesc scan, - bool *recheck, bool *lossy, BlockNumber *blockno) + bool *recheck, BlockNumber *blockno, + long *lossy_pages, long *exact_pages) { /* * We don't expect direct calls to table_scan_bitmap_next_block with valid @@ -2048,7 +2052,8 @@ table_scan_bitmap_next_block(TableScanDesc scan, elog(ERROR, "unexpected table_scan_bitmap_next_block call during logical decoding"); return scan->rs_rd->rd_tableam->scan_bitmap_next_block(scan, recheck, - lossy, blockno); + blockno, lossy_pages, + exact_pages); } /* -- 2.40.1 --owzzsiozz6hgpp7e Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v11-0012-Hard-code-TBMIterateResult-offsets-array-size.patch" ^ permalink raw reply [nested|flat] 12+ messages in thread
* [PATCH v3] Introduce ternary reloptions @ 2026-01-16 15:04 Álvaro Herrera <[email protected]> 0 siblings, 0 replies; 12+ messages in thread From: Álvaro Herrera @ 2026-01-16 15:04 UTC (permalink / raw) Introduce ternary reloption as a replacement for current `vacuum_truncate` implementation. Remove the `vacuum_truncate_set` separate flag and use TERNARY_UNSET instead. This could also be used for other options such as `vacuum_index_cleanup` and `buffering`, but lets get the scaffolding in first. Discussion: https://postgr.es/m/3474141.usfYGdeWWP@thinkpad-pgpro --- src/backend/access/common/reloptions.c | 137 ++++++++++++++++++----- src/backend/commands/vacuum.c | 4 +- src/include/access/reloptions.h | 27 ++--- src/include/postgres.h | 15 +++ src/include/utils/rel.h | 3 +- src/test/regress/expected/reloptions.out | 36 ++++++ src/test/regress/sql/reloptions.sql | 21 ++++ src/tools/pgindent/typedefs.list | 2 + 8 files changed, 202 insertions(+), 43 deletions(-) diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 0b83f98ed5f..6f1f577581a 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -40,9 +40,9 @@ * * To add an option: * - * (i) decide on a type (bool, integer, real, enum, string), name, default - * value, upper and lower bounds (if applicable); for strings, consider a - * validation routine. + * (i) decide on a type (bool, ternary, integer, real, enum, string), name, + * default value, upper and lower bounds (if applicable); for strings, + * consider a validation routine. * (ii) add a record below (or use add_<type>_reloption). * (iii) add it to the appropriate options struct (perhaps StdRdOptions) * (iv) add it to the appropriate handling routine (perhaps @@ -147,15 +147,6 @@ static relopt_bool boolRelOpts[] = }, false }, - { - { - "vacuum_truncate", - "Enables vacuum to truncate empty pages at the end of this table", - RELOPT_KIND_HEAP | RELOPT_KIND_TOAST, - ShareUpdateExclusiveLock - }, - true - }, { { "deduplicate_items", @@ -170,6 +161,25 @@ static relopt_bool boolRelOpts[] = {{NULL}} }; +static relopt_ternary ternaryRelOpts[] = +{ + { + { + "vacuum_truncate", + "Enables vacuum to truncate empty pages at the end of this table", + RELOPT_KIND_HEAP | RELOPT_KIND_TOAST, + ShareUpdateExclusiveLock + }, + TERNARY_UNSET + }, + /* list terminator */ + { + { + NULL + } + } +}; + static relopt_int intRelOpts[] = { { @@ -609,6 +619,13 @@ initialize_reloptions(void) boolRelOpts[i].gen.lockmode)); j++; } + for (i = 0; ternaryRelOpts[i].gen.name; i++) + { + Assert(DoLockModesConflict(ternaryRelOpts[i].gen.lockmode, + ternaryRelOpts[i].gen.lockmode)); + j++; + } + for (i = 0; intRelOpts[i].gen.name; i++) { Assert(DoLockModesConflict(intRelOpts[i].gen.lockmode, @@ -649,6 +666,14 @@ initialize_reloptions(void) j++; } + for (i = 0; ternaryRelOpts[i].gen.name; i++) + { + relOpts[j] = &ternaryRelOpts[i].gen; + relOpts[j]->type = RELOPT_TYPE_TERNARY; + relOpts[j]->namelen = strlen(relOpts[j]->name); + j++; + } + for (i = 0; intRelOpts[i].gen.name; i++) { relOpts[j] = &intRelOpts[i].gen; @@ -809,6 +834,9 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc, case RELOPT_TYPE_BOOL: size = sizeof(relopt_bool); break; + case RELOPT_TYPE_TERNARY: + size = sizeof(relopt_ternary); + break; case RELOPT_TYPE_INT: size = sizeof(relopt_int); break; @@ -892,6 +920,57 @@ add_local_bool_reloption(local_relopts *relopts, const char *name, add_local_reloption(relopts, (relopt_gen *) newoption, offset); } +/* + * init_ternary_reloption + * Allocate and initialize a new ternary reloption + */ +static relopt_ternary * +init_ternary_reloption(bits32 kinds, const char *name, const char *desc, + pg_ternary default_val, LOCKMODE lockmode) +{ + relopt_ternary *newoption; + + newoption = (relopt_ternary *) + allocate_reloption(kinds, RELOPT_TYPE_TERNARY, name, desc, lockmode); + newoption->default_val = default_val; + + return newoption; +} + +/* + * add_ternary_reloption + * Add a new ternary reloption + */ +void +add_ternary_reloption(bits32 kinds, const char *name, const char *desc, + pg_ternary default_val, LOCKMODE lockmode) +{ + relopt_ternary *newoption; + + newoption = + init_ternary_reloption(kinds, name, desc, default_val, lockmode); + + add_reloption((relopt_gen *) newoption); +} + +/* + * add_local_ternary_reloption + * Add a new ternary local reloption + * + * 'offset' is offset of ternary-typed field. + */ +void +add_local_ternary_reloption(local_relopts *relopts, const char *name, + const char *desc, pg_ternary default_val, + int offset) +{ + relopt_ternary *newoption; + + newoption = + init_ternary_reloption(RELOPT_KIND_LOCAL, name, desc, default_val, 0); + + add_local_reloption(relopts, (relopt_gen *) newoption, offset); +} /* * init_real_reloption @@ -1626,6 +1705,19 @@ parse_one_reloption(relopt_value *option, char *text_str, int text_len, option->gen->name, value))); } break; + case RELOPT_TYPE_TERNARY: + { + bool b; + + parsed = parse_bool(value, &b); + option->values.ternary_val = b ? TERNARY_TRUE : TERNARY_FALSE; + if (validate && !parsed) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid value for ternary option \"%s\": %s", + option->gen->name, value))); + } + break; case RELOPT_TYPE_INT: { relopt_int *optint = (relopt_int *) option->gen; @@ -1789,17 +1881,6 @@ fillRelOptions(void *rdopts, Size basesize, char *itempos = ((char *) rdopts) + elems[j].offset; char *string_val; - /* - * If isset_offset is provided, store whether the reloption is - * set there. - */ - if (elems[j].isset_offset > 0) - { - char *setpos = ((char *) rdopts) + elems[j].isset_offset; - - *(bool *) setpos = options[i].isset; - } - switch (options[i].gen->type) { case RELOPT_TYPE_BOOL: @@ -1807,6 +1888,11 @@ fillRelOptions(void *rdopts, Size basesize, options[i].values.bool_val : ((relopt_bool *) options[i].gen)->default_val; break; + case RELOPT_TYPE_TERNARY: + *(pg_ternary *) itempos = options[i].isset ? + options[i].values.ternary_val : + ((relopt_ternary *) options[i].gen)->default_val; + break; case RELOPT_TYPE_INT: *(int *) itempos = options[i].isset ? options[i].values.int_val : @@ -1923,8 +2009,8 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind) offsetof(StdRdOptions, parallel_workers)}, {"vacuum_index_cleanup", RELOPT_TYPE_ENUM, offsetof(StdRdOptions, vacuum_index_cleanup)}, - {"vacuum_truncate", RELOPT_TYPE_BOOL, - offsetof(StdRdOptions, vacuum_truncate), offsetof(StdRdOptions, vacuum_truncate_set)}, + {"vacuum_truncate", RELOPT_TYPE_TERNARY, + offsetof(StdRdOptions, vacuum_truncate)}, {"vacuum_max_eager_freeze_failure_rate", RELOPT_TYPE_REAL, offsetof(StdRdOptions, vacuum_max_eager_freeze_failure_rate)} }; @@ -2004,7 +2090,6 @@ build_local_reloptions(local_relopts *relopts, Datum options, bool validate) elems[i].optname = opt->option->name; elems[i].opttype = opt->option->type; elems[i].offset = opt->offset; - elems[i].isset_offset = 0; /* not supported for local relopts yet */ i++; } diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index aa4fbec143f..696eab9bd97 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -2224,9 +2224,9 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams params, { StdRdOptions *opts = (StdRdOptions *) rel->rd_options; - if (opts && opts->vacuum_truncate_set) + if (opts && opts->vacuum_truncate != TERNARY_UNSET) { - if (opts->vacuum_truncate) + if (opts->vacuum_truncate == TERNARY_TRUE) params.truncate = VACOPTVALUE_ENABLED; else params.truncate = VACOPTVALUE_DISABLED; diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h index 2f08e1b0cf0..dfbef2babf2 100644 --- a/src/include/access/reloptions.h +++ b/src/include/access/reloptions.h @@ -29,6 +29,7 @@ typedef enum relopt_type { RELOPT_TYPE_BOOL, + RELOPT_TYPE_TERNARY, /* on, off, unset */ RELOPT_TYPE_INT, RELOPT_TYPE_REAL, RELOPT_TYPE_ENUM, @@ -80,6 +81,7 @@ typedef struct relopt_value union { bool bool_val; + pg_ternary ternary_val; int int_val; double real_val; int enum_val; @@ -94,6 +96,12 @@ typedef struct relopt_bool bool default_val; } relopt_bool; +typedef struct relopt_ternary +{ + relopt_gen gen; + int default_val; +} relopt_ternary; + typedef struct relopt_int { relopt_gen gen; @@ -152,19 +160,6 @@ typedef struct const char *optname; /* option's name */ relopt_type opttype; /* option's datatype */ int offset; /* offset of field in result struct */ - - /* - * isset_offset is an optional offset of a field in the result struct that - * stores whether the option is explicitly set for the relation or if it - * just picked up the default value. In most cases, this can be - * accomplished by giving the reloption a special out-of-range default - * value (e.g., some integer reloptions use -2), but this isn't always - * possible. For example, a Boolean reloption cannot be given an - * out-of-range default, so we need another way to discover the source of - * its value. This offset is only used if given a value greater than - * zero. - */ - int isset_offset; } relopt_parse_elt; /* Local reloption definition */ @@ -195,6 +190,9 @@ typedef struct local_relopts extern relopt_kind add_reloption_kind(void); extern void add_bool_reloption(bits32 kinds, const char *name, const char *desc, bool default_val, LOCKMODE lockmode); +extern void add_ternary_reloption(bits32 kinds, const char *name, + const char *desc, pg_ternary default_val, + LOCKMODE lockmode); extern void add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_val, int min_val, int max_val, LOCKMODE lockmode); @@ -214,6 +212,9 @@ extern void register_reloptions_validator(local_relopts *relopts, extern void add_local_bool_reloption(local_relopts *relopts, const char *name, const char *desc, bool default_val, int offset); +extern void add_local_ternary_reloption(local_relopts *relopts, + const char *name, const char *desc, + pg_ternary default_val, int offset); extern void add_local_int_reloption(local_relopts *relopts, const char *name, const char *desc, int default_val, int min_val, int max_val, int offset); diff --git a/src/include/postgres.h b/src/include/postgres.h index 7d93fbce709..47c88780776 100644 --- a/src/include/postgres.h +++ b/src/include/postgres.h @@ -543,6 +543,21 @@ Float8GetDatum(float8 X) * ---------------------------------------------------------------- */ +/* + * pg_ternary + * Boolean value with an extra "unset" value + * + * This enum can be used for values that want to distinguish between true, + * false, and unset. +*/ + +typedef enum pg_ternary +{ + TERNARY_FALSE = 0, + TERNARY_TRUE = 1, + TERNARY_UNSET = -1 +} pg_ternary; + /* * NON_EXEC_STATIC: It's sometimes useful to define a variable or function * that is normally static but extern when using EXEC_BACKEND (see diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index d03ab247788..5feb18a5373 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -347,8 +347,7 @@ typedef struct StdRdOptions bool user_catalog_table; /* use as an additional catalog relation */ int parallel_workers; /* max number of parallel workers */ StdRdOptIndexCleanup vacuum_index_cleanup; /* controls index vacuuming */ - bool vacuum_truncate; /* enables vacuum to truncate a relation */ - bool vacuum_truncate_set; /* whether vacuum_truncate is set */ + pg_ternary vacuum_truncate; /* enables vacuum to truncate a relation */ /* * Fraction of pages in a relation that vacuum can eagerly scan and fail diff --git a/src/test/regress/expected/reloptions.out b/src/test/regress/expected/reloptions.out index 9de19b4e3f1..1c99f79ab01 100644 --- a/src/test/regress/expected/reloptions.out +++ b/src/test/regress/expected/reloptions.out @@ -98,6 +98,42 @@ SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; {fillfactor=13,autovacuum_enabled=false} (1 row) +-- Tests for future (FIXME) ternary options +-- behave as boolean option: accept unassigned name and truncated value +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test(i INT) WITH (vacuum_truncate); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +------------------------ + {vacuum_truncate=true} +(1 row) + +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test(i INT) WITH (vacuum_truncate=FaLS); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +------------------------ + {vacuum_truncate=fals} +(1 row) + +-- preferred "true" alias is used when storing +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test(i INT) WITH (vacuum_index_cleanup=on); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +--------------------------- + {vacuum_index_cleanup=on} +(1 row) + +-- custom "third" value is available +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test(i INT) WITH (vacuum_index_cleanup=auto); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +----------------------------- + {vacuum_index_cleanup=auto} +(1 row) + -- Test vacuum_truncate option DROP TABLE reloptions_test; CREATE TEMP TABLE reloptions_test(i INT NOT NULL, j text) diff --git a/src/test/regress/sql/reloptions.sql b/src/test/regress/sql/reloptions.sql index 24fbe0b478d..f5980dafcbc 100644 --- a/src/test/regress/sql/reloptions.sql +++ b/src/test/regress/sql/reloptions.sql @@ -59,6 +59,27 @@ UPDATE pg_class ALTER TABLE reloptions_test RESET (illegal_option); SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; +-- Tests for future (FIXME) ternary options + +-- behave as boolean option: accept unassigned name and truncated value +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test(i INT) WITH (vacuum_truncate); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test(i INT) WITH (vacuum_truncate=FaLS); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + +-- preferred "true" alias is used when storing +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test(i INT) WITH (vacuum_index_cleanup=on); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + +-- custom "third" value is available +DROP TABLE reloptions_test; +CREATE TABLE reloptions_test(i INT) WITH (vacuum_index_cleanup=auto); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + -- Test vacuum_truncate option DROP TABLE reloptions_test; diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 3f3a888fd0e..1c8610fd46c 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -3952,6 +3952,7 @@ pg_sha512_ctx pg_snapshot pg_special_case pg_stack_base_t +pg_ternary pg_time_t pg_time_usec_t pg_tz @@ -4079,6 +4080,7 @@ relopt_kind relopt_parse_elt relopt_real relopt_string +relopt_ternary relopt_type relopt_value relopts_validator -- 2.47.3 --c36t3fndxhkzbl5z-- ^ permalink raw reply [nested|flat] 12+ messages in thread
end of thread, other threads:[~2026-01-16 15:04 UTC | newest] Thread overview: 12+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2024-03-22 21:09 [PATCH v11 11/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v8 11/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v9 10/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v8 11/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v9 10/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v10 11/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v9 10/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v10 11/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v11 11/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v12 11/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2024-03-22 21:09 [PATCH v8 11/17] table_scan_bitmap_next_block counts lossy and exact pages Melanie Plageman <[email protected]> 2026-01-16 15:04 [PATCH v3] Introduce ternary reloptions Álvaro Herrera <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox