Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd87a1e1

Browse files
committed
Fix = * for arrays and objects.
1 parent16c6cdf commitd87a1e1

File tree

1 file changed

+38
-63
lines changed

1 file changed

+38
-63
lines changed

‎jsonb_vodka_ops.c

Lines changed: 38 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@ typedef struct
3333

3434
#defineJSONB_VODKA_FLAG_VALUE0x01
3535

36-
#defineJSONB_VODKA_FLAG_NULL0x00
37-
#defineJSONB_VODKA_FLAG_STRING0x02
38-
#defineJSONB_VODKA_FLAG_NUMERIC0x04
39-
#defineJSONB_VODKA_FLAG_BOOL0x06
40-
#defineJSONB_VODKA_FLAG_TYPE0x06
41-
#defineJSONB_VODKA_FLAG_TRUE0x08
42-
#defineJSONB_VODKA_FLAG_NAN0x08
43-
#defineJSONB_VODKA_FLAG_NEGATIVE0x10
36+
#defineJSONB_VODKA_FLAG_NULL0x00
37+
#defineJSONB_VODKA_FLAG_STRING0x02
38+
#defineJSONB_VODKA_FLAG_NUMERIC0x04
39+
#defineJSONB_VODKA_FLAG_BOOL0x06
40+
#defineJSONB_VODKA_FLAG_EMPTY_ARRAY0x08
41+
#defineJSONB_VODKA_FLAG_EMPTY_OBJECT0x0A
42+
#defineJSONB_VODKA_FLAG_TYPE0x0E
43+
#defineJSONB_VODKA_FLAG_TRUE0x10
44+
#defineJSONB_VODKA_FLAG_NAN0x10
4445

4546
#defineJSONB_VODKA_FLAG_ARRAY0x02
4647

@@ -100,58 +101,6 @@ typedef struct PathStack
100101
structPathStack*parent;
101102
}PathStack;
102103

103-
staticint
104-
get_ndigits(Numericval)
105-
{
106-
constNumericDigit*digits;
107-
intndigits;
108-
109-
ndigits=NUMERIC_NDIGITS(val);
110-
digits=NUMERIC_DIGITS(val);
111-
112-
while (ndigits>0&&*digits==0)
113-
{
114-
ndigits--;
115-
digits++;
116-
}
117-
returnndigits;
118-
}
119-
120-
staticvoid
121-
write_numeric_key(Pointerptr,Numericval)
122-
{
123-
*ptr=JSONB_VODKA_FLAG_VALUE |JSONB_VODKA_FLAG_NUMERIC;
124-
if (NUMERIC_IS_NAN(val))
125-
{
126-
*ptr |=JSONB_VODKA_FLAG_NAN;
127-
}
128-
else
129-
{
130-
constNumericDigit*digits=NUMERIC_DIGITS(val);
131-
intndigits=NUMERIC_NDIGITS(val);
132-
intweight=NUMERIC_WEIGHT(val);
133-
intsign=NUMERIC_SIGN(val);
134-
135-
if (sign==NUMERIC_NEG)
136-
*ptr |=JSONB_VODKA_FLAG_NEGATIVE;
137-
ptr++;
138-
139-
while (ndigits>0&&*digits==0)
140-
{
141-
ndigits--;
142-
digits++;
143-
}
144-
145-
memcpy(ptr,&weight,sizeof(weight));
146-
ptr+=sizeof(weight);
147-
148-
memcpy(ptr,digits,sizeof(NumericDigit)*ndigits);
149-
ptr+=sizeof(NumericDigit)*ndigits;
150-
151-
*ptr=0;
152-
}
153-
}
154-
155104
staticbytea*
156105
get_vodka_key(PathStack*stack,constJsonbValue*val)
157106
{
@@ -179,6 +128,8 @@ get_vodka_key(PathStack *stack, const JsonbValue *val)
179128
{
180129
casejbvNull:
181130
casejbvBool:
131+
casejbvObject:
132+
casejbvArray:
182133
vallen=1;
183134
break;
184135
casejbvString:
@@ -226,6 +177,12 @@ get_vodka_key(PathStack *stack, const JsonbValue *val)
226177
if (val->val.boolean)
227178
*ptr |=JSONB_VODKA_FLAG_TRUE;
228179
break;
180+
casejbvArray:
181+
*ptr=JSONB_VODKA_FLAG_VALUE |JSONB_VODKA_FLAG_EMPTY_ARRAY;
182+
break;
183+
casejbvObject:
184+
*ptr=JSONB_VODKA_FLAG_VALUE |JSONB_VODKA_FLAG_EMPTY_OBJECT;
185+
break;
229186
casejbvString:
230187
*ptr=JSONB_VODKA_FLAG_VALUE |JSONB_VODKA_FLAG_STRING;
231188
hash=hash_any((unsignedchar*)val->val.string.val,val->val.string.len);
@@ -302,11 +259,19 @@ static int
302259
make_entry_handler(ExtractedNode*node,Pointerextra)
303260
{
304261
Entries*e= (Entries*)extra;
305-
PathItem*item;
262+
PathItem*item,*leaf=node->path;
306263
JsonbVodkaKey*key= (JsonbVodkaKey*)palloc(sizeof(JsonbVodkaKey));
307264
intlength=0,i;
308265

309-
item=node->path;
266+
if (!node->bounds.inequality&&node->bounds.exact&&node->bounds.exact->type==jqiAny)
267+
{
268+
item= (PathItem*)palloc(sizeof(PathItem));
269+
item->type=iAny;
270+
item->parent=leaf;
271+
leaf=item;
272+
}
273+
274+
item=leaf;
310275
while (item)
311276
{
312277
length++;
@@ -316,7 +281,7 @@ make_entry_handler(ExtractedNode *node, Pointer extra)
316281
key->path= (PathItem*)palloc(sizeof(PathItem)*length);
317282

318283
i=length-1;
319-
item=node->path;
284+
item=leaf;
320285
while (item)
321286
{
322287
key->path[i]=*item;
@@ -380,7 +345,17 @@ vodkajsonbextract(PG_FUNCTION_ARGS)
380345
switch (r)
381346
{
382347
caseWJB_BEGIN_ARRAY:
348+
if (v.val.array.nElems==0)
349+
entries[i++]=PointerGetDatum(get_vodka_key(stack,&v));
350+
tmp=stack;
351+
stack= (PathStack*)palloc(sizeof(PathStack));
352+
stack->s=NULL;
353+
stack->len=0;
354+
stack->parent=tmp;
355+
break;
383356
caseWJB_BEGIN_OBJECT:
357+
if (v.val.object.nPairs==0)
358+
entries[i++]=PointerGetDatum(get_vodka_key(stack,&v));
384359
tmp=stack;
385360
stack= (PathStack*)palloc(sizeof(PathStack));
386361
stack->s=NULL;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp