null+****@clear*****
null+****@clear*****
2010年 8月 2日 (月) 20:14:44 JST
Daijiro MORI 2010-08-02 11:14:44 +0000 (Mon, 02 Aug 2010) New Revision: d0631f50f8f227d09571d4799ea1d801c335a2ea Log: grn_pat_cursor_open() ignores GRN_CURSOR_PREFIX flag value when both min_size and max_size are 0. Modified files: lib/pat.c Modified: lib/pat.c (+52 -47) =================================================================== --- lib/pat.c 2010-08-02 10:43:05 +0000 (96b627e) +++ lib/pat.c 2010-08-02 11:14:44 +0000 (a3492e3) @@ -1726,7 +1726,9 @@ set_cursor_prefix(grn_ctx *ctx, grn_pat *pat, grn_pat_cursor *c, } } } else { - push(c, id, ch); + if (PAT_LEN(node) * 16 > len || !(flags & GRN_CURSOR_GT)) { + push(c, id, ch); + } } } break; @@ -2064,64 +2066,67 @@ grn_pat_cursor_open(grn_ctx *ctx, grn_pat *pat, c->curr_rec = GRN_ID_NIL; c->obj.header.domain = GRN_ID_NIL; if (flags & GRN_CURSOR_PREFIX) { - if (max_size) { + if (max && max_size) { if ((pat->obj.header.flags & GRN_OBJ_KEY_VAR_SIZE)) { set_cursor_common_prefix(ctx, pat, c, min_size, max, max_size, flags); } else { set_cursor_near(ctx, pat, c, min_size, max, flags); } + goto exit; } else { - set_cursor_prefix(ctx, pat, c, min, min_size, flags); + if (min && min_size) { + set_cursor_prefix(ctx, pat, c, min, min_size, flags); + goto exit; + } } - } else { - if (flags & GRN_CURSOR_DESCENDING) { - if (min) { - set_cursor_ascend(ctx, pat, c, min, min_size, flags); - c->obj.header.flags = GRN_CURSOR_ASCENDING; - c->tail = grn_pat_cursor_next(ctx, c); - c->sp = 0; - if (!c->tail) { goto exit; } + } + if (flags & GRN_CURSOR_DESCENDING) { + if (min && min_size) { + set_cursor_ascend(ctx, pat, c, min, min_size, flags); + c->obj.header.flags = GRN_CURSOR_ASCENDING; + c->tail = grn_pat_cursor_next(ctx, c); + c->sp = 0; + if (!c->tail) { goto exit; } + } + if (max && max_size) { + set_cursor_descend(ctx, pat, c, max, max_size, flags); + } else { + PAT_AT(pat, 0, node); + if (!node) { + grn_pat_cursor_close(ctx, c); + return NULL; } - if (max) { - set_cursor_descend(ctx, pat, c, max, max_size, flags); - } else { - PAT_AT(pat, 0, node); - if (!node) { - grn_pat_cursor_close(ctx, c); - return NULL; - } - if ((id = node->lr[1])) { - PAT_AT(pat, id, node); - if (node) { - int ch = PAT_CHK(node); - push(c, node->lr[0], ch); - push(c, node->lr[1], ch); - } + if ((id = node->lr[1])) { + PAT_AT(pat, id, node); + if (node) { + int ch = PAT_CHK(node); + push(c, node->lr[0], ch); + push(c, node->lr[1], ch); } } + } + } else { + if (max && max_size) { + set_cursor_descend(ctx, pat, c, max, max_size, flags); + c->obj.header.flags = GRN_CURSOR_DESCENDING; + c->tail = grn_pat_cursor_next(ctx, c); + c->sp = 0; + if (!c->tail) { goto exit; } + } + if (min && min_size) { + set_cursor_ascend(ctx, pat, c, min, min_size, flags); } else { - if (max) { - set_cursor_descend(ctx, pat, c, max, max_size, flags); - c->obj.header.flags = GRN_CURSOR_DESCENDING; - c->tail = grn_pat_cursor_next(ctx, c); - c->sp = 0; - if (!c->tail) { goto exit; } + PAT_AT(pat, 0, node); + if (!node) { + grn_pat_cursor_close(ctx, c); + return NULL; } - if (min) { - set_cursor_ascend(ctx, pat, c, min, min_size, flags); - } else { - PAT_AT(pat, 0, node); - if (!node) { - grn_pat_cursor_close(ctx, c); - return NULL; - } - if ((id = node->lr[1])) { - PAT_AT(pat, id, node); - if (node) { - int ch = PAT_CHK(node); - push(c, node->lr[1], ch); - push(c, node->lr[0], ch); - } + if ((id = node->lr[1])) { + PAT_AT(pat, id, node); + if (node) { + int ch = PAT_CHK(node); + push(c, node->lr[1], ch); + push(c, node->lr[0], ch); } } }