bsearch_getmissingattr.patch
application/octet-stream
Filename: bsearch_getmissingattr.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/access/common/heaptuple.c | 20 | 8 |
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 1f39a72..03d47b6 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -83,7 +83,6 @@ static Datum
getmissingattr(TupleDesc tupleDesc,
int attnum, bool *isnull)
{
- int missingnum;
Form_pg_attribute att;
AttrMissing *attrmiss;
@@ -94,21 +93,33 @@ getmissingattr(TupleDesc tupleDesc,
if (att->atthasmissing)
{
+ int lo,
+ hi,
+ mid;
+
Assert(tupleDesc->constr);
Assert(tupleDesc->constr->num_missing > 0);
attrmiss = tupleDesc->constr->missing;
+ lo = -1;
+ hi = tupleDesc->constr->num_missing - 1;
+
/*
- * Look through the tupledesc's attribute missing values
- * for the one that corresponds to this attribute.
+ * Binary search the tupledesc's attribute missing values for the one
+ * that corresponds to this attribute.
*/
- for (missingnum = tupleDesc->constr->num_missing - 1;
- missingnum >= 0; missingnum--)
+ while (lo < hi)
{
- if (attrmiss[missingnum].amnum == attnum)
+ mid = (lo + hi + 1) / 2;
+
+ if (attrmiss[mid].amnum < attnum)
+ lo = mid;
+ else if (attrmiss[mid].amnum > attnum)
+ hi = mid - 1;
+ else
{
- if (attrmiss[missingnum].ammissingNull)
+ if (attrmiss[mid].ammissingNull)
{
*isnull = true;
return (Datum) 0;
@@ -116,10 +127,11 @@ getmissingattr(TupleDesc tupleDesc,
else
{
*isnull = false;
- return attrmiss[missingnum].ammissing;
+ return attrmiss[mid].ammissing;
}
}
}
+
Assert(false); /* should not be able to get here */
}