Skip to content

Commit 04a08d5

Browse files
committed
ANY KEY now returns text instead of jsonb
1 parent 89441c9 commit 04a08d5

File tree

5 files changed

+38
-15
lines changed

5 files changed

+38
-15
lines changed

src/backend/utils/adt/jsonfuncs.c

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3907,6 +3907,29 @@ nextUnnest(UnnestState *state)
39073907
return (r == state->type) ? JsonbValueToJsonb(&v) : NULL;
39083908
}
39093909

3910+
static text*
3911+
nextUnnestKey(UnnestState *state)
3912+
{
3913+
MemoryContext oldcontext;
3914+
JsonbValue v;
3915+
int r;
3916+
3917+
/*
3918+
* Iterator should work in long-lived memory context
3919+
*/
3920+
oldcontext = MemoryContextSwitchTo(state->ctx);
3921+
3922+
while((r = JsonbIteratorNext(&state->it, &v, state->skipNested)) != WJB_DONE)
3923+
{
3924+
if (r == state->type)
3925+
break;
3926+
}
3927+
3928+
MemoryContextSwitchTo(oldcontext);
3929+
3930+
return (r == state->type) ? cstring_to_text_with_len(v.val.string.val, v.val.string.len) : NULL;
3931+
}
3932+
39103933
static void
39113934
finiUnnest(UnnestState *state)
39123935
{
@@ -3977,12 +4000,12 @@ jsonb_unnest_key(PG_FUNCTION_ARGS)
39774000
funcctx = SRF_PERCALL_SETUP();
39784001
state = funcctx->user_fctx;
39794002

3980-
if (state == NULL || (r = nextUnnest(state)) == NULL)
4003+
if (state == NULL || (r = nextUnnestKey(state)) == NULL)
39814004
{
39824005
finiUnnest(state);
39834006
SRF_RETURN_DONE(funcctx);
39844007
}
39854008

3986-
SRF_RETURN_NEXT(funcctx, JsonbGetDatum(r));
4009+
SRF_RETURN_NEXT(funcctx, PointerGetDatum(r));
39874010
}
39884011

src/include/catalog/pg_proc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4878,7 +4878,7 @@ DATA(insert OID = 7645 ( unnest_element PGNSP PGUID 12 1 100 0 0 f f f f t
48784878
DESCR("expand elements from jsonb");
48794879
DATA(insert OID = 7646 ( unnest_value PGNSP PGUID 12 1 100 0 0 f f f f t t i 2 0 3802 "3802 16" _null_ _null_ _null_ _null_ _null_ jsonb_unnest_value _null_ _null_ _null_ ));
48804880
DESCR("expand values from jsonb");
4881-
DATA(insert OID = 7647 ( unnest_key PGNSP PGUID 12 1 100 0 0 f f f f t t i 2 0 3802 "3802 16" _null_ _null_ _null_ _null_ _null_ jsonb_unnest_key _null_ _null_ _null_ ));
4881+
DATA(insert OID = 7647 ( unnest_key PGNSP PGUID 12 1 100 0 0 f f f f t t i 2 0 25 "3802 16" _null_ _null_ _null_ _null_ _null_ jsonb_unnest_key _null_ _null_ _null_ ));
48824882
DESCR("expand keys from jsonb");
48834883
/* txid */
48844884
DATA(insert OID = 2939 ( txid_snapshot_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2970 "2275" _null_ _null_ _null_ _null_ _null_ txid_snapshot_in _null_ _null_ _null_ ));

src/test/regress/expected/jsonb.out

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2118,19 +2118,19 @@ SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
21182118
42
21192119
(1 row)
21202120

2121-
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = '"pos"'::jsonb );
2121+
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = 'pos' );
21222122
count
21232123
-------
21242124
203
21252125
(1 row)
21262126

2127-
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = '"age"'::jsonb );
2127+
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = 'age' );
21282128
count
21292129
-------
21302130
2
21312131
(1 row)
21322132

