diff options
Diffstat (limited to 'src/include/cell.i')
-rw-r--r-- | src/include/cell.i | 74 |
1 files changed, 55 insertions, 19 deletions
diff --git a/src/include/cell.i b/src/include/cell.i index a16db71819d..15a13064930 100644 --- a/src/include/cell.i +++ b/src/include/cell.i @@ -30,8 +30,8 @@ * Keys with optional data cells (a WT_CELL_KEY or WT_CELL_KEY_OVFL cell, * optionally followed by a WT_CELL_{VALUE,VALUE_COPY,VALUE_OVFL} cell). * - * Both WT_PAGE_ROW_INT and WT_PAGE_ROW_LEAF pages prefix compress keys, using - * a single byte immediately following the cell. + * WT_PAGE_ROW_LEAF pages prefix compress keys, using a single byte count + * immediately following the cell. * * WT_PAGE_COL_INT (Column-store internal page): * Off-page references (a WT_CELL_{ADDR,ADDR_LNO} cell). @@ -298,11 +298,41 @@ __wt_cell_pack_del(WT_CELL *cell, uint64_t rle) } /* - * __wt_cell_pack_key -- - * Set a key's WT_CELL contents. + * __wt_cell_pack_int_key -- + * Set a row-store internal page key's WT_CELL contents. */ static inline uint32_t -__wt_cell_pack_key(WT_CELL *cell, uint8_t prefix, uint32_t size) +__wt_cell_pack_int_key(WT_CELL *cell, uint32_t size) +{ + uint8_t byte, *p; + + /* + * Short keys have 6-bits of length in the descriptor byte and no length + * bytes. + * + * Bit 0 is 0, bit 1 is the WT_CELL_KEY_SHORT flag; the other 6 bits are + * the size. + */ + if (size <= 0x3f) { + byte = (uint8_t)size; + cell->__chunk[0] = (byte << 2) | WT_CELL_KEY_SHORT; + return (1); + } + + cell->__chunk[0] = WT_CELL_KEY; /* Type */ + + p = cell->__chunk + 1; /* Length */ + (void)__wt_vpack_uint(&p, 0, (uint64_t)size); + + return (WT_PTRDIFF32(p, cell)); +} + +/* + * __wt_cell_pack_leaf_key -- + * Set a row-store leaf page key's WT_CELL contents. + */ +static inline uint32_t +__wt_cell_pack_leaf_key(WT_CELL *cell, uint8_t prefix, uint32_t size) { uint8_t byte, *p; @@ -446,7 +476,8 @@ __wt_cell_type_raw(WT_CELL *cell) * Unpack a WT_CELL into a structure during verification. */ static inline int -__wt_cell_unpack_safe(WT_CELL *cell, WT_CELL_UNPACK *unpack, uint8_t *end) +__wt_cell_unpack_safe( + WT_CELL *cell, int type, WT_CELL_UNPACK *unpack, uint8_t *end) { uint64_t v; const uint8_t *p; @@ -506,14 +537,21 @@ restart: switch (unpack->raw) { case WT_CELL_KEY_SHORT: /* - * Check the prefix byte that follows the cell descriptor byte. + * Check the prefix byte that follows the cell descriptor byte + * on row-store leaf pages. */ - WT_CELL_LEN_CHK(cell, 1); - unpack->prefix = cell->__chunk[1]; - - unpack->data = cell->__chunk + 2; - unpack->size = cell->__chunk[0] >> 2; - unpack->__len = 2 + unpack->size; + if (type == WT_PAGE_ROW_LEAF) { + WT_CELL_LEN_CHK(cell, 1); + unpack->prefix = cell->__chunk[1]; + + unpack->data = cell->__chunk + 2; + unpack->size = cell->__chunk[0] >> 2; + unpack->__len = 2 + unpack->size; + } else { + unpack->data = cell->__chunk + 1; + unpack->size = cell->__chunk[0] >> 2; + unpack->__len = 1 + unpack->size; + } goto done; case WT_CELL_VALUE_SHORT: /* @@ -532,10 +570,8 @@ restart: */ p = (uint8_t *)cell + 1; /* skip cell */ - if (unpack->raw == WT_CELL_KEY) { - /* - * Check the prefix byte that follows the cell descriptor byte. - */ + /* Check the prefix byte that follows the cell descriptor byte. */ + if (unpack->raw == WT_CELL_KEY && type == WT_PAGE_ROW_LEAF) { ++p; /* skip prefix */ WT_CELL_LEN_CHK(p, 0); unpack->prefix = cell->__chunk[1]; @@ -614,9 +650,9 @@ done: WT_CELL_LEN_CHK(cell, unpack->__len); * Unpack a WT_CELL into a structure. */ static inline void -__wt_cell_unpack(WT_CELL *cell, WT_CELL_UNPACK *unpack) +__wt_cell_unpack(WT_CELL *cell, int type, WT_CELL_UNPACK *unpack) { - (void)__wt_cell_unpack_safe(cell, unpack, NULL); + (void)__wt_cell_unpack_safe(cell, type, unpack, NULL); } /* |