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)
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