in statement.c [3286:3319]
int SC_Create_bookmark(StatementClass *self, BindInfoClass *bookmark, Int4 bind_row, Int4 currTuple, const KeySet *keyset)
{
ARDFields *opts = SC_get_ARDF(self);
SQLUINTEGER bind_size = opts->bind_size;
SQLULEN offset = opts->row_offset_ptr ? *opts->row_offset_ptr : 0;
size_t cvtlen = sizeof(Int4);
PG_BM pg_bm;
MYLOG(MIN_LOG_LEVEL, "entering type=%d buflen=" FORMAT_LEN " buf=%p\n", bookmark->returntype, bookmark->buflen, bookmark->buffer);
pg_memset(&pg_bm, 0, sizeof(pg_bm));
if (SQL_C_BOOKMARK == bookmark->returntype)
;
else if (bookmark->buflen >= sizeof(pg_bm))
cvtlen = sizeof(pg_bm);
else if (bookmark->buflen >= 12)
cvtlen = 12;
pg_bm.index = SC_make_int4_bookmark(currTuple);
if (keyset)
pg_bm.keys = *keyset;
memcpy(CALC_BOOKMARK_ADDR(bookmark, offset, bind_size, bind_row), &pg_bm, cvtlen);
if (bookmark->used)
{
SQLLEN *used = LENADDR_SHIFT(bookmark->used, offset);
if (bind_size > 0)
used = LENADDR_SHIFT(used, bind_row * bind_size);
else
used = LENADDR_SHIFT(used, bind_row * sizeof(SQLLEN));
*used = cvtlen;
}
MYLOG(MIN_LOG_LEVEL, "leaving cvtlen=" FORMAT_SIZE_T " ix(bl,of)=%d(%d,%d)\n", cvtlen, pg_bm.index, pg_bm.keys.blocknum, pg_bm.keys.offset);
return COPY_OK;
}