aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/qresult.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/odbc/qresult.c')
-rw-r--r--src/interfaces/odbc/qresult.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/interfaces/odbc/qresult.c b/src/interfaces/odbc/qresult.c
index 9baecee7dcd..086f4b87523 100644
--- a/src/interfaces/odbc/qresult.c
+++ b/src/interfaces/odbc/qresult.c
@@ -290,6 +290,7 @@ QR_fetch_tuples(QResultClass *self, ConnectionClass *conn, char *cursor)
QR_set_message(self, "Could not get memory for tuple cache.");
return FALSE;
}
+ self->count_allocated = tuple_size;
self->inTuples = TRUE;
@@ -464,7 +465,8 @@ QR_next_tuple(QResultClass *self)
self->fetch_count++;
}
- self->backend_tuples = (TupleField *) realloc(self->backend_tuples, self->num_fields * sizeof(TupleField) * self->cache_size);
+ if (self->cache_size > self->count_allocated)
+ self->backend_tuples = (TupleField *) realloc(self->backend_tuples, self->num_fields * sizeof(TupleField) * self->cache_size);
if (!self->backend_tuples)
{
self->status = PGRES_FATAL_ERROR;
@@ -524,19 +526,21 @@ QR_next_tuple(QResultClass *self)
case 'B': /* Tuples in binary format */
case 'D': /* Tuples in ASCII format */
- if (!globals.use_declarefetch && self->fcount > 0 && !(self->fcount % TUPLE_MALLOC_INC))
+ if (!globals.use_declarefetch && self->fcount >= self->count_allocated)
{
- size_t old_size = self->fcount * self->num_fields * sizeof(TupleField);
+ int tuple_size = self->count_allocated;
- mylog("REALLOC: old_size = %d\n", old_size);
-
- self->backend_tuples = (TupleField *) realloc(self->backend_tuples, old_size + (self->num_fields * sizeof(TupleField) * TUPLE_MALLOC_INC));
+ mylog("REALLOC: old_count = %d, size = %d\n", tuple_size, self->num_fields * sizeof(TupleField) * tuple_size);
+ tuple_size *= 2;
+ self->backend_tuples = (TupleField *) realloc(self->backend_tuples,
+ tuple_size * self->num_fields * sizeof(TupleField));
if (!self->backend_tuples)
{
self->status = PGRES_FATAL_ERROR;
QR_set_message(self, "Out of memory while reading tuples.");
return FALSE;
}
+ self->count_allocated = tuple_size;
}
if (!QR_read_tuple(self, (char) (id == 0)))