null+****@clear*****
null+****@clear*****
2010年 11月 9日 (火) 17:37:38 JST
Kouhei Sutou 2010-11-09 08:37:38 +0000 (Tue, 09 Nov 2010)
New Revision: b602e7d942b605541f0e83b31ba122b880c5915b
Log:
fix numeric operation and assing with expression is broken. #669
Modified files:
lib/expr.c
test/unit/core/test-expr-script.c
Modified: lib/expr.c (+23 -17)
===================================================================
--- lib/expr.c 2010-11-09 11:59:59 +0000 (9824f18)
+++ lib/expr.c 2010-11-09 08:37:38 +0000 (7298f7d)
@@ -2158,43 +2158,49 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller)
right_expression_check,\
text_operation) \
{ \
- grn_obj *value, *casted_value, *variable_value, *var; \
+ grn_obj *value, *var, *res; \
if (code->value) { \
value = code->value; \
+ POP1ALLOC1(var, res); \
} else { \
- POP1(value); \
+ POP2ALLOC1(var, value, res); \
} \
- value = GRN_OBJ_RESOLVE(ctx, value); \
- POP1(var); \
if (var->header.type == GRN_PTR && \
GRN_BULK_VSIZE(var) == (sizeof(grn_obj *) + sizeof(grn_id))) { \
grn_obj *col = GRN_PTR_VALUE(var); \
grn_id rid = *(grn_id *)(GRN_BULK_HEAD(var) + sizeof(grn_obj *)); \
+ grn_obj variable_value, casted_value; \
+ grn_id domain; \
\
- ALLOC1(res); \
- ALLOC1(variable_value); \
- ALLOC1(casted_value); \
- grn_obj_reinit(ctx, variable_value, col->header.domain, 0); \
- grn_obj_get_value(ctx, col, rid, variable_value); \
+ value = GRN_OBJ_RESOLVE(ctx, value); \
\
- casted_value->header.type = GRN_BULK; \
- casted_value->header.domain = variable_value->header.domain; \
- if (grn_obj_cast(ctx, value, casted_value, GRN_FALSE)) { \
+ domain = grn_obj_get_range(ctx, col); \
+ GRN_OBJ_INIT(&variable_value, GRN_BULK, 0, domain); \
+ grn_obj_get_value(ctx, col, rid, &variable_value); \
+ \
+ GRN_OBJ_INIT(&casted_value, GRN_BULK, 0, domain); \
+ if (grn_obj_cast(ctx, value, &casted_value, GRN_FALSE)) { \
ERR(GRN_INVALID_ARGUMENT, "invalid value: string"); \
+ GRN_OBJ_FIN(ctx, &variable_value); \
+ GRN_OBJ_FIN(ctx, &casted_value); \
+ POP1(res); \
goto exit; \
} \
- res->header.type = GRN_BULK; \
- res->header.domain = variable_value->header.domain; \
- ARITHMETIC_OPERATION_DISPATCH(variable_value, casted_value, res, \
+ grn_obj_reinit(ctx, res, domain, 0); \
+ ARITHMETIC_OPERATION_DISPATCH((&variable_value), (&casted_value), \
+ res, \
integer32_operation, \
integer64_operation, \
float_operation, \
left_expression_check, \
right_expression_check, \
text_operation,); \
- POP1(casted_value); \
- POP1(variable_value); \
grn_obj_set_value(ctx, col, rid, res, GRN_OBJ_SET); \
+ GRN_OBJ_FIN(ctx, (&variable_value)); \
+ GRN_OBJ_FIN(ctx, (&casted_value)); \
+ } else { \
+ ERR(GRN_INVALID_ARGUMENT, "left hand expression isn't column."); \
+ POP1(res); \
} \
}
Modified: test/unit/core/test-expr-script.c (+4 -0)
===================================================================
--- test/unit/core/test-expr-script.c 2010-11-09 11:59:59 +0000 (b8a98ef)
+++ test/unit/core/test-expr-script.c 2010-11-09 08:37:38 +0000 (6b89c46)
@@ -584,6 +584,10 @@ data_arithmetic_operator_minus_assign(void)
gcut_list_string_new("fuga fuga", "hoge hoge", NULL),
"size <= 9 && ((size -= \"4\") || 1) && size == 5");
+ ADD_DATUM("integer -= expression",
+ gcut_list_string_new("fuga fuga", "hoge hoge", NULL),
+ "size <= 9 && ((size -= (3 + 1)) || 1) && size == 5");
+
ADD_DATUM("float -= float",
gcut_list_string_new("fuga fuga", "hoge hoge", NULL),
"size_in_float <= 9.1 && "