in results.c [3560:3685]
static SQLLEN LoadFromKeyset_inh(StatementClass *stmt, QResultClass * res, int rows_per_fetch, SQLLEN limitrow)
{
ConnectionClass *conn = SC_get_conn(stmt);
SQLLEN i;
int j, rowc, rcnt = 0;
OID oid, new_oid;
UInt4 blocknum;
SQLLEN kres_ridx;
UInt2 offset;
PQExpBufferData qval = {0};
int keys_per_fetch = 10;
const char *load_stmt = stmt->load_statement;
const ssize_t from_pos = stmt->load_from_pos;
MYLOG(MIN_LOG_LEVEL, "entering in rows_per_fetch=%d limitrow=" FORMAT_LEN "\n", rows_per_fetch, limitrow);
new_oid = 0;
#define return DONT_CALL_RETURN_FROM_HERE???
for (i = SC_get_rowset_start(stmt), kres_ridx = GIdx2KResIdx(i, stmt, res), rowc = 0, oid = 0;; i++, kres_ridx++)
{
if (i >= limitrow)
{
if (!rowc)
break;
rowc = -1; /* end of loop */
}
else if (0 == (res->keyset[kres_ridx].status & CURS_NEEDS_REREAD))
continue;
else
new_oid = getOid(res, kres_ridx);
if (rowc < 0 ||
rowc >= keys_per_fetch ||
(oid != 0 &&
new_oid != oid))
{
QResultClass *qres;
appendPQExpBufferStr(&qval, ")");
if (PQExpBufferDataBroken(qval))
{
rcnt = -1;
SC_set_error(stmt, STMT_NO_MEMORY_ERROR, "Out of memory in LoadFromKeyset_inh()", __FUNCTION__);
goto cleanup;
}
qres = CC_send_query(conn, qval.data, NULL, CREATE_KEYSET | READ_ONLY_QUERY, stmt);
if (QR_command_maybe_successful(qres))
{
SQLLEN k, l;
Int2 m;
TupleField *tuple, *tuplew;
UInt4 bln;
UInt2 off;
OID tbloid;
for (j = 0; j < QR_get_num_total_read(qres); j++)
{
tbloid = getOid(qres, j);
getTid(qres, j, &blocknum, &offset);
for (k = SC_get_rowset_start(stmt); k < limitrow; k++)
{
getTid(res, k, &bln, &off);
if (tbloid == getOid(res, k) &&
bln == blocknum &&
off == offset)
{
l = GIdx2CacheIdx(k, stmt, res);
tuple = res->backend_tuples + res->num_fields * l;
tuplew = qres->backend_tuples + qres->num_fields * j;
for (m = 0; m < res->num_fields; m++, tuple++, tuplew++)
{
if (tuple->len > 0 && tuple->value)
free(tuple->value);
tuple->value = tuplew->value;
tuple->len = tuplew->len;
tuplew->value = NULL;
tuplew->len = -1;
}
res->keyset[k].status &= ~CURS_NEEDS_REREAD;
break;
}
}
}
}
else
{
SC_set_error(stmt, STMT_EXEC_ERROR, "Data Load Error", __FUNCTION__);
rcnt = -1;
SC_set_Result(stmt, qres);
break;
}
QR_Destructor(qres);
if (rowc < 0)
break;
rowc = 0;
}
if (!rowc)
{
char table_fqn[256];
if (PQExpBufferDataBroken(qval))
{
if (rows_per_fetch >= pre_fetch_count * 2)
keys_per_fetch = pre_fetch_count;
else
keys_per_fetch = rows_per_fetch;
if (!keys_per_fetch)
keys_per_fetch = 2;
initPQExpBuffer(&qval);
}
printfPQExpBuffer(&qval, "%.*sfrom %s where ctid in (", (int) from_pos, load_stmt, ti_quote(stmt, new_oid, table_fqn, sizeof(table_fqn)));
}
if (new_oid != oid)
oid = new_oid;
getTid(res, kres_ridx, &blocknum, &offset);
if (rowc)
appendPQExpBuffer(&qval, ",'(%u,%u)'", blocknum, offset);
else
appendPQExpBuffer(&qval, "'(%u,%u)'", blocknum, offset);
rowc++;
rcnt++;
}
cleanup:
#undef return
if (!PQExpBufferDataBroken(qval))
termPQExpBuffer(&qval);
return rcnt;
}