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