13
13
*/
14
14
#include "postgres.h"
15
15
16
+ #include "catalog/pg_type.h"
16
17
#include "miscadmin.h"
17
18
#include "utils/jsonb.h"
18
19
@@ -34,10 +35,9 @@ jsonb_exists(PG_FUNCTION_ARGS)
34
35
kval .val .string .val = VARDATA_ANY (key );
35
36
kval .val .string .len = VARSIZE_ANY_EXHDR (key );
36
37
37
- v = findJsonbValueFromSuperHeader (VARDATA (jb ),
38
- JB_FOBJECT | JB_FARRAY ,
39
- NULL ,
40
- & kval );
38
+ v = findJsonbValueFromContainer (& jb -> root ,
39
+ JB_FOBJECT | JB_FARRAY ,
40
+ & kval );
41
41
42
42
PG_RETURN_BOOL (v != NULL );
43
43
}
@@ -47,29 +47,28 @@ jsonb_exists_any(PG_FUNCTION_ARGS)
47
47
{
48
48
Jsonb * jb = PG_GETARG_JSONB (0 );
49
49
ArrayType * keys = PG_GETARG_ARRAYTYPE_P (1 );
50
- JsonbValue * arrKey = arrayToJsonbSortedArray (keys );
51
- uint32 * plowbound = NULL ,
52
- lowbound = 0 ;
53
50
int i ;
51
+ Datum * key_datums ;
52
+ bool * key_nulls ;
53
+ int elem_count ;
54
54
55
- if (arrKey == NULL || arrKey -> val .object .nPairs == 0 )
56
- PG_RETURN_BOOL (false);
57
-
58
- if (JB_ROOT_IS_OBJECT (jb ))
59
- plowbound = & lowbound ;
55
+ deconstruct_array (keys , TEXTOID , -1 , false, 'i' , & key_datums , & key_nulls ,
56
+ & elem_count );
60
57
61
- /*
62
- * We exploit the fact that the pairs list is already sorted into strictly
63
- * increasing order to narrow the findJsonbValueFromSuperHeader search;
64
- * each search can start one entry past the previous "found" entry, or at
65
- * the lower bound of the last search.
66
- */
67
- for (i = 0 ; i < arrKey -> val .array .nElems ; i ++ )
58
+ for (i = 0 ; i < elem_count ; i ++ )
68
59
{
69
- if (findJsonbValueFromSuperHeader (VARDATA (jb ),
70
- JB_FOBJECT | JB_FARRAY ,
71
- plowbound ,
72
- arrKey -> val .array .elems + i ) != NULL )
60
+ JsonbValue strVal ;
61
+
62
+ if (key_nulls [i ])
63
+ continue ;
64
+
65
+ strVal .type = jbvString ;
66
+ strVal .val .string .val = VARDATA (key_datums [i ]);
67
+ strVal .val .string .len = VARSIZE (key_datums [i ]) - VARHDRSZ ;
68
+
69
+ if (findJsonbValueFromContainer (& jb -> root ,
70
+ JB_FOBJECT | JB_FARRAY ,
71
+ & strVal ) != NULL )
73
72
PG_RETURN_BOOL (true);
74
73
}
75
74
@@ -81,29 +80,28 @@ jsonb_exists_all(PG_FUNCTION_ARGS)
81
80
{
82
81
Jsonb * jb = PG_GETARG_JSONB (0 );
83
82
ArrayType * keys = PG_GETARG_ARRAYTYPE_P (1 );
84
- JsonbValue * arrKey = arrayToJsonbSortedArray (keys );
85
- uint32 * plowbound = NULL ;
86
- uint32 lowbound = 0 ;
87
83
int i ;
84
+ Datum * key_datums ;
85
+ bool * key_nulls ;
86
+ int elem_count ;
88
87
89
- if ( arrKey == NULL || arrKey -> val . array . nElems == 0 )
90
- PG_RETURN_BOOL (true );
88
+ deconstruct_array ( keys , TEXTOID , -1 , false, 'i' , & key_datums , & key_nulls ,
89
+ & elem_count );
91
90
92
- if (JB_ROOT_IS_OBJECT (jb ))
93
- plowbound = & lowbound ;
94
-
95
- /*
96
- * We exploit the fact that the pairs list is already sorted into strictly
97
- * increasing order to narrow the findJsonbValueFromSuperHeader search;
98
- * each search can start one entry past the previous "found" entry, or at
99
- * the lower bound of the last search.
100
- */
101
- for (i = 0 ; i < arrKey -> val .array .nElems ; i ++ )
91
+ for (i = 0 ; i < elem_count ; i ++ )
102
92
{
103
- if (findJsonbValueFromSuperHeader (VARDATA (jb ),
104
- JB_FOBJECT | JB_FARRAY ,
105
- plowbound ,
106
- arrKey -> val .array .elems + i ) == NULL )
93
+ JsonbValue strVal ;
94
+
95
+ if (key_nulls [i ])
96
+ continue ;
97
+
98
+ strVal .type = jbvString ;
99
+ strVal .val .string .val = VARDATA (key_datums [i ]);
100
+ strVal .val .string .len = VARSIZE (key_datums [i ]) - VARHDRSZ ;
101
+
102
+ if (findJsonbValueFromContainer (& jb -> root ,
103
+ JB_FOBJECT | JB_FARRAY ,
104
+ & strVal ) == NULL )
107
105
PG_RETURN_BOOL (false);
108
106
}
109
107
@@ -123,8 +121,8 @@ jsonb_contains(PG_FUNCTION_ARGS)
123
121
JB_ROOT_IS_OBJECT (val ) != JB_ROOT_IS_OBJECT (tmpl ))
124
122
PG_RETURN_BOOL (false);
125
123
126
- it1 = JsonbIteratorInit (VARDATA ( val ) );
127
- it2 = JsonbIteratorInit (VARDATA ( tmpl ) );
124
+ it1 = JsonbIteratorInit (& val -> root );
125
+ it2 = JsonbIteratorInit (& tmpl -> root );
128
126
129
127
PG_RETURN_BOOL (JsonbDeepContains (& it1 , & it2 ));
130
128
}
@@ -143,8 +141,8 @@ jsonb_contained(PG_FUNCTION_ARGS)
143
141
JB_ROOT_IS_OBJECT (val ) != JB_ROOT_IS_OBJECT (tmpl ))
144
142
PG_RETURN_BOOL (false);
145
143
146
- it1 = JsonbIteratorInit (VARDATA ( val ) );
147
- it2 = JsonbIteratorInit (VARDATA ( tmpl ) );
144
+ it1 = JsonbIteratorInit (& val -> root );
145
+ it2 = JsonbIteratorInit (& tmpl -> root );
148
146
149
147
PG_RETURN_BOOL (JsonbDeepContains (& it1 , & it2 ));
150
148
}
@@ -156,7 +154,7 @@ jsonb_ne(PG_FUNCTION_ARGS)
156
154
Jsonb * jbb = PG_GETARG_JSONB (1 );
157
155
bool res ;
158
156
159
- res = (compareJsonbSuperHeaderValue ( VARDATA ( jba ), VARDATA ( jbb ) ) != 0 );
157
+ res = (compareJsonbContainers ( & jba -> root , & jbb -> root ) != 0 );
160
158
161
159
PG_FREE_IF_COPY (jba , 0 );
162
160
PG_FREE_IF_COPY (jbb , 1 );
@@ -173,7 +171,7 @@ jsonb_lt(PG_FUNCTION_ARGS)
173
171
Jsonb * jbb = PG_GETARG_JSONB (1 );
174
172
bool res ;
175
173
176
- res = (compareJsonbSuperHeaderValue ( VARDATA ( jba ), VARDATA ( jbb ) ) < 0 );
174
+ res = (compareJsonbContainers ( & jba -> root , & jbb -> root ) < 0 );
177
175
178
176
PG_FREE_IF_COPY (jba , 0 );
179
177
PG_FREE_IF_COPY (jbb , 1 );
@@ -187,7 +185,7 @@ jsonb_gt(PG_FUNCTION_ARGS)
187
185
Jsonb * jbb = PG_GETARG_JSONB (1 );
188
186
bool res ;
189
187
190
- res = (compareJsonbSuperHeaderValue ( VARDATA ( jba ), VARDATA ( jbb ) ) > 0 );
188
+ res = (compareJsonbContainers ( & jba -> root , & jbb -> root ) > 0 );
191
189
192
190
PG_FREE_IF_COPY (jba , 0 );
193
191
PG_FREE_IF_COPY (jbb , 1 );
@@ -201,7 +199,7 @@ jsonb_le(PG_FUNCTION_ARGS)
201
199
Jsonb * jbb = PG_GETARG_JSONB (1 );
202
200
bool res ;
203
201
204
- res = (compareJsonbSuperHeaderValue ( VARDATA ( jba ), VARDATA ( jbb ) ) <= 0 );
202
+ res = (compareJsonbContainers ( & jba -> root , & jbb -> root ) <= 0 );
205
203
206
204
PG_FREE_IF_COPY (jba , 0 );
207
205
PG_FREE_IF_COPY (jbb , 1 );
@@ -215,7 +213,7 @@ jsonb_ge(PG_FUNCTION_ARGS)
215
213
Jsonb * jbb = PG_GETARG_JSONB (1 );
216
214
bool res ;
217
215
218
- res = (compareJsonbSuperHeaderValue ( VARDATA ( jba ), VARDATA ( jbb ) ) >= 0 );
216
+ res = (compareJsonbContainers ( & jba -> root , & jbb -> root ) >= 0 );
219
217
220
218
PG_FREE_IF_COPY (jba , 0 );
221
219
PG_FREE_IF_COPY (jbb , 1 );
@@ -229,7 +227,7 @@ jsonb_eq(PG_FUNCTION_ARGS)
229
227
Jsonb * jbb = PG_GETARG_JSONB (1 );
230
228
bool res ;
231
229
232
- res = (compareJsonbSuperHeaderValue ( VARDATA ( jba ), VARDATA ( jbb ) ) == 0 );
230
+ res = (compareJsonbContainers ( & jba -> root , & jbb -> root ) == 0 );
233
231
234
232
PG_FREE_IF_COPY (jba , 0 );
235
233
PG_FREE_IF_COPY (jbb , 1 );
@@ -243,7 +241,7 @@ jsonb_cmp(PG_FUNCTION_ARGS)
243
241
Jsonb * jbb = PG_GETARG_JSONB (1 );
244
242
int res ;
245
243
246
- res = compareJsonbSuperHeaderValue ( VARDATA ( jba ), VARDATA ( jbb ) );
244
+ res = compareJsonbContainers ( & jba -> root , & jbb -> root );
247
245
248
246
PG_FREE_IF_COPY (jba , 0 );
249
247
PG_FREE_IF_COPY (jbb , 1 );
@@ -265,7 +263,7 @@ jsonb_hash(PG_FUNCTION_ARGS)
265
263
if (JB_ROOT_COUNT (jb ) == 0 )
266
264
PG_RETURN_INT32 (0 );
267
265
268
- it = JsonbIteratorInit (VARDATA ( jb ) );
266
+ it = JsonbIteratorInit (& jb -> root );
269
267
270
268
while ((r = JsonbIteratorNext (& it , & v , false)) != WJB_DONE )
271
269
{
0 commit comments