diff --git a/src/parser/analyzer.c b/src/parser/analyzer.c
index 01539edbe71f870de8486b52320caa6dd9fa4444..dea83d7e0c828d8966fbffe9e91a2895c466fdf7 100644 (file)
--- a/src/parser/analyzer.c
+++ b/src/parser/analyzer.c
break;
case SDB_AST_ISNULL:
+ case SDB_AST_ISTRUE:
+ case SDB_AST_ISFALSE:
if (analyze_node(context, op->right, errbuf))
return -1;
break;
return -1;
}
- if ((context != SDB_ATTRIBUTE) && (v->type == SDB_FIELD_VALUE)) {
- sdb_strbuf_sprintf(errbuf, "Invalid expression %s.value",
- SDB_FIELD_TO_NAME(v->type));
- return -1;
+ if (context != UNSPEC_CONTEXT) {
+ /* skip these checks if we don't know the context; it's up to the
+ * caller to check again once the right context information is
+ * available */
+ if ((context != SDB_ATTRIBUTE) && (v->type == SDB_FIELD_VALUE)) {
+ sdb_strbuf_sprintf(errbuf, "Invalid expression %s.value",
+ SDB_FIELD_TO_NAME(context));
+ return -1;
+ }
+ if ((context != SDB_METRIC) && (v->type == SDB_FIELD_TIMESERIES)) {
+ sdb_strbuf_sprintf(errbuf, "Invalid expression %s.timeseries",
+ SDB_FIELD_TO_NAME(context));
+ return -1;
+ }
}
return 0;
} /* analyze_value */
/* self-references are allowed and services and metrics may reference
* their parent host; everything may reference attributes */
- if ((context != t->type) && (context != UNSPEC_CONTEXT)
+ if ((context != t->type) && (context > 0)
&& (((context != SDB_SERVICE) && (context != SDB_METRIC))
|| (t->type != SDB_HOST))
&& (t->type != SDB_ATTRIBUTE)) {