[Groonga-commit] groonga/groonga at d14f8a1 [master] grn_ts: support Int and Float

Back to archive index

susumu.yata null+****@clear*****
Mon Sep 7 14:45:02 JST 2015


susumu.yata	2015-09-07 14:45:02 +0900 (Mon, 07 Sep 2015)

  New Revision: d14f8a194ec3f25e72a948bb65ac314c44d088dc
  https://github.com/groonga/groonga/commit/d14f8a194ec3f25e72a948bb65ac314c44d088dc

  Message:
    grn_ts: support Int and Float
    
    GitHub: #392

  Modified files:
    lib/ts.c

  Modified: lib/ts.c (+20 -8)
===================================================================
--- lib/ts.c    2015-09-07 14:16:47 +0900 (d4386fc)
+++ lib/ts.c    2015-09-07 14:45:02 +0900 (56666c0)
@@ -24,6 +24,7 @@
 
 #include <ctype.h>
 #include <math.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include "grn_ctx_impl.h"
@@ -2182,15 +2183,28 @@ grn_ts_expr_push(grn_ctx *ctx, grn_ts_expr *expr,
   } else if ((str_size == 5) && !memcmp(str, "false", 5)) {
     return grn_ts_expr_push_bool(ctx, expr, GRN_FALSE);
   } else if (isdigit((unsigned char)str[0])) {
-    char buf[1024];
-    grn_ts_int value;
-    if (str_size >= sizeof(buf)) {
-      return GRN_INVALID_ARGUMENT;
+    char *buf, *end;
+    grn_rc rc;
+    grn_ts_int int_value;
+    buf = GRN_MALLOCN(char, str_size + 1);
+    if (!buf) {
+      return GRN_NO_MEMORY_AVAILABLE;
     }
     grn_memcpy(buf, str, str_size);
     buf[str_size] = '\0';
-    value = strtol(buf, NULL, 10);
-    return grn_ts_expr_push_int(ctx, expr, value);
+    int_value = strtol(buf, &end, 0);
+    if (*end == '\0') {
+      rc = grn_ts_expr_push_int(ctx, expr, int_value);
+    } else if (*end == '.') {
+      grn_ts_float float_value = strtod(buf, &end);
+      if (*end == '\0') {
+        rc = grn_ts_expr_push_float(ctx, expr, float_value);
+      } else {
+        rc = GRN_INVALID_ARGUMENT;
+      }
+    }
+    GRN_FREE(buf);
+    return rc;
   } else {
     grn_rc rc;
     grn_obj *column = grn_obj_column(ctx, expr->curr_table, str, str_size);
@@ -2201,8 +2215,6 @@ grn_ts_expr_push(grn_ctx *ctx, grn_ts_expr *expr,
     grn_obj_unlink(ctx, column);
     return rc;
   }
-  // TODO: Parse the given string and push it.
-  return GRN_SUCCESS;
 }
 
 #define GRN_TS_EXPR_PUSH_BULK_CASE_BLOCK(TYPE, kind)\
-------------- next part --------------
HTML����������������������������...
Download 



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