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)