diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c index a581659fe2..e8f76f1844 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -318,102 +318,103 @@ AssertCheckRanges(Ranges *ranges, FmgrInfo *cmpFn, Oid colloid) * Check that none of the values are not covered by ranges (both sorted * and unsorted) */ - for (i = 0; i < ranges->nvalues; i++) + if (ranges->nranges > 0) { - Datum compar; - int start, - end; - Datum minvalue, - maxvalue; - - Datum value = ranges->values[2 * ranges->nranges + i]; - - if (ranges->nranges == 0) - break; - - minvalue = ranges->values[0]; - maxvalue = ranges->values[2 * ranges->nranges - 1]; - - /* - * Is the value smaller than the minval? If yes, we'll recurse to the - * left side of range array. - */ - compar = FunctionCall2Coll(cmpFn, colloid, value, minvalue); - - /* smaller than the smallest value in the first range */ - if (DatumGetBool(compar)) - continue; - - /* - * Is the value greater than the maxval? If yes, we'll recurse to the - * right side of range array. - */ - compar = FunctionCall2Coll(cmpFn, colloid, maxvalue, value); - - /* larger than the largest value in the last range */ - if (DatumGetBool(compar)) - continue; - - start = 0; /* first range */ - end = ranges->nranges - 1; /* last range */ - while (true) + for (i = 0; i < ranges->nvalues; i++) { - int midpoint = (start + end) / 2; + Datum compar; + int start, + end; + Datum minvalue, + maxvalue; - /* this means we ran out of ranges in the last step */ - if (start > end) - break; + Datum value = ranges->values[2 * ranges->nranges + i]; - /* copy the min/max values from the ranges */ - minvalue = ranges->values[2 * midpoint]; - maxvalue = ranges->values[2 * midpoint + 1]; + minvalue = ranges->values[0]; + maxvalue = ranges->values[2 * ranges->nranges - 1]; /* - * Is the value smaller than the minval? If yes, we'll recurse to - * the left side of range array. + * Is the value smaller than the minval? If yes, we'll recurse to the + * left side of range array. */ compar = FunctionCall2Coll(cmpFn, colloid, value, minvalue); - /* smaller than the smallest value in this range */ + /* smaller than the smallest value in the first range */ if (DatumGetBool(compar)) - { - end = (midpoint - 1); continue; - } /* - * Is the value greater than the minval? If yes, we'll recurse to - * the right side of range array. + * Is the value greater than the maxval? If yes, we'll recurse to the + * right side of range array. */ compar = FunctionCall2Coll(cmpFn, colloid, maxvalue, value); - /* larger than the largest value in this range */ + /* larger than the largest value in the last range */ if (DatumGetBool(compar)) - { - start = (midpoint + 1); continue; - } - /* hey, we found a matching range */ - Assert(false); + start = 0; /* first range */ + end = ranges->nranges - 1; /* last range */ + while (true) + { + int midpoint = (start + end) / 2; + + /* this means we ran out of ranges in the last step */ + if (start > end) + break; + + /* copy the min/max values from the ranges */ + minvalue = ranges->values[2 * midpoint]; + maxvalue = ranges->values[2 * midpoint + 1]; + + /* + * Is the value smaller than the minval? If yes, we'll recurse to + * the left side of range array. + */ + compar = FunctionCall2Coll(cmpFn, colloid, value, minvalue); + + /* smaller than the smallest value in this range */ + if (DatumGetBool(compar)) + { + end = (midpoint - 1); + continue; + } + + /* + * Is the value greater than the minval? If yes, we'll recurse to + * the right side of range array. + */ + compar = FunctionCall2Coll(cmpFn, colloid, maxvalue, value); + + /* larger than the largest value in this range */ + if (DatumGetBool(compar)) + { + start = (midpoint + 1); + continue; + } + + /* hey, we found a matching range */ + Assert(false); + } } } /* and values in the unsorted part must not be in sorted part */ - for (i = ranges->nsorted; i < ranges->nvalues; i++) + if (ranges->nsorted > 0) { compare_context cxt; - Datum value = ranges->values[2 * ranges->nranges + i]; - - if (ranges->nsorted == 0) - break; cxt.colloid = ranges->colloid; cxt.cmpFn = ranges->cmp; - Assert(bsearch_arg(&value, &ranges->values[2 * ranges->nranges], - ranges->nsorted, sizeof(Datum), - compare_values, (void *) &cxt) == NULL); + for (i = ranges->nsorted; i < ranges->nvalues; i++) + { + Datum value = ranges->values[2 * ranges->nranges + i]; + + Assert(bsearch_arg(&value, &ranges->values[2 * ranges->nranges], + ranges->nsorted, sizeof(Datum), + compare_values, (void *) &cxt) == NULL); + } } #endif } @@ -687,14 +688,14 @@ brin_range_serialize(Ranges *range) } else if (typlen == -1) /* varlena */ { - int tmp = VARSIZE_ANY(DatumGetPointer(range->values[i])); + Size tmp = VARSIZE_ANY(DatumGetPointer(range->values[i])); memcpy(ptr, DatumGetPointer(range->values[i]), tmp); ptr += tmp; } else if (typlen == -2) /* cstring */ { - int tmp = strlen(DatumGetCString(range->values[i])) + 1; + Size tmp = strlen(DatumGetCString(range->values[i])) + 1; memcpy(ptr, DatumGetCString(range->values[i]), tmp); ptr += tmp; @@ -923,8 +924,8 @@ has_matching_range(BrinDesc *bdesc, Oid colloid, Ranges *ranges, { Datum compar; - Datum minvalue = ranges->values[0]; - Datum maxvalue = ranges->values[2 * ranges->nranges - 1]; + Datum minvalue; + Datum maxvalue; FmgrInfo *cmpLessFn; FmgrInfo *cmpGreaterFn; @@ -936,6 +937,9 @@ has_matching_range(BrinDesc *bdesc, Oid colloid, Ranges *ranges, if (ranges->nranges == 0) return false; + minvalue = ranges->values[0]; + maxvalue = ranges->values[2 * ranges->nranges - 1]; + /* * Otherwise, need to compare the new value with boundaries of all the * ranges. First check if it's less than the absolute minimum, which is @@ -3095,15 +3099,9 @@ brin_minmax_multi_summary_out(PG_FUNCTION_ARGS) { Datum a; text *b; - StringInfoData str; - - initStringInfo(&str); a = FunctionCall1(&fmgrinfo, ranges_deserialized->values[idx++]); - - appendStringInfoString(&str, DatumGetCString(a)); - - b = cstring_to_text(str.data); + b = cstring_to_text(DatumGetCString(a)); astate_values = accumArrayResult(astate_values, PointerGetDatum(b),