Kouhei Sutou 2019-04-05 18:29:44 +0900 (Fri, 05 Apr 2019) Revision: cdd3b046bbe3611c97973896ccdb2e128702d0ad https://github.com/groonga/groonga/commit/cdd3b046bbe3611c97973896ccdb2e128702d0ad Message: ii: fix an offset computation bug on INDEX_LARGE Modified files: lib/grn_ii.h lib/ii.c Modified: lib/grn_ii.h (+5 -0) =================================================================== --- lib/grn_ii.h 2019-04-05 17:22:38 +0900 (7a49df55d) +++ lib/grn_ii.h 2019-04-05 18:29:44 +0900 (3490c9228) @@ -53,8 +53,13 @@ struct _grn_ii { /* BGQ is buffer garbage queue? */ #define GRN_II_BGQSIZE 16 +/* L is for logical? */ #define GRN_II_MAX_LSEG 0x10000 +#define GRN_II_W_LSEG 16 +#define GRN_II_W_LOFFSET (32 - GRN_II_W_LSEG) #define GRN_II_MAX_LSEG_EXTEND 0x10000 +#define GRN_II_W_LSEG_LARGE 17 +#define GRN_II_W_LOFFSET_LARGE (32 - GRN_II_W_LSEG_LARGE) #define GRN_II_W_TOTAL_CHUNK 40 #define GRN_II_W_CHUNK 22 #define GRN_II_W_LEAST_CHUNK (GRN_II_W_TOTAL_CHUNK - 32) Modified: lib/ii.c (+21 -7) =================================================================== --- lib/ii.c 2019-04-05 17:22:38 +0900 (cd41e9340) +++ lib/ii.c 2019-04-05 18:29:44 +0900 (91ab9f61c) @@ -2330,14 +2330,20 @@ typedef struct { buffer_term terms[(S_SEGMENT - sizeof(buffer_header))/sizeof(buffer_term)]; } buffer; -/* L is for logical? */ +#define GRN_II_POS_LSEG_SHIFT_SIZE (32 - GRN_II_W_LSEG) +#define GRN_II_POS_LSEG_SHIFT_SIZE_LARGE (32 - GRN_II_W_LSEG_LARGE) +#define GRN_II_POS_LOFFSET_SHIFT_SIZE \ + ((16 - GRN_II_W_LOFFSET) + 2) +#define GRN_II_POS_LOFFSET_SHIFT_SIZE_LARGE \ + ((16 - GRN_II_W_LOFFSET_LARGE) + 2) + grn_inline static uint32_t grn_ii_pos_lseg(grn_ii *ii, uint32_t pos) { if (ii->header.common->flags & GRN_OBJ_INDEX_LARGE) { - return pos >> 17; + return pos >> GRN_II_POS_LSEG_SHIFT_SIZE_LARGE; } else { - return pos >> 16; + return pos >> GRN_II_POS_LSEG_SHIFT_SIZE; } } @@ -2345,9 +2351,13 @@ grn_inline static uint32_t grn_ii_pos_loffset(grn_ii *ii, uint32_t pos) { if (ii->header.common->flags & GRN_OBJ_INDEX_LARGE) { - return (pos & 0xffff) << 3; + return + (pos & ((1 << GRN_II_W_LOFFSET_LARGE) - 1)) << + GRN_II_POS_LOFFSET_SHIFT_SIZE_LARGE; } else { - return (pos & 0xffff) << 2; + return + (pos & ((1 << GRN_II_W_LOFFSET) - 1)) << + GRN_II_POS_LOFFSET_SHIFT_SIZE; } } @@ -2355,9 +2365,13 @@ grn_inline static uint32_t grn_ii_pos_pack(grn_ii *ii, uint32_t lseg, uint32_t loffset) { if (ii->header.common->flags & GRN_OBJ_INDEX_LARGE) { - return (lseg << 17) + (loffset >> 3); + return + (lseg << GRN_II_POS_LSEG_SHIFT_SIZE_LARGE) + + (loffset >> GRN_II_POS_LOFFSET_SHIFT_SIZE_LARGE); } else { - return (lseg << 16) + (loffset >> 2); + return + (lseg << GRN_II_POS_LSEG_SHIFT_SIZE) + + (loffset >> GRN_II_POS_LOFFSET_SHIFT_SIZE); } } -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20190405/8d1ad77d/attachment-0001.html>