[Groonga-commit] groonga/groonga at b470896 [master] Support \ (backslash) escape in query syntax

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index