[Groonga-commit] groonga/groonga at 5b645be [master] expr: cast the right hand side numeric value of equal on select instead of on compile

Back to archive index

Kouhei Sutou null+****@clear*****
Wed Feb 21 12:23:06 JST 2018


Kouhei Sutou	2018-02-21 12:23:06 +0900 (Wed, 21 Feb 2018)

  New Revision: 5b645bebf480733e9c64fc1c2d5533521a4d5007
  https://github.com/groonga/groonga/commit/5b645bebf480733e9c64fc1c2d5533521a4d5007

  Message:
    expr: cast the right hand side numeric value of equal on select instead of on compile
    
    It's for using overflow and underflow information on select.

  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+29 -4)
===================================================================
--- lib/expr.c    2018-02-21 12:04:53 +0900 (94386a544)
+++ lib/expr.c    2018-02-21 12:23:06 +0900 (435315758)
@@ -1070,13 +1070,17 @@ grn_expr_append_obj(grn_ctx *ctx, grn_obj *expr, grn_obj *obj, grn_operator op,
           if (CONSTP(y)) {
             /* todo */
           } else {
-            if (xd != yd) {
+            if (xd != yd &&
+                !(grn_type_id_is_number_family(ctx, xd) &&
+                  grn_type_id_is_number_family(ctx, yd))) {
               grn_expr_append_obj_resolve_const(ctx, x, yd);
             }
           }
         } else {
           if (CONSTP(y)) {
-            if (xd != yd) {
+            if (xd != yd &&
+                !(grn_type_id_is_number_family(ctx, xd) &&
+                  grn_type_id_is_number_family(ctx, yd))) {
               grn_expr_append_obj_resolve_const(ctx, y, xd);
             }
           }
@@ -6033,9 +6037,30 @@ grn_table_select_index_equal(grn_ctx *ctx,
       if (GRN_OBJ_GET_DOMAIN(si->query) == DB_OBJ(domain)->id) {
         tid = GRN_RECORD_VALUE(si->query);
       } else {
+        grn_id key_type;
+        grn_obj *key;
+        grn_obj key_buffer;
+
+        key_type = domain->header.domain;
+        if (key_type == si->query->header.domain) {
+          key = si->query;
+        } else {
+          grn_rc rc;
+          GRN_OBJ_INIT(&key_buffer, GRN_BULK, 0, key_type);
+          rc = grn_obj_cast(ctx, si->query, &key_buffer, GRN_FALSE);
+          if (rc == GRN_SUCCESS) {
+            key = &key_buffer;
+          } else {
+            GRN_OBJ_FIN(ctx, &key_buffer);
+            key = si->query;
+          }
+        }
         tid = grn_table_get(ctx, domain,
-                            GRN_BULK_HEAD(si->query),
-                            GRN_BULK_VSIZE(si->query));
+                            GRN_BULK_HEAD(key),
+                            GRN_BULK_VSIZE(key));
+        if (key == &key_buffer) {
+          GRN_OBJ_FIN(ctx, &key_buffer);
+        }
       }
       if (tid != GRN_ID_NIL) {
         uint32_t sid;
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180221/ce3c1f44/attachment-0001.htm 



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