diff options
author | Amit Kapila <akapila@postgresql.org> | 2024-10-07 14:53:18 +0530 |
---|---|---|
committer | Amit Kapila <akapila@postgresql.org> | 2024-10-07 14:53:18 +0530 |
commit | 8175a7d11f70589f6b44e28a8dd804f7542d0bbf (patch) | |
tree | 78d0d22f7449d19700601a6ccf56a417194a18e6 /src | |
parent | aef75219cc221cd4990eaec7d4213d85ed945069 (diff) | |
download | postgresql-8175a7d11f70589f6b44e28a8dd804f7542d0bbf.tar.gz postgresql-8175a7d11f70589f6b44e28a8dd804f7542d0bbf.zip |
Fix fetching default toast value during decoding of in-progress transactions.
During logical decoding of in-progress transactions, we perform the toast
table scan while fetching the default toast value for an attribute. We
forgot to initialize the flag during this scan to indicate that the system
table scan is in progress. We need this flag to ensure that during logical
decoding we never directly access the tableam or heap APIs because we check
for concurrent aborts only in systable_* APIs.
Reported-by: Alexander Lakhin
Author: Takeshi Ideriha, Hou Zhijie
Reviewed-by: Amit Kapila, Hou Zhijie
Backpatch-through: 14
Discussion: https://postgr.es/m/18641-6687273b7f15269d@postgresql.org
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/index/genam.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/backend/access/index/genam.c b/src/backend/access/index/genam.c index ede9660c9eb..76d3edd470e 100644 --- a/src/backend/access/index/genam.c +++ b/src/backend/access/index/genam.c @@ -703,6 +703,14 @@ systable_beginscan_ordered(Relation heapRelation, index_rescan(sysscan->iscan, key, nkeys, NULL, 0); sysscan->scan = NULL; + /* + * If CheckXidAlive is set then set a flag to indicate that system table + * scan is in-progress. See detailed comments in xact.c where these + * variables are declared. + */ + if (TransactionIdIsValid(CheckXidAlive)) + bsysscan = true; + return sysscan; } @@ -747,6 +755,14 @@ systable_endscan_ordered(SysScanDesc sysscan) index_endscan(sysscan->iscan); if (sysscan->snapshot) UnregisterSnapshot(sysscan->snapshot); + + /* + * Reset the bsysscan flag at the end of the systable scan. See detailed + * comments in xact.c where these variables are declared. + */ + if (TransactionIdIsValid(CheckXidAlive)) + bsysscan = false; + pfree(sysscan); } |