42 return (function_proc_p(obj) && ((
grn_proc *)obj)->selector);
64 grn_expr_get_vars(
grn_ctx *ctx,
grn_obj *expr,
unsigned int *nvars)
80 for (v = e->
vars, i = e->
nvars; i; v++, i--) {
119 if (caller) { *caller = pctx->
caller; }
125 if (nvars) { *nvars = pctx->
proc->
nvars; }
127 if (vars) { *vars = NULL; }
128 if (nvars) { *nvars = 0; }
149 const char *name,
unsigned int name_size)
166 if (!function_proc_p(proc)) {
175 static const char *opstrs[] = {
273 grn_hash *vars = grn_expr_get_vars(ctx, expr, &i);
285 put_value(ctx, buf, value);
290 for (j = 0, code = e->
codes; j < e->codes_curr; j++, code++) {
294 for (i = 0, var = e->
vars; i < e->nvars; i++, var++) {
306 put_value(ctx, buf, code->
value);
310 put_value(ctx, buf, code->
value);
401 for (i = e->
nvars, v = e->
vars; i; i--, v++) {
408 for (c = e->
codes; i; i--, c++) {
414 for (j = 0, v = e->
vars; j < e->nvars; j++, v++) {
438 for (i = 0; i < n; i++) {
439 uint32_t object_type;
454 for (i = 0, code = e->
codes; i < n; i++, code++) {
471 uint32_t object_type;
478 if (!(v = const_new(ctx, e))) {
return NULL; }
509 for (i = 0; i < size; i++) {
542 #define DFI_POP(e,d) do {\
543 if (GRN_BULK_VSIZE(&(e)->dfi) >= sizeof(grn_expr_dfi)) {\
544 GRN_BULK_INCR_LEN((&(e)->dfi), -(sizeof(grn_expr_dfi)));\
545 (d) = (grn_expr_dfi *)(GRN_BULK_CURR(&(e)->dfi));\
546 (e)->code0 = (d)->code;\
553 #define DFI_PUT(e,t,d,c) do {\
558 if ((e)->code0) { (e)->code0->modify = (c) ? ((c) - (e)->code0) : 0; }\
559 grn_bulk_write(ctx, &(e)->dfi, (char *)&dfi, sizeof(grn_expr_dfi));\
568 if (offset < 0) { offset = size + offset; }
569 return (0 <= offset && offset < size)
580 if (!ctx || !ctx->
impl || !(db = ctx->
impl->
db)) {
586 "[expr][create] anonymous expression isn't implemented yet");
622 for (i = 0; i < size; i++) {
638 #define GRN_PTR_POP(obj,value) do {\
639 if (GRN_BULK_VSIZE(obj) >= sizeof(grn_obj *)) {\
640 GRN_BULK_INCR_LEN((obj), -(sizeof(grn_obj *)));\
641 value = *(grn_obj **)(GRN_BULK_CURR(obj));\
659 for (i = 0; i < e->
nconsts; i++) {
669 #ifdef USE_MEMORY_DEBUG
681 for (i = 0; i < e->
nvars; i++) {
738 grn_hash *vars = grn_expr_get_vars(ctx, expr, &n);
739 if (vars) {
grn_hash_get(ctx, vars, name, name_size, (
void **)&res); }
748 grn_hash *vars = grn_expr_get_vars(ctx, expr, &n);
756 name_size = rest - name_buf;
759 grn_hash_add(ctx, vars, name, name_size, (
void **)&res, &added);
770 grn_hash *vars = grn_expr_get_vars(ctx, expr, &n);
775 #define EXPRVP(x) ((x)->header.impl_flags & GRN_OBJ_EXPRVALUE)
777 #define CONSTP(obj) ((obj) && ((obj)->header.impl_flags & GRN_OBJ_EXPRCONST))
779 #define PUSH_CODE(e,o,v,n,c) do {\
780 (c) = &(e)->codes[e->codes_curr++];\
788 #define APPEND_UNARY_MINUS_OP(e) do { \
789 grn_expr_code *code_; \
791 unsigned char type; \
795 domain = dfi->domain; \
800 case GRN_DB_UINT32: \
802 unsigned int value; \
803 value = GRN_UINT32_VALUE(x); \
804 if (value > (unsigned int)0x80000000) { \
805 domain = GRN_DB_INT64; \
806 x->header.domain = domain; \
807 GRN_INT64_SET(ctx, x, -((long long int)value)); \
809 domain = GRN_DB_INT32; \
810 x->header.domain = domain; \
811 GRN_INT32_SET(ctx, x, -((int)value)); \
816 GRN_INT64_SET(ctx, x, -GRN_INT64_VALUE(x)); \
819 GRN_FLOAT_SET(ctx, x, -GRN_FLOAT_VALUE(x)); \
822 PUSH_CODE(e, op, obj, nargs, code); \
826 PUSH_CODE(e, op, obj, nargs, code); \
828 DFI_PUT(e, type, domain, code_); \
831 #define PUSH_N_ARGS_ARITHMETIC_OP(e, op, obj, nargs, code) do { \
832 PUSH_CODE(e, op, obj, nargs, code); \
839 DFI_PUT(e, type, domain, code); \
886 for (i = 0; i < nargs; i++) {
887 int rest_n_codes = 1;
888 while (rest_n_codes > 0) {
890 rest_n_codes += code->
nargs;
902 if (!function_proc_p(proc)) {
928 while (i--) {
DFI_POP(e, dfi); }
932 DFI_PUT(e, type, domain, code);
948 DFI_PUT(e, type, domain, code);
997 DFI_PUT(e, type, domain, code);
1030 if (!obj) {
DFI_POP(e, dfi); }
1031 while (i--) {
DFI_POP(e, dfi); }
1033 DFI_PUT(e, type, domain, code);
1056 DFI_PUT(e, type, domain, code);
1110 DFI_PUT(e, type, domain, code);
1168 DFI_PUT(e, type, domain, code);
1194 if (dfi && (dfi->
code)) {
1205 DFI_PUT(e, type, domain, code);
1231 DFI_PUT(e, type, domain, code);
1238 if (!ctx->
rc) { res = obj; }
1241 #undef PUSH_N_ARGS_ARITHMETIC_OP
1242 #undef APPEND_UNARY_MINUS_OP
1258 if ((res = const_new(ctx, e))) {
1280 grn_expr_add_str(
grn_ctx *ctx,
grn_obj *expr,
const char *str,
unsigned int str_size)
1284 if ((res = const_new(ctx, e))) {
1298 res = grn_expr_add_str(ctx, expr, str, str_size);
1310 if ((res = const_new(ctx, e))) {
1333 #define WITH_SPSAVE(block) do {\
1334 ctx->impl->stack_curr = sp - ctx->impl->stack;\
1335 e->values_curr = vp - e->values;\
1337 vp = e->values + e->values_curr;\
1338 sp = ctx->impl->stack + ctx->impl->stack_curr;\
1343 #define DO_COMPARE_SUB_NUMERIC(y,op) do {\
1344 switch ((y)->header.domain) {\
1346 r = (x_ op GRN_INT8_VALUE(y));\
1348 case GRN_DB_UINT8 :\
1349 r = (x_ op GRN_UINT8_VALUE(y));\
1351 case GRN_DB_INT16 :\
1352 r = (x_ op GRN_INT16_VALUE(y));\
1354 case GRN_DB_UINT16 :\
1355 r = (x_ op GRN_UINT16_VALUE(y));\
1357 case GRN_DB_INT32 :\
1358 r = (x_ op GRN_INT32_VALUE(y));\
1360 case GRN_DB_UINT32 :\
1361 r = (x_ op GRN_UINT32_VALUE(y));\
1363 case GRN_DB_INT64 :\
1364 r = (x_ op GRN_INT64_VALUE(y));\
1367 r = (GRN_TIME_PACK(x_,0) op GRN_INT64_VALUE(y));\
1369 case GRN_DB_UINT64 :\
1370 r = (x_ op GRN_UINT64_VALUE(y));\
1372 case GRN_DB_FLOAT :\
1373 r = (x_ op GRN_FLOAT_VALUE(y));\
1381 #define DO_COMPARE_SUB(op) do {\
1382 switch (y->header.domain) {\
1383 case GRN_DB_SHORT_TEXT :\
1385 case GRN_DB_LONG_TEXT :\
1388 GRN_OBJ_INIT(&y_, GRN_BULK, 0, x->header.domain);\
1389 if (grn_obj_cast(ctx, y, &y_, GRN_FALSE)) {\
1392 DO_COMPARE_SUB_NUMERIC(&y_, op);\
1394 GRN_OBJ_FIN(ctx, &y_);\
1398 DO_COMPARE_SUB_NUMERIC(y,op);\
1403 #define DO_COMPARE_BUILTIN(x,y,r,op) do {\
1404 switch (x->header.domain) {\
1407 int8_t x_ = GRN_INT8_VALUE(x);\
1408 DO_COMPARE_SUB(op);\
1411 case GRN_DB_UINT8 :\
1413 uint8_t x_ = GRN_UINT8_VALUE(x);\
1414 DO_COMPARE_SUB(op);\
1417 case GRN_DB_INT16 :\
1419 int16_t x_ = GRN_INT16_VALUE(x);\
1420 DO_COMPARE_SUB(op);\
1423 case GRN_DB_UINT16 :\
1425 uint16_t x_ = GRN_UINT16_VALUE(x);\
1426 DO_COMPARE_SUB(op);\
1429 case GRN_DB_INT32 :\
1431 int32_t x_ = GRN_INT32_VALUE(x);\
1432 DO_COMPARE_SUB(op);\
1435 case GRN_DB_UINT32 :\
1437 uint32_t x_ = GRN_UINT32_VALUE(x);\
1438 DO_COMPARE_SUB(op);\
1443 int64_t x_ = GRN_INT64_VALUE(x);\
1444 switch (y->header.domain) {\
1445 case GRN_DB_INT32 :\
1446 r = (x_ op GRN_TIME_PACK(GRN_INT32_VALUE(y), 0));\
1448 case GRN_DB_UINT32 :\
1449 r = (x_ op GRN_TIME_PACK(GRN_UINT32_VALUE(y), 0));\
1451 case GRN_DB_INT64 :\
1453 r = (x_ op GRN_INT64_VALUE(y));\
1455 case GRN_DB_UINT64 :\
1456 r = (x_ op GRN_UINT64_VALUE(y));\
1458 case GRN_DB_FLOAT :\
1459 r = (x_ op GRN_TIME_PACK(GRN_FLOAT_VALUE(y), 0));\
1461 case GRN_DB_SHORT_TEXT :\
1463 case GRN_DB_LONG_TEXT :\
1465 const char *p_ = GRN_TEXT_VALUE(y);\
1466 int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\
1467 r = (x_ op GRN_TIME_PACK(i_, 0));\
1476 case GRN_DB_INT64 :\
1478 int64_t x_ = GRN_INT64_VALUE(x);\
1479 DO_COMPARE_SUB(op);\
1482 case GRN_DB_UINT64 :\
1484 uint64_t x_ = GRN_UINT64_VALUE(x);\
1485 DO_COMPARE_SUB(op);\
1488 case GRN_DB_FLOAT :\
1490 double x_ = GRN_FLOAT_VALUE(x);\
1491 DO_COMPARE_SUB(op);\
1494 case GRN_DB_SHORT_TEXT :\
1496 case GRN_DB_LONG_TEXT :\
1497 if (GRN_DB_SHORT_TEXT <= y->header.domain && y->header.domain <= GRN_DB_LONG_TEXT) {\
1499 uint32_t la = GRN_TEXT_LEN(x), lb = GRN_TEXT_LEN(y);\
1501 if (!(r_ = memcmp(GRN_TEXT_VALUE(x), GRN_TEXT_VALUE(y), lb))) {\
1505 if (!(r_ = memcmp(GRN_TEXT_VALUE(x), GRN_TEXT_VALUE(y), la))) {\
1506 r_ = la == lb ? 0 : -1;\
1511 const char *q_ = GRN_TEXT_VALUE(x);\
1512 int x_ = grn_atoi(q_, q_ + GRN_TEXT_LEN(x), NULL);\
1513 DO_COMPARE_SUB(op);\
1522 #define DO_COMPARE(x, y, r, op) do {\
1523 if (x->header.domain >= GRN_N_RESERVED_TYPES) {\
1525 table = grn_ctx_at(ctx, x->header.domain);\
1526 switch (table->header.type) {\
1527 case GRN_TABLE_HASH_KEY :\
1528 case GRN_TABLE_PAT_KEY :\
1532 GRN_OBJ_INIT(&key, GRN_BULK, 0, table->header.domain);\
1533 length = grn_table_get_key2(ctx, table, GRN_RECORD_VALUE(x), &key);\
1535 grn_obj *x_original = x;\
1537 DO_COMPARE_BUILTIN((&key), y, r, op);\
1542 GRN_OBJ_FIN(ctx, &key);\
1549 grn_obj_unlink(ctx, table);\
1551 DO_COMPARE_BUILTIN(x, y, r, op);\
1555 #define DO_EQ_SUB do {\
1556 switch (y->header.domain) {\
1558 r = (x_ == GRN_INT8_VALUE(y));\
1560 case GRN_DB_UINT8 :\
1561 r = (x_ == GRN_UINT8_VALUE(y));\
1563 case GRN_DB_INT16 :\
1564 r = (x_ == GRN_INT16_VALUE(y));\
1566 case GRN_DB_UINT16 :\
1567 r = (x_ == GRN_UINT16_VALUE(y));\
1569 case GRN_DB_INT32 :\
1570 r = (x_ == GRN_INT32_VALUE(y));\
1572 case GRN_DB_UINT32 :\
1573 r = (x_ == GRN_UINT32_VALUE(y));\
1575 case GRN_DB_INT64 :\
1576 r = (x_ == GRN_INT64_VALUE(y));\
1579 r = (GRN_TIME_PACK(x_,0) == GRN_INT64_VALUE(y));\
1581 case GRN_DB_UINT64 :\
1582 r = (x_ == GRN_UINT64_VALUE(y));\
1584 case GRN_DB_FLOAT :\
1585 r = ((x_ <= GRN_FLOAT_VALUE(y)) && (x_ >= GRN_FLOAT_VALUE(y)));\
1587 case GRN_DB_SHORT_TEXT :\
1589 case GRN_DB_LONG_TEXT :\
1591 const char *p_ = GRN_TEXT_VALUE(y);\
1592 int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\
1602 #define DO_EQ(x,y,r) do {\
1603 switch (x->header.domain) {\
1609 int8_t x_ = GRN_INT8_VALUE(x);\
1613 case GRN_DB_UINT8 :\
1615 uint8_t x_ = GRN_UINT8_VALUE(x);\
1619 case GRN_DB_INT16 :\
1621 int16_t x_ = GRN_INT16_VALUE(x);\
1625 case GRN_DB_UINT16 :\
1627 uint16_t x_ = GRN_UINT16_VALUE(x);\
1631 case GRN_DB_INT32 :\
1633 int32_t x_ = GRN_INT32_VALUE(x);\
1637 case GRN_DB_UINT32 :\
1639 uint32_t x_ = GRN_UINT32_VALUE(x);\
1643 case GRN_DB_INT64 :\
1645 int64_t x_ = GRN_INT64_VALUE(x);\
1651 int64_t x_ = GRN_INT64_VALUE(x);\
1652 switch (y->header.domain) {\
1653 case GRN_DB_INT32 :\
1654 r = (x_ == GRN_TIME_PACK(GRN_INT32_VALUE(y), 0));\
1656 case GRN_DB_UINT32 :\
1657 r = (x_ == GRN_TIME_PACK(GRN_UINT32_VALUE(y), 0));\
1659 case GRN_DB_INT64 :\
1661 r = (x_ == GRN_INT64_VALUE(y));\
1663 case GRN_DB_UINT64 :\
1664 r = (x_ == GRN_UINT64_VALUE(y));\
1666 case GRN_DB_FLOAT :\
1667 r = (x_ == GRN_TIME_PACK(GRN_FLOAT_VALUE(y), 0));\
1669 case GRN_DB_SHORT_TEXT :\
1671 case GRN_DB_LONG_TEXT :\
1673 const char *p_ = GRN_TEXT_VALUE(y);\
1674 int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\
1675 r = (x_ == GRN_TIME_PACK(i_, 0));\
1684 case GRN_DB_UINT64 :\
1686 uint64_t x_ = GRN_UINT64_VALUE(x);\
1690 case GRN_DB_FLOAT :\
1692 double x_ = GRN_FLOAT_VALUE(x);\
1693 switch (y->header.domain) {\
1694 case GRN_DB_INT32 :\
1695 r = ((x_ <= GRN_INT32_VALUE(y)) && (x_ >= GRN_INT32_VALUE(y)));\
1697 case GRN_DB_UINT32 :\
1698 r = ((x_ <= GRN_UINT32_VALUE(y)) && (x_ >= GRN_UINT32_VALUE(y)));\
1700 case GRN_DB_INT64 :\
1702 r = ((x_ <= GRN_INT64_VALUE(y)) && (x_ >= GRN_INT64_VALUE(y)));\
1704 case GRN_DB_UINT64 :\
1705 r = ((x_ <= GRN_UINT64_VALUE(y)) && (x_ >= GRN_UINT64_VALUE(y)));\
1707 case GRN_DB_FLOAT :\
1708 r = ((x_ <= GRN_FLOAT_VALUE(y)) && (x_ >= GRN_FLOAT_VALUE(y)));\
1710 case GRN_DB_SHORT_TEXT :\
1712 case GRN_DB_LONG_TEXT :\
1714 const char *p_ = GRN_TEXT_VALUE(y);\
1715 int i_ = grn_atoi(p_, p_ + GRN_TEXT_LEN(y), NULL);\
1716 r = (x_ <= i_ && x_ >= i_);\
1725 case GRN_DB_SHORT_TEXT :\
1727 case GRN_DB_LONG_TEXT :\
1728 if (GRN_DB_SHORT_TEXT <= y->header.domain && y->header.domain <= GRN_DB_LONG_TEXT) {\
1729 uint32_t la = GRN_TEXT_LEN(x), lb = GRN_TEXT_LEN(y);\
1730 r = (la == lb && !memcmp(GRN_TEXT_VALUE(x), GRN_TEXT_VALUE(y), lb));\
1732 const char *q_ = GRN_TEXT_VALUE(x);\
1733 int x_ = grn_atoi(q_, q_ + GRN_TEXT_LEN(x), NULL);\
1738 if ((x->header.domain == y->header.domain)) {\
1739 r = (GRN_BULK_VSIZE(x) == GRN_BULK_VSIZE(y) &&\
1740 !(memcmp(GRN_BULK_HEAD(x), GRN_BULK_HEAD(y), GRN_BULK_VSIZE(x))));\
1743 if (x->header.domain < y->header.domain) {\
1744 GRN_OBJ_INIT(&dest, GRN_BULK, 0, y->header.domain);\
1745 if (!grn_obj_cast(ctx, x, &dest, GRN_FALSE)) {\
1746 r = (GRN_BULK_VSIZE(&dest) == GRN_BULK_VSIZE(y) &&\
1747 !memcmp(GRN_BULK_HEAD(&dest), GRN_BULK_HEAD(y), GRN_BULK_VSIZE(y))); \
1750 GRN_OBJ_INIT(&dest, GRN_BULK, 0, x->header.domain);\
1751 if (!grn_obj_cast(ctx, y, &dest, GRN_FALSE)) {\
1752 r = (GRN_BULK_VSIZE(&dest) == GRN_BULK_VSIZE(x) &&\
1753 !memcmp(GRN_BULK_HEAD(&dest), GRN_BULK_HEAD(x), GRN_BULK_VSIZE(x))); \
1756 GRN_OBJ_FIN(ctx, &dest);\
1762 #define GEO_RESOLUTION 3600000
1763 #define GEO_RADIOUS 6357303
1764 #define GEO_BES_C1 6334834
1765 #define GEO_BES_C2 6377397
1766 #define GEO_BES_C3 0.006674
1767 #define GEO_GRS_C1 6335439
1768 #define GEO_GRS_C2 6378137
1769 #define GEO_GRS_C3 0.006694
1770 #define GEO_INT2RAD(x) ((M_PI * x) / (GEO_RESOLUTION * 180))
1772 #define VAR_SET_VALUE(ctx,var,value) do {\
1773 if (GRN_DB_OBJP(value)) {\
1774 (var)->header.type = GRN_PTR;\
1775 (var)->header.domain = DB_OBJ(value)->id;\
1776 GRN_PTR_SET(ctx, (var), (value));\
1778 (var)->header.type = (value)->header.type;\
1779 (var)->header.domain = (value)->header.domain;\
1780 GRN_TEXT_SET(ctx, (var), GRN_TEXT_VALUE(value), GRN_TEXT_LEN(value));\
1812 #define PUSH1(v) do {\
1813 if (EXPRVP(v)) { vp++; }\
1818 #define POP1(v) do {\
1819 if (EXPRVP(s0)) { vp--; }\
1823 if (sp < s_) { ERR(GRN_INVALID_ARGUMENT, "stack underflow"); goto exit; }\
1827 #define ALLOC1(value) do {\
1829 *sp++ = s0 = value = vp++;\
1830 if (vp - e->values > e->values_tail) { e->values_tail = vp - e->values; }\
1833 #define POP1ALLOC1(arg,value) do {\
1838 if (sp < s_ + 1) { ERR(GRN_INVALID_ARGUMENT, "stack underflow"); goto exit; }\
1839 sp[-1] = s0 = value = vp++;\
1840 s0->header.impl_flags |= GRN_OBJ_EXPRVALUE;\
1844 #define POP2ALLOC1(arg1,arg2,value) do {\
1845 if (EXPRVP(s0)) { vp--; }\
1846 if (EXPRVP(s1)) { vp--; }\
1850 if (sp < s_ + 1) { ERR(GRN_INVALID_ARGUMENT, "stack underflow"); goto exit; }\
1852 sp[-1] = s0 = value = vp++;\
1853 s0->header.impl_flags |= GRN_OBJ_EXPRVALUE;\
1856 #define INTEGER_ARITHMETIC_OPERATION_PLUS(x, y) ((x) + (y))
1857 #define FLOAT_ARITHMETIC_OPERATION_PLUS(x, y) ((double)(x) + (double)(y))
1858 #define INTEGER_ARITHMETIC_OPERATION_MINUS(x, y) ((x) - (y))
1859 #define FLOAT_ARITHMETIC_OPERATION_MINUS(x, y) ((double)(x) - (double)(y))
1860 #define INTEGER_ARITHMETIC_OPERATION_STAR(x, y) ((x) * (y))
1861 #define FLOAT_ARITHMETIC_OPERATION_STAR(x, y) ((double)(x) * (double)(y))
1862 #define INTEGER_ARITHMETIC_OPERATION_SLASH(x, y) ((x) / (y))
1863 #define FLOAT_ARITHMETIC_OPERATION_SLASH(x, y) ((double)(x) / (double)(y))
1864 #define INTEGER_ARITHMETIC_OPERATION_MOD(x, y) ((x) % (y))
1865 #define FLOAT_ARITHMETIC_OPERATION_MOD(x, y) (fmod((x), (y)))
1866 #define INTEGER_ARITHMETIC_OPERATION_SHIFTL(x, y) ((x) << (y))
1867 #define FLOAT_ARITHMETIC_OPERATION_SHIFTL(x, y) \
1868 ((long long int)(x) << (long long int)(y))
1869 #define INTEGER_ARITHMETIC_OPERATION_SHIFTR(x, y) ((x) >> (y))
1870 #define FLOAT_ARITHMETIC_OPERATION_SHIFTR(x, y) \
1871 ((long long int)(x) >> (long long int)(y))
1872 #define INTEGER8_ARITHMETIC_OPERATION_SHIFTRR(x, y) \
1873 ((uint8_t)(x) >> (y))
1874 #define INTEGER16_ARITHMETIC_OPERATION_SHIFTRR(x, y) \
1875 ((uint16_t)(x) >> (y))
1876 #define INTEGER32_ARITHMETIC_OPERATION_SHIFTRR(x, y) \
1877 ((unsigned int)(x) >> (y))
1878 #define INTEGER64_ARITHMETIC_OPERATION_SHIFTRR(x, y) \
1879 ((long long unsigned int)(x) >> (y))
1880 #define FLOAT_ARITHMETIC_OPERATION_SHIFTRR(x, y) \
1881 ((long long unsigned int)(x) >> (long long unsigned int)(y))
1883 #define INTEGER_ARITHMETIC_OPERATION_BITWISE_OR(x, y) ((x) | (y))
1884 #define FLOAT_ARITHMETIC_OPERATION_BITWISE_OR(x, y) \
1885 ((long long int)(x) | (long long int)(y))
1886 #define INTEGER_ARITHMETIC_OPERATION_BITWISE_XOR(x, y) ((x) ^ (y))
1887 #define FLOAT_ARITHMETIC_OPERATION_BITWISE_XOR(x, y) \
1888 ((long long int)(x) ^ (long long int)(y))
1889 #define INTEGER_ARITHMETIC_OPERATION_BITWISE_AND(x, y) ((x) & (y))
1890 #define FLOAT_ARITHMETIC_OPERATION_BITWISE_AND(x, y) \
1891 ((long long int)(x) & (long long int)(y))
1893 #define INTEGER_UNARY_ARITHMETIC_OPERATION_MINUS(x) (-(x))
1894 #define FLOAT_UNARY_ARITHMETIC_OPERATION_MINUS(x) (-(x))
1895 #define INTEGER_UNARY_ARITHMETIC_OPERATION_BITWISE_NOT(x) (~(x))
1896 #define FLOAT_UNARY_ARITHMETIC_OPERATION_BITWISE_NOT(x) \
1897 (~((long long int)(x)))
1899 #define TEXT_ARITHMETIC_OPERATION(operator) do { \
1903 res->header.domain = GRN_DB_INT64; \
1905 GRN_INT64_SET(ctx, res, 0); \
1906 grn_obj_cast(ctx, x, res, GRN_FALSE); \
1907 x_ = GRN_INT64_VALUE(res); \
1909 GRN_INT64_SET(ctx, res, 0); \
1910 grn_obj_cast(ctx, y, res, GRN_FALSE); \
1911 y_ = GRN_INT64_VALUE(res); \
1913 GRN_INT64_SET(ctx, res, x_ operator y_); \
1916 #define TEXT_UNARY_ARITHMETIC_OPERATION(unary_operator) do { \
1919 res->header.domain = GRN_DB_INT64; \
1921 GRN_INT64_SET(ctx, res, 0); \
1922 grn_obj_cast(ctx, x, res, GRN_FALSE); \
1923 x_ = GRN_INT64_VALUE(res); \
1925 GRN_INT64_SET(ctx, res, unary_operator x_); \
1928 #define ARITHMETIC_OPERATION_NO_CHECK(y) do {} while (0)
1929 #define ARITHMETIC_OPERATION_ZERO_DIVISION_CHECK(y) do { \
1930 if ((long long int)y == 0) { \
1931 ERR(GRN_INVALID_ARGUMENT, "dividend should not be 0"); \
1937 #define NUMERIC_ARITHMETIC_OPERATION_DISPATCH(set, get, x_, y, res, \
1938 integer_operation, \
1940 right_expression_check, \
1941 invalid_type_error) do { \
1942 switch (y->header.domain) { \
1943 case GRN_DB_INT8 : \
1946 y_ = GRN_INT8_VALUE(y); \
1947 right_expression_check(y_); \
1948 set(ctx, res, integer_operation(x_, y_)); \
1951 case GRN_DB_UINT8 : \
1954 y_ = GRN_UINT8_VALUE(y); \
1955 right_expression_check(y_); \
1956 set(ctx, res, integer_operation(x_, y_)); \
1959 case GRN_DB_INT16 : \
1962 y_ = GRN_INT16_VALUE(y); \
1963 right_expression_check(y_); \
1964 set(ctx, res, integer_operation(x_, y_)); \
1967 case GRN_DB_UINT16 : \
1970 y_ = GRN_UINT16_VALUE(y); \
1971 right_expression_check(y_); \
1972 set(ctx, res, integer_operation(x_, y_)); \
1975 case GRN_DB_INT32 : \
1978 y_ = GRN_INT32_VALUE(y); \
1979 right_expression_check(y_); \
1980 set(ctx, res, integer_operation(x_, y_)); \
1983 case GRN_DB_UINT32 : \
1986 y_ = GRN_UINT32_VALUE(y); \
1987 right_expression_check(y_); \
1988 set(ctx, res, integer_operation(x_, y_)); \
1991 case GRN_DB_TIME : \
1994 y_ = GRN_TIME_VALUE(y); \
1995 right_expression_check(y_); \
1996 set(ctx, res, integer_operation(x_, y_)); \
1999 case GRN_DB_INT64 : \
2002 y_ = GRN_INT64_VALUE(y); \
2003 right_expression_check(y_); \
2004 set(ctx, res, integer_operation(x_, y_)); \
2007 case GRN_DB_UINT64 : \
2009 long long unsigned int y_; \
2010 y_ = GRN_UINT64_VALUE(y); \
2011 right_expression_check(y_); \
2012 set(ctx, res, integer_operation(x_, y_)); \
2015 case GRN_DB_FLOAT : \
2018 y_ = GRN_FLOAT_VALUE(y); \
2019 right_expression_check(y_); \
2020 res->header.domain = GRN_DB_FLOAT; \
2021 GRN_FLOAT_SET(ctx, res, float_operation(x_, y_)); \
2024 case GRN_DB_SHORT_TEXT : \
2025 case GRN_DB_TEXT : \
2026 case GRN_DB_LONG_TEXT : \
2028 if (grn_obj_cast(ctx, y, res, GRN_FALSE)) { \
2029 ERR(GRN_INVALID_ARGUMENT, \
2030 "not a numerical format: <%.*s>", \
2031 (int)GRN_TEXT_LEN(y), GRN_TEXT_VALUE(y)); \
2034 set(ctx, res, integer_operation(x_, get(res))); \
2037 invalid_type_error; \
2043 #define ARITHMETIC_OPERATION_DISPATCH(x, y, res, \
2044 integer8_operation, \
2045 integer16_operation, \
2046 integer32_operation, \
2047 integer64_operation, \
2049 left_expression_check, \
2050 right_expression_check, \
2052 invalid_type_error) do { \
2053 switch (x->header.domain) { \
2054 case GRN_DB_INT8 : \
2057 x_ = GRN_INT8_VALUE(x); \
2058 left_expression_check(x_); \
2059 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_INT8_SET, \
2062 integer8_operation, \
2064 right_expression_check, \
2065 invalid_type_error); \
2068 case GRN_DB_UINT8 : \
2071 x_ = GRN_UINT8_VALUE(x); \
2072 left_expression_check(x_); \
2073 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_UINT8_SET, \
2076 integer8_operation, \
2078 right_expression_check, \
2079 invalid_type_error); \
2082 case GRN_DB_INT16 : \
2085 x_ = GRN_INT16_VALUE(x); \
2086 left_expression_check(x_); \
2087 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_INT16_SET, \
2090 integer16_operation, \
2092 right_expression_check, \
2093 invalid_type_error); \
2096 case GRN_DB_UINT16 : \
2099 x_ = GRN_UINT16_VALUE(x); \
2100 left_expression_check(x_); \
2101 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_UINT16_SET, \
2104 integer16_operation, \
2106 right_expression_check, \
2107 invalid_type_error); \
2110 case GRN_DB_INT32 : \
2113 x_ = GRN_INT32_VALUE(x); \
2114 left_expression_check(x_); \
2115 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_INT32_SET, \
2118 integer32_operation, \
2120 right_expression_check, \
2121 invalid_type_error); \
2124 case GRN_DB_UINT32 : \
2127 x_ = GRN_UINT32_VALUE(x); \
2128 left_expression_check(x_); \
2129 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_UINT32_SET, \
2132 integer32_operation, \
2134 right_expression_check, \
2135 invalid_type_error); \
2138 case GRN_DB_INT64 : \
2141 x_ = GRN_INT64_VALUE(x); \
2142 left_expression_check(x_); \
2143 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_UINT64_SET, \
2146 integer64_operation, \
2148 right_expression_check, \
2149 invalid_type_error); \
2152 case GRN_DB_TIME : \
2155 x_ = GRN_TIME_VALUE(x); \
2156 left_expression_check(x_); \
2157 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_TIME_SET, \
2160 integer64_operation, \
2162 right_expression_check, \
2163 invalid_type_error); \
2166 case GRN_DB_UINT64 : \
2168 long long unsigned int x_; \
2169 x_ = GRN_UINT64_VALUE(x); \
2170 left_expression_check(x_); \
2171 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_UINT64_SET, \
2174 integer64_operation, \
2176 right_expression_check, \
2177 invalid_type_error); \
2180 case GRN_DB_FLOAT : \
2183 x_ = GRN_FLOAT_VALUE(x); \
2184 left_expression_check(x_); \
2185 NUMERIC_ARITHMETIC_OPERATION_DISPATCH(GRN_FLOAT_SET, \
2190 right_expression_check, \
2191 invalid_type_error); \
2194 case GRN_DB_SHORT_TEXT : \
2195 case GRN_DB_TEXT : \
2196 case GRN_DB_LONG_TEXT : \
2200 invalid_type_error; \
2206 #define ARITHMETIC_BINARY_OPERATION_DISPATCH(integer8_operation, \
2207 integer16_operation, \
2208 integer32_operation, \
2209 integer64_operation, \
2211 left_expression_check, \
2212 right_expression_check, \
2214 invalid_type_error) do { \
2217 POP2ALLOC1(x, y, res); \
2219 res->header.domain = x->header.domain; \
2221 ARITHMETIC_OPERATION_DISPATCH(x, y, res, \
2222 integer8_operation, \
2223 integer16_operation, \
2224 integer32_operation, \
2225 integer64_operation, \
2227 left_expression_check, \
2228 right_expression_check, \
2230 invalid_type_error); \
2232 res->header.domain = x->header.domain; \
2236 #define ARITHMETIC_UNARY_OPERATION_DISPATCH(integer_operation, \
2238 left_expression_check, \
2239 right_expression_check, \
2241 invalid_type_error) do { \
2243 POP1ALLOC1(x, res); \
2244 res->header.domain = x->header.domain; \
2245 switch (x->header.domain) { \
2246 case GRN_DB_INT8 : \
2249 x_ = GRN_INT8_VALUE(x); \
2250 left_expression_check(x_); \
2251 GRN_INT8_SET(ctx, res, integer_operation(x_)); \
2254 case GRN_DB_UINT8 : \
2257 x_ = GRN_UINT8_VALUE(x); \
2258 left_expression_check(x_); \
2259 GRN_INT16_SET(ctx, res, integer_operation(x_)); \
2260 res->header.domain = GRN_DB_INT16; \
2263 case GRN_DB_INT16 : \
2266 x_ = GRN_INT16_VALUE(x); \
2267 left_expression_check(x_); \
2268 GRN_INT16_SET(ctx, res, integer_operation(x_)); \
2271 case GRN_DB_UINT16 : \
2274 x_ = GRN_UINT16_VALUE(x); \
2275 left_expression_check(x_); \
2276 GRN_INT32_SET(ctx, res, integer_operation(x_)); \
2277 res->header.domain = GRN_DB_INT32; \
2280 case GRN_DB_INT32 : \
2283 x_ = GRN_INT32_VALUE(x); \
2284 left_expression_check(x_); \
2285 GRN_INT32_SET(ctx, res, integer_operation(x_)); \
2288 case GRN_DB_UINT32 : \
2291 x_ = GRN_UINT32_VALUE(x); \
2292 left_expression_check(x_); \
2293 GRN_INT64_SET(ctx, res, integer_operation(x_)); \
2294 res->header.domain = GRN_DB_INT64; \
2297 case GRN_DB_INT64 : \
2300 x_ = GRN_INT64_VALUE(x); \
2301 left_expression_check(x_); \
2302 GRN_INT64_SET(ctx, res, integer_operation(x_)); \
2305 case GRN_DB_TIME : \
2308 x_ = GRN_TIME_VALUE(x); \
2309 left_expression_check(x_); \
2310 GRN_TIME_SET(ctx, res, integer_operation(x_)); \
2313 case GRN_DB_UINT64 : \
2315 long long unsigned int x_; \
2316 x_ = GRN_UINT64_VALUE(x); \
2317 left_expression_check(x_); \
2318 if (x_ > (long long unsigned int)INT64_MAX) { \
2319 ERR(GRN_INVALID_ARGUMENT, \
2320 "too large UInt64 value to inverse sign: " \
2321 "<%" GRN_FMT_LLU ">", \
2325 long long int signed_x_; \
2327 GRN_INT64_SET(ctx, res, integer_operation(signed_x_)); \
2328 res->header.domain = GRN_DB_INT64; \
2332 case GRN_DB_FLOAT : \
2335 x_ = GRN_FLOAT_VALUE(x); \
2336 left_expression_check(x_); \
2337 GRN_FLOAT_SET(ctx, res, float_operation(x_)); \
2340 case GRN_DB_SHORT_TEXT : \
2341 case GRN_DB_TEXT : \
2342 case GRN_DB_LONG_TEXT : \
2346 invalid_type_error; \
2352 #define EXEC_OPERATE(operate_sentence, assign_sentence) \
2356 #define EXEC_OPERATE_POST(operate_sentence, assign_sentence) \
2360 #define UNARY_OPERATE_AND_ASSIGN_DISPATCH(exec_operate, delta, \
2362 grn_obj *var, *col, value; \
2365 POP1ALLOC1(var, res); \
2366 if (var->header.type != GRN_PTR) { \
2367 ERR(GRN_INVALID_ARGUMENT, "invalid variable type: 0x%0x", \
2368 var->header.type); \
2371 if (GRN_BULK_VSIZE(var) != (sizeof(grn_obj *) + sizeof(grn_id))) { \
2372 ERR(GRN_INVALID_ARGUMENT, \
2373 "invalid variable size: expected: %zu, actual: %zu", \
2374 (sizeof(grn_obj *) + sizeof(grn_id)), GRN_BULK_VSIZE(var)); \
2377 col = GRN_PTR_VALUE(var); \
2378 rid = *(grn_id *)(GRN_BULK_HEAD(var) + sizeof(grn_obj *)); \
2379 res->header.type = GRN_VOID; \
2380 res->header.domain = DB_OBJ(col)->range; \
2381 switch (DB_OBJ(col)->range) { \
2382 case GRN_DB_INT32 : \
2383 GRN_INT32_INIT(&value, 0); \
2384 GRN_INT32_SET(ctx, &value, delta); \
2386 case GRN_DB_UINT32 : \
2387 GRN_UINT32_INIT(&value, 0); \
2388 GRN_UINT32_SET(ctx, &value, delta); \
2390 case GRN_DB_INT64 : \
2391 GRN_INT64_INIT(&value, 0); \
2392 GRN_INT64_SET(ctx, &value, delta); \
2394 case GRN_DB_UINT64 : \
2395 GRN_UINT64_INIT(&value, 0); \
2396 GRN_UINT64_SET(ctx, &value, delta); \
2398 case GRN_DB_FLOAT : \
2399 GRN_FLOAT_INIT(&value, 0); \
2400 GRN_FLOAT_SET(ctx, &value, delta); \
2402 case GRN_DB_TIME : \
2403 GRN_TIME_INIT(&value, 0); \
2404 GRN_TIME_SET(ctx, &value, GRN_TIME_PACK(delta, 0)); \
2407 ERR(GRN_INVALID_ARGUMENT, \
2408 "invalid increment target type: %d " \
2409 "(FIXME: type name is needed)", DB_OBJ(col)->range); \
2413 exec_operate(grn_obj_set_value(ctx, col, rid, &value, set_flags);, \
2414 grn_obj_get_value(ctx, col, rid, res);); \
2418 #define ARITHMETIC_OPERATION_AND_ASSIGN_DISPATCH(integer8_operation, \
2419 integer16_operation, \
2420 integer32_operation, \
2421 integer64_operation, \
2423 left_expression_check, \
2424 right_expression_check,\
2425 text_operation) do { \
2426 grn_obj *value, *var, *res; \
2427 if (code->value) { \
2428 value = code->value; \
2429 POP1ALLOC1(var, res); \
2431 POP2ALLOC1(var, value, res); \
2433 if (var->header.type == GRN_PTR && \
2434 GRN_BULK_VSIZE(var) == (sizeof(grn_obj *) + sizeof(grn_id))) { \
2435 grn_obj *col = GRN_PTR_VALUE(var); \
2436 grn_id rid = *(grn_id *)(GRN_BULK_HEAD(var) + sizeof(grn_obj *)); \
2437 grn_obj variable_value, casted_value; \
2440 value = GRN_OBJ_RESOLVE(ctx, value); \
2442 domain = grn_obj_get_range(ctx, col); \
2443 GRN_OBJ_INIT(&variable_value, GRN_BULK, 0, domain); \
2444 grn_obj_get_value(ctx, col, rid, &variable_value); \
2446 GRN_OBJ_INIT(&casted_value, GRN_BULK, 0, domain); \
2447 if (grn_obj_cast(ctx, value, &casted_value, GRN_FALSE)) { \
2448 ERR(GRN_INVALID_ARGUMENT, "invalid value: string"); \
2449 GRN_OBJ_FIN(ctx, &variable_value); \
2450 GRN_OBJ_FIN(ctx, &casted_value); \
2454 grn_obj_reinit(ctx, res, domain, 0); \
2455 ARITHMETIC_OPERATION_DISPATCH((&variable_value), (&casted_value), \
2457 integer8_operation, \
2458 integer16_operation, \
2459 integer32_operation, \
2460 integer64_operation, \
2462 left_expression_check, \
2463 right_expression_check, \
2465 grn_obj_set_value(ctx, col, rid, res, GRN_OBJ_SET); \
2466 GRN_OBJ_FIN(ctx, (&variable_value)); \
2467 GRN_OBJ_FIN(ctx, (&casted_value)); \
2469 ERR(GRN_INVALID_ARGUMENT, "left hand expression isn't column."); \
2506 const char *a_norm, *b_norm;
2509 matched = (strstr(a_norm, b_norm) != NULL);
2521 grn_expr_exec_get_member(
grn_ctx *ctx,
2523 grn_obj *column_and_record_id,
2542 if (n_elements > i) {
2548 if (values.
u.
v.n_sections > i) {
2573 sp = s_ + stack_curr;
2593 if (code->
nargs == 1) {
2630 if (sp < s_ + code->nargs) {
2639 int offset = code->
nargs + 1;
2640 if (sp < s_ + offset) {
2655 if (proc != proc_) {
2681 grn_obj *value_type, *key_type, *flags, *name;
2692 key_type, value_type);
2734 value = code->
value;
2862 "variable >>>= \"string\" isn't supported");
2909 code += code->
nargs + 1;
2914 unsigned int v_boolean;
2917 if (!v_boolean) { code += code->
nargs; }
2930 if (code->
nargs == 1) {
3005 grn_obj *op, *res, *expr, *table;
3023 grn_obj *keys_, *res, *limit, *table;
3038 for (i = 0; i < n; i++) {
3039 uint32_t len = (uint32_t) (tokbuf[i] - p);
3042 keys[n_keys].
key = col;
3047 if (p[0] ==
':' && p[1] ==
'd' && len == 2 && n_keys) {
3056 for (i = 0; i < n_keys; i++) {
3081 for (i = 0; i < n; i++) {
3082 uint32_t len = (uint32_t) (tokbuf[i] - p);
3085 keys[n_keys].
key = col;
3089 }
else if (n_keys) {
3090 if (p[0] ==
':' && p[1] ==
'd' && len == 2) {
3099 results.
table = res;
3108 for (i = 0; i < n_keys; i++) {
3139 unsigned int x_boolean, y_boolean;
3144 if (x_boolean && y_boolean) {
3157 unsigned int x_boolean, y_boolean;
3162 if (x_boolean || y_boolean) {
3199 matched = pseudo_query_scan(ctx, x, y);
3305 double lng1, lat1, lng2, lat2, x, y, d;
3314 x = (lng2 - lng1) * cos((lat1 + lat2) * 0.5);
3326 double lng1, lat1, lng2, lat2, x, y, d;
3335 x = sin(fabs(lng2 - lng1) * 0.5);
3336 y = sin(fabs(lat2 - lat1) * 0.5);
3337 d = asin(sqrt((y * y) + cos(lat1) * cos(lat2) * x * x)) * 2 *
GEO_RADIOUS;
3347 double lng1, lat1, lng2, lat2, p, q, m, n, x, y, d;
3356 p = (lat1 + lat2) * 0.5;
3360 x = n * cos(p) * fabs(lng1 - lng2);
3361 y = m * fabs(lat1 - lat2);
3362 d = sqrt((x * x) + (y * y));
3372 double lng1, lat1, lng2, lat2, p, q, m, n, x, y, d;
3381 p = (lat1 + lat2) * 0.5;
3385 x = n * cos(p) * fabs(lng1 - lng2);
3386 y = m * fabs(lat1 - lat2);
3387 d = sqrt((x * x) + (y * y));
3398 double lng0, lat0, lng1, lat1, x, y, d;
3408 x = (lng1 - lng0) * cos((lat0 + lat1) * 0.5);
3432 double lng0, lat0, lng1, lat1, lng2, lat2, x, y, d;
3445 x = (lng1 - lng0) * cos((lat0 + lat1) * 0.5);
3447 d = (x * x) + (y * y);
3448 x = (lng2 - lng1) * cos((lat1 + lat2) * 0.5);
3450 r = d <= (x * x) + (y * y);
3461 int64_t ln0, la0, ln1, la1, ln2, la2, ln3, la3;
3478 r = ((ln2 <= ln0) && (ln0 <= ln3) && (la2 <= la0) && (la0 <= la3));
3497 }
else if (y == res) {
3514 if (code->
nargs == 1) {
3544 "\"string\" - \"string\" "
3562 "\"string\" * \"string\" "
3579 "\"string\" / \"string\" "
3596 "\"string\" %% \"string\" "
3675 long long unsigned int x_;
3676 long long unsigned int y_;
3718 POP2ALLOC1(column_and_record_id, index, res);
3719 grn_expr_exec_get_member(ctx, expr, column_and_record_id, index, res);
3751 if (0 <= offset && offset < e->values_size) {
3752 res = &e->
values[offset];
3805 #define SI_FREE(si) do {\
3806 GRN_OBJ_FIN(ctx, &(si)->wv);\
3807 GRN_OBJ_FIN(ctx, &(si)->index);\
3811 #define SI_ALLOC(si, i, st) do {\
3812 if (!((si) = GRN_MALLOCN(scan_info, 1))) {\
3814 for (j = 0; j < i; j++) { SI_FREE(sis[j]); }\
3818 GRN_INT32_INIT(&(si)->wv, GRN_OBJ_VECTOR);\
3819 GRN_PTR_INIT(&(si)->index, GRN_OBJ_VECTOR, GRN_ID_NIL);\
3820 (si)->logical_op = GRN_OP_OR;\
3821 (si)->flags = SCAN_PUSH;\
3823 (si)->start = (st);\
3829 int nparens = 1, ndifops = 0, i = *ip, j =
i, r = 0;
3867 memcpy(&sis[i], &sis[j],
sizeof(
scan_info *) * (r - j));
3868 memmove(&sis[j], &sis[r],
sizeof(
scan_info *) * (i - r));
3869 memcpy(&sis[i + j - r], &sis[i],
sizeof(
scan_info *) * (r - j));
3883 for (j = 0; j <
i; j++) {
SI_FREE(sis[j]); }
3891 #define EXPRLOG(name,expr) do {\
3893 GRN_TEXT_INIT(&strbuf, 0);\
3894 grn_expr_inspect(ctx, &strbuf, (expr));\
3895 GRN_TEXT_PUTC(ctx, &strbuf, '\0');\
3896 GRN_LOG(ctx, GRN_LOG_NOTICE, "%s=(%s)", (name), GRN_TEXT_VALUE(&strbuf));\
3897 GRN_OBJ_FIN(ctx, &strbuf);\
3909 for (i = 0; i < ni; i++, pi--) {
3910 if (index == pi[-1]) {
3913 memmove(pw + 2, pw,
sizeof(int32_t) * 2 * i);
3914 pw[0] = (int32_t) sid;
3916 memmove(pi + 1, pi,
sizeof(
grn_obj *) * i);
3976 scan_info_put_index(ctx, si, index, sid, weight);
3983 return put_logical_op(ctx, sis, ip, op, start);
3989 return get_weight(ctx, ec);
4037 if (si->
nargs >= 8) {
4048 if (i >= si->
nargs) {
4060 int i, m = 0, o = 0;
4064 #ifdef GRN_WITH_MRUBY
4065 if (ctx->
impl->mrb.state) {
4098 if (o >= m) {
return NULL; }
4133 if (stat || m != o + 1) {
return NULL; }
4160 for (; p < pe; p++) {
4161 if ((*p)->header.type ==
GRN_EXPR) {
4170 int32_t weight = get_weight(ctx, ec);
4173 scan_info_put_index(ctx, si, ec->
value, sid, weight);
4175 scan_info_put_index(ctx, si, index, sid, weight);
4182 scan_info_put_index(ctx, si, index, sid, get_weight(ctx, ec));
4196 scan_info_put_index(ctx, si, index, sid, get_weight(ctx, ec));
4203 scan_info_put_index(ctx, si, index, sid, 1);
4209 scan_info_put_index(ctx, si, *p, sid, 1);
4211 scan_info_put_index(ctx, si, index, sid, 1);
4225 if (!put_logical_op(ctx, sis, &i, c->
op, c - e->
codes)) {
return NULL; }
4230 if (c->
value == var) {
4233 if (si->
nargs < 8) {
4248 if (si->
nargs < 8) {
4263 "invalid expression: can't use column as a value: %.*s",
4266 for (j = 0; j <
i; j++) {
SI_FREE(sis[j]); }
4289 for (; p < pe; p++) {
4292 scan_info_put_index(ctx, si, index, sid, 1);
4297 scan_info_put_index(ctx, si, index, sid, 1);
4315 if (!(sis[0]->flags &
SCAN_PUSH) || (sis[0]->logical_op != op)) {
4318 for (j = 0; j <
i; j++) {
SI_FREE(sis[j]); }
4322 sis[0]->
flags &= ~SCAN_PUSH;
4326 if (!put_logical_op(ctx, sis, &i, op, c - e->
codes)) {
return NULL; }
4410 grn_table_select_index_range_column(
grn_ctx *ctx,
grn_obj *table,
4427 const void *min = NULL, *max = NULL;
4428 unsigned int min_size = 0, max_size = 0;
4458 min, min_size, max, max_size,
4459 offset, limit, flags);
4480 grn_table_select_index_range_accessor(
grn_ctx *ctx,
grn_obj *table,
4497 target = last_accessor->
obj;
4511 if (!grn_table_select_index_range_column(ctx, table, index, si,
GRN_OP_OR,
4521 for (i = n_accessors - 1; i > 0; i--) {
4529 grn_id *next_record_id = NULL;
4532 target = accessor->
obj;
4560 (
const char *)next_record_id,
sizeof(
grn_id),
4561 (
grn_hash *)next_res, next_op, NULL);
4568 (
grn_hash *)next_res, next_op, NULL);
4583 current_res = next_res;
4586 if (res != next_res) {
4595 return current_res == res;
4613 for (a = accessor; a; a = a->
next) {
4616 processed = grn_table_select_index_range_accessor(ctx, table,
4622 return grn_table_select_index_range_column(ctx, table, index, si,
4782 #define DEFAULT_NEAR_MAX_INTERVAL 10
4784 #undef DEFAULT_NEAR_MAX_INTERVAL
4796 for (; j--; ip++, wp += 2) {
4797 uint32_t sid = (uint32_t) wp[0];
4798 int32_t weight = wp[1];
4800 int weight_index = sid - 1;
4809 if (sid && ip[0] == ip[1]) {
continue; }
4843 if (selector_proc_p(si->
args[0])) {
4859 processed = grn_table_select_index_range(ctx, table, index, si, res);
4869 if (selector_proc_p(si->
args[0])) {
4892 unsigned int res_size;
4916 if ((sis = scan_info_build(ctx, expr, &n, op, res_size))) {
4922 for (i = 0; i < n; i++) {
4932 if (si->
flags & SCAN_PUSH) {
4938 if (!res_created) { i++; }
4949 processed = grn_table_select_index(ctx, table, si, res);
4951 if (ctx->
rc) {
break; }
4954 grn_table_select_(ctx, table, expr, v, res, si->
logical_op);
4960 for (i = 0; i < n; i++) {
4970 grn_table_select_(ctx, table, expr, v, res, op);
4983 if (offset < 0) { offset = size + offset; }
4984 return (0 <= offset && offset < size)
4993 if (offset < 0) { offset = size + offset; }
4994 return (0 <= offset && offset < size)
5003 #define DEFAULT_WEIGHT 5
5004 #define DEFAULT_DECAYSTEP 2
5005 #define DEFAULT_MAX_INTERVAL 10
5006 #define DEFAULT_SIMILARITY_THRESHOLD 10
5007 #define DEFAULT_TERM_EXTRACT_POLICY 0
5008 #define DEFAULT_WEIGHT_VECTOR_SIZE 4096
5061 const char *start, *s;
5074 }
else if (len == 1) {
5103 const char *start = q->
cur, *end;
5104 for (end = q->
cur;; ) {
5117 const char *tokbuf[8];
5118 int32_t lng0, lat0, lng1, lat1, lng2, lat2, r;
5119 int32_t n =
grn_str_tok((
char *)start, end - start,
',', tokbuf, 8, NULL);
5122 lng0 =
grn_atoi(start, tokbuf[0], NULL);
5123 lat0 =
grn_atoi(tokbuf[0] + 1, tokbuf[1], NULL);
5124 r =
grn_atoi(tokbuf[1] + 1, tokbuf[2], NULL);
5137 lng0 =
grn_atoi(start, tokbuf[0], NULL);
5138 lat0 =
grn_atoi(tokbuf[0] + 1, tokbuf[1], NULL);
5139 lng1 =
grn_atoi(tokbuf[1] + 1, tokbuf[2], NULL);
5140 lat1 =
grn_atoi(tokbuf[2] + 1, tokbuf[3], NULL);
5154 lng0 =
grn_atoi(start, tokbuf[0], NULL);
5155 lat0 =
grn_atoi(tokbuf[0] + 1, tokbuf[1], NULL);
5156 lng1 =
grn_atoi(tokbuf[1] + 1, tokbuf[2], NULL);
5157 lat1 =
grn_atoi(tokbuf[2] + 1, tokbuf[3], NULL);
5158 lng2 =
grn_atoi(tokbuf[3] + 1, tokbuf[4], NULL);
5159 lat2 =
grn_atoi(tokbuf[4] + 1, tokbuf[5], NULL);
5185 const char *start = q->
cur, *end;
5187 for (end = q->
cur;; ) {
5200 if (c && end + 1 < q->
str_end) {
5212 get_token(ctx, q, &op, c, mode);
5216 if (end + 2 < q->
str_end && end[2] ==
'=') {
5225 if (end + 2 < q->
str_end && end[2] ==
'=') {
5239 return get_geocond(ctx, q, column, c);
5246 return get_token(ctx, q, &op, c, mode);
5291 const char *start, *end = q->
cur;
5352 return get_phrase(ctx, q, column, mode, option);
5356 get_op(q, op, &mode, &option);
5383 return get_expr(ctx, q, column, mode);
5386 if (q->
cur[1] ==
'R' && q->
cur[2] ==
' ') {
5393 return get_word(ctx, q, column, mode, option);
5404 grn_rc rc = get_token(ctx, q, &op, column, mode);
5405 if (rc) {
return rc; }
5406 while (!(rc = get_token(ctx, q, &op, column, mode))) {
5417 #define DISABLE_UNUSED_CODE 1
5418 #ifndef DISABLE_UNUSED_CODE
5430 for (p = source; p < query->
str_end; ) {
5451 }
else if (key < DEFAULT_WEIGHT_VECTOR_SIZE) {
5463 if (*p !=
',') {
break; }
5472 const char *start, *end = q->
cur;
5474 if (++end >= q->
str_end) {
break; }
5479 while (end < q->str_end && ((
'0' <= *end && *end <=
'9') || *end ==
'-')) { end++; }
5511 end = (
char *)get_weight_vector(ctx, q, start);
5519 section_weight_cb(
grn_ctx *ctx,
grn_hash *r,
const void *rid,
int sid,
void *arg)
5535 grn_expr_parser_open(
grn_ctx *ctx)
5540 pParser->
yyidx = -1;
5542 yyGrowStack(pParser);
5550 #define PARSE(token) grn_expr_parser(ctx->impl->parser, (token), 0, q)
5554 const char *str,
unsigned int str_size)
5559 grn_expr_add_str(ctx, efsi->
e, str, str_size));
5579 for (end = q->
cur;; ) {
5595 if (c && end + 1 < q->
str_end) {
5612 if (end + 2 < q->
str_end && end[2] ==
'=') {
5621 if (end + 2 < q->
str_end && end[2] ==
'=') {
5704 const char *start, *s;
5717 }
else if (len == 1) {
5730 accept_query_string(ctx, q,
5737 get_op(q, op, &mode, &option);
5785 if (q->
cur[1] ==
'R' && q->
cur[2] ==
' ') {
5795 first_token = block_started;
5810 for (s = q->
cur + 1; s < q->str_end; s += len) {
5830 resolve_top_level_name(
grn_ctx *ctx,
const char *name,
unsigned int name_size)
5833 unsigned int first_delimiter_position = 0;
5834 unsigned int n_delimiters = 0;
5838 for (i = 0; i < name_size; i++) {
5843 if (n_delimiters == 0) {
5844 first_delimiter_position =
i;
5849 if (n_delimiters < 2) {
5853 top_level_object =
grn_ctx_get(ctx, name, first_delimiter_position);
5854 if (!top_level_object) {
5858 name + first_delimiter_position + 1,
5859 name_size - first_delimiter_position - 1);
5870 for (s = q->
cur; s < q->str_end; s += len) {
5878 case '\0' :
case '(' :
case ')' :
case '{' :
case '}' :
5879 case '[' :
case ']' :
case ',' :
case ':' :
case '@' :
5880 case '?' :
case '"' :
case '*' :
case '+' :
case '-' :
5881 case '|' :
case '/' :
case '%' :
case '!' :
case '^' :
5882 case '&' :
case '>' :
case '<' :
case '=' :
case '~' :
5893 if (len == 6 && !memcmp(q->
cur,
"delete", 6)) {
5899 if (len == 5 && !memcmp(q->
cur,
"false", 5)) {
5910 if (len == 2 && !memcmp(q->
cur,
"in", 2)) {
5916 if (len == 4 && !memcmp(q->
cur,
"null", 4)) {
5926 if (len == 4 && !memcmp(q->
cur,
"true", 4)) {
5939 const char *name = q->
cur;
5940 unsigned int name_size = s - q->
cur;
5952 if ((obj = resolve_top_level_name(ctx, name, name_size))) {
6024 set_tos_minor_to_curr(ctx, q);
6050 set_tos_minor_to_curr(ctx, q);
6054 if ((rc = get_string(ctx, q,
'"'))) {
goto exit; }
6059 if ((rc = get_string(ctx, q,
'\''))) {
goto exit; }
6096 "'*=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6113 "'++' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6122 "'+=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6140 "'--' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6149 "'-=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6170 "'|=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6187 "'/=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6204 "'%%=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6233 "'^=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6254 "'&=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6281 "'>>>=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6295 "'>>=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6324 "'<<=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6353 "'=' is not allowed (%.*s)", (
int)(q->
str_end - q->
str), q->
str);
6358 case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
6359 case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
6367 (*rest ==
'.' || *rest ==
'e' || *rest ==
'E' ||
6368 (*rest >=
'0' && *rest <=
'9'))) {
6370 double d = strtod(q->
cur, &rest_float);
6377 const char *rest64 = rest;
6381 (q->
str_end != rest && *rest >=
'0' && *rest <=
'9')) {
6399 if ((rc = get_identifier(ctx, q))) {
goto exit; }
6402 if (ctx->
rc) { rc = ctx->
rc;
break; }
6411 const char *str,
unsigned int str_size,
6416 if (grn_expr_parser_open(ctx)) {
return ctx->
rc; }
6430 efsi.
str_end = str + str_size;
6447 parse_script(ctx, &efsi);
6449 parse_query(ctx, &efsi);
6483 while (pParser->
yyidx >= 0) yy_pop_parser_stack(pParser);
6495 unsigned int width,
unsigned int max_results,
6496 unsigned int n_tags,
6497 const char **opentags,
unsigned int *opentag_lens,
6498 const char **closetags,
unsigned int *closetag_lens,
6505 if ((sis = scan_info_build(ctx, expr, &n,
GRN_OP_OR, 0))) {
6507 NULL, 0, NULL, 0, mapping))) {
6508 int butp = 0, nparens = 0, npbut = 0;
6528 if (si->
flags & SCAN_PUSH) {
6529 if (nparens == npbut) {
6538 for (i = 0;; i = (i + 1) % n_tags) {
6543 opentags[i], opentag_lens[i], closetags[i], closetag_lens[i]);
6557 for (i = n; i--;) {
SI_FREE(sis[i]); }
6585 res_add(ctx, (
grn_hash *)result_set, &pi, 1, set_operation);
6594 const char *target_characters,
6595 char escape_character,
6599 const char *current, *string_end;
6606 if (string_size < 0) {
6607 string_size = strlen(
string);
6609 string_end =
string + string_size;
6612 while (current < string_end) {
6613 unsigned int char_size;
6614 char_size =
grn_charlen(ctx, current, string_end);
6615 switch (char_size) {
6621 if (strchr(target_characters, *current)) {
6625 current += char_size;
6629 current += char_size;
6641 const char target_characters[] = {