Skip to content

Commit 64c19e4

Browse files
author
Nikita Glukhov
committed
Add jsonbRegisterIterator()
1 parent bd947cf commit 64c19e4

File tree

4 files changed

+31
-3
lines changed

4 files changed

+31
-3
lines changed

src/backend/access/common/detoast.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ create_detoast_iterator(struct varlena *attr)
4242
iter = (DetoastIterator) palloc0(sizeof(DetoastIteratorData));
4343
iter->done = false;
4444
iter->nrefs = 1;
45+
iter->gen.free = (void (*)(void *)) free_detoast_iterator;
4546

4647
/* This is an externally stored datum --- initialize fetch datum iterator */
4748
iter->fetch_datum_iterator = fetch_iter = create_fetch_datum_iterator(attr);
@@ -86,6 +87,7 @@ create_detoast_iterator(struct varlena *attr)
8687
iter = (DetoastIterator) palloc0(sizeof(DetoastIteratorData));
8788
iter->done = false;
8889
iter->nrefs = 1;
90+
iter->gen.free = (void (*)(void *)) free_detoast_iterator;
8991

9092
iter->fetch_datum_iterator = palloc0(sizeof(*iter->fetch_datum_iterator));
9193
iter->fetch_datum_iterator->buf = buf = create_toast_buffer(VARSIZE_ANY(attr), true);

src/backend/utils/adt/jsonb_util.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3022,14 +3022,31 @@ jsonbFreeIterators(void)
30223022
if (jsonb_detoast_iterators)
30233023
{
30243024
foreach(lc, jsonb_detoast_iterators->iterators)
3025-
free_detoast_iterator(lfirst(lc));
3025+
{
3026+
GenericDetoastIterator iter = lfirst(lc);
3027+
3028+
iter->free(iter);
3029+
}
30263030

30273031
pfree(jsonb_detoast_iterators);
30283032
jsonb_detoast_iterators = NULL;
30293033
}
30303034
#endif
30313035
}
30323036

3037+
MemoryContext
3038+
jsonbGetIteratorContext(void)
3039+
{
3040+
return jsonb_detoast_iterators ? jsonb_detoast_iterators->mcxt : NULL;
3041+
}
3042+
3043+
void
3044+
jsonbRegisterIterator(GenericDetoastIterator iter)
3045+
{
3046+
if (jsonb_detoast_iterators)
3047+
jsonb_detoast_iterators->iterators = lappend(jsonb_detoast_iterators->iterators, iter);
3048+
}
3049+
30333050
static void
30343051
jsonbzFree(JsonContainer *jc)
30353052
{
@@ -3059,7 +3076,7 @@ jsonbzInit(JsonContainerData *jc, Datum value)
30593076
#ifdef JSONB_FREE_ITERATORS
30603077
if (jsonb_detoast_iterators)
30613078
{
3062-
jsonb_detoast_iterators->iterators = lappend(jsonb_detoast_iterators->iterators, iter);
3079+
jsonbRegisterIterator(&iter->gen);
30633080
MemoryContextSwitchTo(oldcxt);
30643081
}
30653082
#endif
@@ -3152,7 +3169,7 @@ DatumGetJsonbPC(Datum datum, Json *tmp, bool copy)
31523169
# ifdef JSONB_FREE_ITERATORS
31533170
if (jsonb_detoast_iterators)
31543171
{
3155-
jsonb_detoast_iterators->iterators = lappend(jsonb_detoast_iterators->iterators, iter);
3172+
jsonbRegisterIterator(&iter->gen);
31563173
MemoryContextSwitchTo(oldcxt);
31573174
}
31583175
# endif

src/include/access/detoast.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,14 @@ typedef struct FetchDatumIteratorData
9393

9494
typedef struct FetchDatumIteratorData *FetchDatumIterator;
9595

96+
typedef struct GenericDetoastIteratorData
97+
{
98+
void (*free)(void *iter);
99+
} GenericDetoastIteratorData, *GenericDetoastIterator;
100+
96101
typedef struct DetoastIteratorData
97102
{
103+
GenericDetoastIteratorData gen;
98104
ToastBuffer *buf;
99105
FetchDatumIterator fetch_datum_iterator;
100106
int nrefs;

src/include/utils/jsonb.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "lib/stringinfo.h"
1616
#include "utils/array.h"
1717
#include "utils/numeric.h"
18+
#include "access/detoast.h"
1819

1920
/* Tokens used when sequentially processing a jsonb value */
2021
typedef enum
@@ -256,5 +257,7 @@ extern bool jsonb_partial_detoast; /* GUC */
256257

257258
extern void jsonbInitIterators(void);
258259
extern void jsonbFreeIterators(void);
260+
extern MemoryContext jsonbGetIteratorContext(void);
261+
extern void jsonbRegisterIterator(GenericDetoastIterator iter);
259262

260263
#endif /* __JSONB_H__ */

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy