diff --git a/src/parser/analyzer.c b/src/parser/analyzer.c
index f352a0d630cf2ae5d7e69534658e4493724a1e3e..2cb28161c2551f392811e1c82eb6af7e1a892e40 100644 (file)
--- a/src/parser/analyzer.c
+++ b/src/parser/analyzer.c
#define VALID_OBJ_TYPE(t) ((SDB_HOST <= (t)) && ((t) <= SDB_METRIC))
#define FILTER_CONTEXT -1
-#define UNSPEC_CONTEXT -2
static int
analyze_node(int context, sdb_ast_node_t *node, sdb_strbuf_t *errbuf);
/* attributes are always iterable */
}
else if ((context != SDB_HOST) && (context != SDB_SERVICE)
- && (context != SDB_METRIC) && (context != UNSPEC_CONTEXT)) {
+ && (context != SDB_METRIC)) {
iter_error(errbuf, iter, "%s not iterable in %s context",
SDB_STORE_TYPE_TO_NAME(iter_type),
SDB_STORE_TYPE_TO_NAME(context));
if ((context != SDB_ATTRIBUTE) && (v->type == SDB_FIELD_VALUE)) {
sdb_strbuf_sprintf(errbuf, "Invalid expression %s.value",
- SDB_FIELD_TO_NAME(v->type));
+ 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_timeseries(sdb_ast_timeseries_t *ts, sdb_strbuf_t *errbuf)
{
if (! ts->hostname) {
- sdb_strbuf_sprintf(errbuf, "Missing hostname in STORE command");
+ sdb_strbuf_sprintf(errbuf, "Missing hostname in TIMESERIES command");
return -1;
}
if (! ts->metric) {
- sdb_strbuf_sprintf(errbuf, "Missing metric name in STORE command");
+ sdb_strbuf_sprintf(errbuf, "Missing metric name in TIMESERIES command");
return -1;
}
if (ts->end <= ts->start) {
char start_str[64], end_str[64];
- sdb_strftime(start_str, sizeof(start_str), "%F %T Tz", ts->start);
- sdb_strftime(end_str, sizeof(end_str), "%F %T Tz", ts->end);
+ sdb_strftime(start_str, sizeof(start_str), ts->start);
+ sdb_strftime(end_str, sizeof(end_str), ts->end);
sdb_strbuf_sprintf(errbuf, "Start time (%s) greater than "
- "end time (%s) in STORE command", start_str, end_str);
+ "end time (%s) in TIMESERIES command", start_str, end_str);
return -1;
}
return 0;
} /* sdb_parser_analyze */
int
-sdb_parser_analyze_conditional(sdb_ast_node_t *node, sdb_strbuf_t *errbuf)
+sdb_parser_analyze_conditional(int context,
+ sdb_ast_node_t *node, sdb_strbuf_t *errbuf)
{
+ if (! VALID_OBJ_TYPE(context)) {
+ sdb_strbuf_sprintf(errbuf, "Invalid object type %#x", context);
+ return -1;
+ }
if (! node) {
sdb_strbuf_sprintf(errbuf, "Empty conditional node");
return -1;
SDB_AST_TYPE_TO_STRING(node));
return -1;
}
- return analyze_node(UNSPEC_CONTEXT, node, errbuf);
+ return analyze_node(context, node, errbuf);
} /* sdb_parser_analyze_conditional */
int
-sdb_parser_analyze_arith(sdb_ast_node_t *node, sdb_strbuf_t *errbuf)
+sdb_parser_analyze_arith(int context,
+ sdb_ast_node_t *node, sdb_strbuf_t *errbuf)
{
+ if (! VALID_OBJ_TYPE(context)) {
+ sdb_strbuf_sprintf(errbuf, "Invalid object type %#x", context);
+ return -1;
+ }
if (! node) {
sdb_strbuf_sprintf(errbuf, "Empty arithmetic node");
return -1;
SDB_AST_TYPE_TO_STRING(node));
return -1;
}
- return analyze_node(UNSPEC_CONTEXT, node, errbuf);
+ return analyze_node(context, node, errbuf);
} /* sdb_parser_analyze_arith */
/* vim: set tw=78 sw=4 ts=4 noexpandtab : */