--- src/libs/zbxserver/expression.c.orig 2012-08-28 23:24:16.000000000 +0400 +++ src/libs/zbxserver/expression.c 2012-08-29 17:51:18.000000000 +0400 @@ -185,12 +185,13 @@ } /* operators with lowest priority come first */ - /* HIGHEST / * - + < > # = & | LOWEST */ + /* HIGHEST / ~ ^ * - + < > # = & | LOWEST */ if (NULL != (p = strchr(exp, '|')) || NULL != (p = strchr(exp, '&')) || NULL != (p = strchr(exp, '=')) || NULL != (p = strchr(exp, '#')) || NULL != (p = strchr(exp, '>')) || NULL != (p = strchr(exp, '<')) || NULL != (p = strchr(exp, '+')) || NULL != (p = strrchr(exp, '-')) || - NULL != (p = strchr(exp, '*')) || NULL != (p = strrchr(exp, '/'))) + NULL != (p = strchr(exp, '*')) || NULL != (p = strrchr(exp, '/')) || + NULL != (p = strchr(exp, '^')) || NULL != (p = strrchr(exp, '~'))) { c = *p; *p = '\0'; @@ -242,12 +243,35 @@ case '/': if (SUCCEED == cmp_double(value2, 0)) { - zbx_snprintf(error, maxerrlen, "Division by zero. Cannot evaluate expression [%s]", exp); - return FAIL; + if (SUCCEED == cmp_double(value1, 0)) + { + *result = 0; + break; + } else { + zbx_snprintf(error, maxerrlen, "Division by zero. Cannot evaluate expression [%s]", exp); + return FAIL; + } } *result = value1 / value2; break; + case '^': + if (value1 <= 0) + { + zbx_snprintf(error, maxerrlen, "Negative first argument in pow. Cannot evaluate expression [%s]", exp); + return FAIL; + } + *result = pow(value1, value2); + break; + case '~': + if (SUCCEED != cmp_double(value1, 2)) + { + zbx_snprintf(error, maxerrlen, "Support only square root. Cannot evaluate expression [%s]", exp); + return FAIL; + } + + *result = sqrt(fabs(value2)); + break; } return SUCCEED;