in qresult.c [856:907]
static SQLLEN enlargeKeyCache(QResultClass *self, SQLLEN add_size, const char *message)
{
size_t alloc, alloc_req;
Int4 num_fields = self->num_fields;
BOOL curs = (NULL != QR_get_cursor(self));
if (add_size <= 0)
return self->count_keyset_allocated;
alloc = self->count_backend_allocated;
if (num_fields > 0 && ((alloc_req = (Int4)self->num_cached_rows + add_size) > alloc || !self->backend_tuples))
{
if (1 > alloc)
{
if (curs)
alloc = alloc_req;
else
alloc = (alloc_req > TUPLE_MALLOC_INC ? alloc_req : TUPLE_MALLOC_INC);
}
else
{
do
{
alloc *= 2;
} while (alloc < alloc_req);
}
self->count_backend_allocated = 0;
QR_REALLOC_return_with_error(self->backend_tuples, TupleField, num_fields * sizeof(TupleField) * alloc, self, message, -1);
self->count_backend_allocated = alloc;
}
alloc = self->count_keyset_allocated;
if (QR_haskeyset(self) && ((alloc_req = (Int4)self->num_cached_keys + add_size) > alloc || !self->keyset))
{
if (1 > alloc)
{
if (curs)
alloc = alloc_req;
else
alloc = (alloc_req > TUPLE_MALLOC_INC ? alloc_req : TUPLE_MALLOC_INC);
}
else
{
do
{
alloc *= 2;
} while (alloc < alloc_req);
}
self->count_keyset_allocated = 0;
QR_REALLOC_return_with_error(self->keyset, KeySet, sizeof(KeySet) * alloc, self, message, -1);
self->count_keyset_allocated = alloc;
}
return alloc;
}