Kouhei Sutou
null+****@clear*****
Fri Jul 12 11:17:36 JST 2013
Kouhei Sutou 2013-07-12 11:17:36 +0900 (Fri, 12 Jul 2013) New Revision: b4708966506bbe6dab097751030e26212f5b9abb https://github.com/groonga/groonga/commit/b4708966506bbe6dab097751030e26212f5b9abb Message: Support \ (backslash) escape in query syntax "\(groonga\)" is parsed as "(groonga)". See also: [groonga-dev,01520] Reported by Kouhei Tanabe. Added files: test/command/suite/select/query/escape/parenthesis.expected test/command/suite/select/query/escape/parenthesis.test Modified files: lib/expr.c Modified: lib/expr.c (+13 -3) =================================================================== --- lib/expr.c 2013-07-11 21:54:50 +0900 (a372eab) +++ lib/expr.c 2013-07-12 11:17:36 +0900 (9d2cee7) @@ -5468,8 +5468,9 @@ accept_query_string(grn_ctx *ctx, efs_info *efsi, static grn_rc get_word_(grn_ctx *ctx, efs_info *q) { - const char *start = q->cur, *end; + const char *end; unsigned int len; + GRN_BULK_REWIND(&q->buf); for (end = q->cur;; ) { /* null check and length check */ if (!(len = grn_charlen(ctx, end, q->str_end))) { @@ -5483,7 +5484,9 @@ get_word_(grn_ctx *ctx, efs_info *q) } if (q->flags & GRN_EXPR_ALLOW_COLUMN && *end == GRN_QUERY_COLUMN) { grn_operator mode; - grn_obj *c = grn_obj_column(ctx, q->table, start, end - start); + grn_obj *c = grn_obj_column(ctx, q->table, + GRN_TEXT_VALUE(&q->buf), + GRN_TEXT_LEN(&q->buf)); if (c && end + 1 < q->str_end) { // efs_op op; switch (end[1]) { @@ -5552,10 +5555,17 @@ get_word_(grn_ctx *ctx, efs_info *q) q->cur = end + 1; GRN_INT32_PUT(ctx, &q->mode_stack, GRN_OP_PREFIX); break; + } else if (*end == GRN_QUERY_ESCAPE) { + end += len; + if (!(len = grn_charlen(ctx, end, q->str_end))) { + q->cur = q->str_end; + break; + } } + GRN_TEXT_PUT(ctx, &q->buf, end, len); end += len; } - accept_query_string(ctx, q, start, end - start); + accept_query_string(ctx, q, GRN_TEXT_VALUE(&q->buf), GRN_TEXT_LEN(&q->buf)); return GRN_SUCCESS; } Added: test/command/suite/select/query/escape/parenthesis.expected (+41 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/query/escape/parenthesis.expected 2013-07-12 11:17:36 +0900 (14a9d97) @@ -0,0 +1,41 @@ +table_create Memos TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +table_create Contents TABLE_PAT_KEY ShortText --default_tokenizer TokenDelimit --normalizer NormalizerAuto +[[0,0.0,0.0],true] +column_create Contents entries_key_index COLUMN_INDEX|WITH_POSITION Memos _key +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Tritonn (mroonga) is fast"}, +{"_key": "Mroonga and Tritonn"} +] +[[0,0.0,0.0],2] +select Memos --match_columns _key --query '\\(mroonga\\)' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 1 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "_key", + "ShortText" + ] + ], + [ + 1, + "Tritonn (mroonga) is fast" + ] + ] + ] +] Added: test/command/suite/select/query/escape/parenthesis.test (+14 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/query/escape/parenthesis.test 2013-07-12 11:17:36 +0900 (d1ad1f6) @@ -0,0 +1,14 @@ +table_create Memos TABLE_PAT_KEY ShortText + +table_create Contents TABLE_PAT_KEY ShortText \ + --default_tokenizer TokenDelimit \ + --normalizer NormalizerAuto +column_create Contents entries_key_index COLUMN_INDEX|WITH_POSITION Memos _key + +load --table Memos +[ +{"_key": "Tritonn (mroonga) is fast"}, +{"_key": "Mroonga and Tritonn"} +] + +select Memos --match_columns _key --query '\\(mroonga\\)' -------------- next part -------------- HTML����������������������������...Download