Add support for fetching arbitrary objects, including attributes. That is, the backend now supports this. The functionality is not yet exposed via SysQL.
Allow and implement iterating arbitrary (non-constant) array values. That is, iterators may now work with arithmetic expressions that evaluate to an array.
analyzer: Support more flexible iterator expressions. In particular, more complex typed expressions may now include an iterator on a lower level, like `LOOKUP services MATCHING ANY host.backend =~ 'foo'`. This is done by adding more information to the analyzer context and pushing it down to child nodes in the AST if necessary. As a nice side-effect, the iterator analyzer does not longer have to know about the specific type of its child node.
analyzer: Fixed some error messages.
parser: Require a context for each parser operation. That is, let the caller provide the execution context (object type) when parsing incomplete commands (conditionals / arithmetic expressions). This removes the need to call the analyzer again and avoids some special code in the analyzer.
data: Use a predefined format for sdb_strftime(). Also, print the nanosecond fraction of a second.
parser: Add support for metric timeseries fields.
parser: Skip context-specific checks if the context is unspecified. Else, the analyzer may reject valid queries. It's up to the caller to run the analyzer using the right context once it's known.
parser: Add support for <expr> IS [NOT] TRUE / FALSE queries.
frontend, parser: Allow typed access to host objects from any context. That is, even from the "generic" or "filter" contexts.
parser/analyzer: Fixed iterator type checks. Also, added some more test-cases covering affected cases.
parser/analyzer: Migrate value expression checks. The new parser and analyzer now pass the full test-suite of frontend/parser.
parser/analyzer: Migrate type and iterator checks.
parser: Add support for analyzing conditional and arithmetic expressions. Let all parser functions call the respective analyzer. For now, this is only used to propagate data-type information but it will later ensure a certain amount of semantical correctness. Note that the new analyzers usually don't have any context information, so they might accept expressions that are not right for their later target use case. If that matters, the caller will have to check again providing the right context.
parser: Convert AST op types to data op types when necessary.
parser: Determine the data-type of each node. For now, we only use this for arithmetic expressions. The field will be populated by the analyzer.
Migrate top-level checks to the new parser/analyzer. Call the analyzer from sdb_parser_parse().