null+****@clear*****
null+****@clear*****
2010年 7月 2日 (金) 15:57:41 JST
Daijiro MORI 2010-07-02 06:57:41 +0000 (Fri, 02 Jul 2010)
New Revision: 0aefcbaacecf5a2980750805a32ec5246a067d8c
Log:
Fixed a bug in grn_geo_search().
Modified files:
lib/expr.c
lib/proc.c
Modified: lib/expr.c (+2 -2)
===================================================================
--- lib/expr.c 2010-07-02 04:24:38 +0000 (671f271)
+++ lib/expr.c 2010-07-02 06:57:41 +0000 (05a6068)
@@ -3455,7 +3455,7 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
}
break;
case GRN_OP_CALL :
- if (c->flags & GRN_EXPR_CODE_RELATIONAL_EXPRESSION) {
+ if (c->flags & GRN_EXPR_CODE_RELATIONAL_EXPRESSION || c + 1 == ce) {
stat = SCAN_START;
m++;
} else {
@@ -3577,7 +3577,7 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
break;
case GRN_OP_CALL :
if (!si) { SI_ALLOC(si, i, c - e->codes); }
- if (c->flags & GRN_EXPR_CODE_RELATIONAL_EXPRESSION) {
+ if (c->flags & GRN_EXPR_CODE_RELATIONAL_EXPRESSION || c + 1 == ce) {
stat = SCAN_START;
si->op = c->op;
si->end = c - e->codes;
Modified: lib/proc.c (+7 -4)
===================================================================
--- lib/proc.c 2010-07-02 04:24:38 +0000 (e24fcaa)
+++ lib/proc.c 2010-07-02 06:57:41 +0000 (f70d99f)
@@ -1962,9 +1962,12 @@ grn_geo_search(grn_ctx *ctx, grn_obj *obj, grn_obj **args, int nargs,
{
grn_id domain;
double lng0, lat0, lng1, lat1, lng2, lat2, x, y, d;
- grn_obj *pos1 = args[1], *pos2 = args[2], pos1_, pos2_;
- grn_obj *pat = grn_ctx_at(ctx, obj->header.domain);
- if (nargs != 3) { goto exit; }
+ grn_obj *proc, *pat, *pos1, *pos2, pos1_, pos2_;
+ if (nargs != 4) { goto exit; }
+ pat = grn_ctx_at(ctx, obj->header.domain);
+ proc = args[0];
+ pos1 = args[2];
+ pos2 = args[3];
domain = pat->header.domain;
if (domain != GRN_DB_TOKYO_GEO_POINT && domain != GRN_DB_WGS84_GEO_POINT) { goto exit; }
if (pos1->header.domain != domain) {
@@ -2028,7 +2031,7 @@ grn_geo_search(grn_ctx *ctx, grn_obj *obj, grn_obj **args, int nargs,
x = (lng1 - lng0) * cos((lat0 + lat1) * 0.5);
y = (lat1 - lat0);
if (((x * x) + (y * y)) <= d) {
- grn_ii_at(ctx, (grn_ii *)index, tid, (grn_hash *)res, op);
+ grn_ii_at(ctx, (grn_ii *)obj, tid, (grn_hash *)res, op);
}
}
grn_table_cursor_close(ctx, tc);