2133-
SELECT count(*) FROM testjsonb WHERE EACH KEY OF j AS k SATISFIES ( k = '"age"'::jsonb );
2133+
SELECT count(*) FROM testjsonb WHERE EACH KEY OF j AS k SATISFIES ( k = 'age' );
21342134
count
21352135
-------
21362136
120
@@ -2167,7 +2167,7 @@ SELECT count(*) FROM testjsonb WHERE ANY ELEMENT OF j->'array' AS e SATISFIES (
21672167
(1 row)
21682168

21692169
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES (
2170-
k->>0 = 'array' AND ANY ELEMENT OF j->(k->>0) AS e SATISFIES ( e = '"baz"'::jsonb )
2170+
k = 'array' AND ANY ELEMENT OF j->k AS e SATISFIES ( e = '"baz"'::jsonb )
21712171
);
21722172
count
21732173
-------

src/test/regress/expected/jsonb_1.out

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2118,19 +2118,19 @@ SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
21182118
42
21192119
(1 row)
21202120

2121-
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = '"pos"'::jsonb );
2121+
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = 'pos' );
21222122
count
21232123
-------
21242124
203
21252125
(1 row)
21262126

2127-
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = '"age"'::jsonb );
2127+
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = 'age' );
21282128
count
21292129
-------
21302130
2
21312131
(1 row)
21322132

2133-
SELECT count(*) FROM testjsonb WHERE EACH KEY OF j AS k SATISFIES ( k = '"age"'::jsonb );
2133+
SELECT count(*) FROM testjsonb WHERE EACH KEY OF j AS k SATISFIES ( k = 'age' );
21342134
count
21352135
-------
21362136
120
@@ -2167,7 +2167,7 @@ SELECT count(*) FROM testjsonb WHERE ANY ELEMENT OF j->'array' AS e SATISFIES (
21672167
(1 row)
21682168

21692169
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES (
2170-
k->>0 = 'array' AND ANY ELEMENT OF j->(k->>0) AS e SATISFIES ( e = '"baz"'::jsonb )
2170+
k = 'array' AND ANY ELEMENT OF j->k AS e SATISFIES ( e = '"baz"'::jsonb )
21712171
);
21722172
count
21732173
-------

src/test/regress/sql/jsonb.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -519,16 +519,16 @@ SELECT count(*) FROM testjsonb WHERE j ? 'bar';
519519
SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled'];
520520
SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
521521

522-
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = '"pos"'::jsonb );
523-
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = '"age"'::jsonb );
524-
SELECT count(*) FROM testjsonb WHERE EACH KEY OF j AS k SATISFIES ( k = '"age"'::jsonb );
522+
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = 'pos' );
523+
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES ( k = 'age' );
524+
SELECT count(*) FROM testjsonb WHERE EACH KEY OF j AS k SATISFIES ( k = 'age' );
525525
SELECT count(*) FROM testjsonb WHERE ANY VALUE OF j AS v SATISFIES ( v = '"CAB"'::jsonb );
526526
SELECT count(*) FROM testjsonb WHERE ANY VALUE OF j AS v SATISFIES ( v = '"baz"'::jsonb );
527527
SELECT count(*) FROM testjsonb WHERE ANY VALUE ANYWHERE OF j AS v SATISFIES ( v = '"baz"'::jsonb );
528528
SELECT count(*) FROM testjsonb WHERE ANY ELEMENT ANYWHERE OF j AS v SATISFIES ( v = '"baz"'::jsonb );
529529
SELECT count(*) FROM testjsonb WHERE ANY ELEMENT OF j->'array' AS e SATISFIES ( e = '"baz"'::jsonb );
530530
SELECT count(*) FROM testjsonb WHERE ANY KEY OF j AS k SATISFIES (
531-
k->>0 = 'array' AND ANY ELEMENT OF j->(k->>0) AS e SATISFIES ( e = '"baz"'::jsonb )
531+
k = 'array' AND ANY ELEMENT OF j->k AS e SATISFIES ( e = '"baz"'::jsonb )
532532
);
533533

534534
CREATE INDEX jidx ON testjsonb USING gin (j);

0 commit comments

Comments
 (0)