Skip to content

Commit 1c16053

Browse files
committed
Merge branch 'master' into vodka
2 parents 3ea91d7 + 4012393 commit 1c16053

File tree

2 files changed

+66
-14
lines changed

2 files changed

+66
-14
lines changed

jsonb_gin_ops.c

+28-14
Original file line numberDiff line numberDiff line change
@@ -656,13 +656,20 @@ gin_extract_jsonb_query_bloom_value(PG_FUNCTION_ARGS)
656656
case JsQueryMatchStrategyNumber:
657657
jq = PG_GETARG_JSQUERY(0);
658658
root = extractJsQuery(jq, make_bloom_entry_handler, (Pointer)&e);
659-
660-
*nentries = e.count;
661-
entries = e.entries;
662-
*pmatch = e.partial_match;
663-
*extra_data = e.extra_data;
664-
for (i = 0; i < e.count; i++)
665-
((KeyExtra *)e.extra_data[i])->root = root;
659+
if (root)
660+
{
661+
*nentries = e.count;
662+
entries = e.entries;
663+
*pmatch = e.partial_match;
664+
*extra_data = e.extra_data;
665+
for (i = 0; i < e.count; i++)
666+
((KeyExtra *)e.extra_data[i])->root = root;
667+
}
668+
else
669+
{
670+
entries = NULL;
671+
*nentries = 0;
672+
}
666673
break;
667674

668675
default:
@@ -1070,13 +1077,20 @@ gin_extract_jsonb_query_hash_value(PG_FUNCTION_ARGS)
10701077
case JsQueryMatchStrategyNumber:
10711078
jq = PG_GETARG_JSQUERY(0);
10721079
root = extractJsQuery(jq, make_hash_entry_handler, (Pointer)&e);
1073-
1074-
*nentries = e.count;
1075-
entries = e.entries;
1076-
*pmatch = e.partial_match;
1077-
*extra_data = e.extra_data;
1078-
for (i = 0; i < e.count; i++)
1079-
((KeyExtra *)e.extra_data[i])->root = root;
1080+
if (root)
1081+
{
1082+
*nentries = e.count;
1083+
entries = e.entries;
1084+
*pmatch = e.partial_match;
1085+
*extra_data = e.extra_data;
1086+
for (i = 0; i < e.count; i++)
1087+
((KeyExtra *)e.extra_data[i])->root = root;
1088+
}
1089+
else
1090+
{
1091+
entries = NULL;
1092+
*nentries = 0;
1093+
}
10801094
break;
10811095

10821096
default:

jsquery_extract.c

+38
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,42 @@ makeEntries(ExtractedNode *node, MakeEntryHandler handler, Pointer extra)
568568
}
569569
}
570570

571+
static bool
572+
queryHasPositive(ExtractedNode *node)
573+
{
574+
int i;
575+
bool result;
576+
switch(node->type)
577+
{
578+
case eAnd:
579+
result = false;
580+
for (i = 0; i < node->args.count; i++)
581+
{
582+
if (queryHasPositive(node->args.items[i]))
583+
{
584+
result = true;
585+
break;
586+
}
587+
}
588+
return result;
589+
case eOr:
590+
result = true;
591+
for (i = 0; i < node->args.count; i++)
592+
{
593+
if (!queryHasPositive(node->args.items[i]))
594+
{
595+
result = false;
596+
break;
597+
}
598+
}
599+
return result;
600+
case eNot:
601+
return !queryHasPositive(node->args.items[0]);
602+
case eScalar:
603+
return true;
604+
}
605+
}
606+
571607
ExtractedNode *
572608
extractJsQuery(JsQuery *jq, MakeEntryHandler handler, Pointer extra)
573609
{
@@ -580,6 +616,8 @@ extractJsQuery(JsQuery *jq, MakeEntryHandler handler, Pointer extra)
580616
simplifyRecursive(root);
581617
root = makeEntries(root, handler, extra);
582618
}
619+
if (root && !queryHasPositive(root))
620+
root = NULL;
583621
return root;
584622
}
585623

0 commit comments

Comments
 (0)