File tree Expand file tree Collapse file tree 5 files changed +38
-15
lines changed Expand file tree Collapse file tree 5 files changed +38
-15
lines changed Original file line number Diff line number Diff line change @@ -3907,6 +3907,29 @@ nextUnnest(UnnestState *state)
3907
3907
return (r == state->type) ? JsonbValueToJsonb(&v) : NULL;
3908
3908
}
3909
3909
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
+
3910
3933
static void
3911
3934
finiUnnest(UnnestState *state)
3912
3935
{
@@ -3977,12 +4000,12 @@ jsonb_unnest_key(PG_FUNCTION_ARGS)
3977
4000
funcctx = SRF_PERCALL_SETUP();
3978
4001
state = funcctx->user_fctx;
3979
4002
3980
- if (state == NULL || (r = nextUnnest (state)) == NULL)
4003
+ if (state == NULL || (r = nextUnnestKey (state)) == NULL)
3981
4004
{
3982
4005
finiUnnest(state);
3983
4006
SRF_RETURN_DONE(funcctx);
3984
4007
}
3985
4008
3986
- SRF_RETURN_NEXT(funcctx, JsonbGetDatum (r));
4009
+ SRF_RETURN_NEXT(funcctx, PointerGetDatum (r));
3987
4010
}
3988
4011
Original file line number Diff line number Diff line change @@ -4878,7 +4878,7 @@ DATA(insert OID = 7645 ( unnest_element PGNSP PGUID 12 1 100 0 0 f f f f t
4878
4878
DESCR("expand elements from jsonb");
4879
4879
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_ ));
4880
4880
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_ ));
4882
4882
DESCR("expand keys from jsonb");
4883
4883
/* txid */
4884
4884
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_ ));
Original file line number Diff line number Diff line change @@ -2118,19 +2118,19 @@ SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
2118
2118
42
2119
2119
(1 row)
2120
2120
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' );
2122
2122
count
2123
2123
-------
2124
2124
203
2125
2125
(1 row)
2126
2126
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' );
2128
2128
count
2129
2129
-------
2130
2130
2
2131
2131
(1 row)
2132
2132
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' );
2134
2134
count
2135
2135
-------
2136
2136
120
@@ -2167,7 +2167,7 @@ SELECT count(*) FROM testjsonb WHERE ANY ELEMENT OF j->'array' AS e SATISFIES (
2167
2167
(1 row)
2168
2168
2169
2169
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 )
2171
2171
);
2172
2172
count
2173
2173
-------
Original file line number Diff line number Diff line change @@ -2118,19 +2118,19 @@ SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
2118
2118
42
2119
2119
(1 row)
2120
2120
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' );
2122
2122
count
2123
2123
-------
2124
2124
203
2125
2125
(1 row)
2126
2126
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' );
2128
2128
count
2129
2129
-------
2130
2130
2
2131
2131
(1 row)
2132
2132
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' );
2134
2134
count
2135
2135
-------
2136
2136
120
@@ -2167,7 +2167,7 @@ SELECT count(*) FROM testjsonb WHERE ANY ELEMENT OF j->'array' AS e SATISFIES (
2167
2167
(1 row)
2168
2168
2169
2169
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 )
2171
2171
);
2172
2172
count
2173
2173
-------
Original file line number Diff line number Diff line change @@ -519,16 +519,16 @@ SELECT count(*) FROM testjsonb WHERE j ? 'bar';
519
519
SELECT count(*) FROM testjsonb WHERE j ?| ARRAY['public','disabled'];
520
520
SELECT count(*) FROM testjsonb WHERE j ?& ARRAY['public','disabled'];
521
521
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' );
525
525
SELECT count(*) FROM testjsonb WHERE ANY VALUE OF j AS v SATISFIES ( v = '"CAB"'::jsonb );
526
526
SELECT count(*) FROM testjsonb WHERE ANY VALUE OF j AS v SATISFIES ( v = '"baz"'::jsonb );
527
527
SELECT count(*) FROM testjsonb WHERE ANY VALUE ANYWHERE OF j AS v SATISFIES ( v = '"baz"'::jsonb );
528
528
SELECT count(*) FROM testjsonb WHERE ANY ELEMENT ANYWHERE OF j AS v SATISFIES ( v = '"baz"'::jsonb );
529
529
SELECT count(*) FROM testjsonb WHERE ANY ELEMENT OF j->'array' AS e SATISFIES ( e = '"baz"'::jsonb );
530
530
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 )
532
532
);
533
533
534
534
CREATE INDEX jidx ON testjsonb USING gin (j);
You can’t perform that action at this time.
0 commit comments