* feat: Add timestamp data type
* feat: Add with_quiet API to suppress output to STDOUT
* fix: Field name resolution to match InfluxQL
* refactor: Allow TestChunks to be directly accessed
This will be useful when testing the InfluxQL planner.
* fix: Add Timestamp case to var_ref module
* feat: Add InfluxQL compatible column naming
* chore: Add doc comment.
* fix: keywords may be followed by a `!` such as `!=`
* fix: field_name improvements
* No longer clones expressions
* Explicitly handle all Expr enumerated items
* more tests
* fix: collision with explicitly aliased column
Fixes case where column is explicitly aliased to an auto-named variant.
Test case added to validate.
* chore: Move logic to context, in line with DataFusion SQL
* chore: Add ordering for InfluxQL data types
Ordering is used to determine automatic casting operations. If two
field columns are present in an expression, one float and one integer,
the integer should be cast to a float, such that the final expression
will be a float.
* chore: Add DerefMut trait to collection types
Will allow these collections to be mutated when traversing the InfluxQL
AST.
* chore: Add influxql module with initial AST normalisation implementation
* chore: Add more unit tests and docs
* chore: Run cargo hakari tasks
* chore: Fix link
* chore: Support regular expression expansion and Call expressions
* chore: Add tests for walk_expr functions
* chore: Add insta snapshot files
* chore: Add docs and make API accessible to the crate
* chore: Move to Arc<dyn SchemaProvider> for use in influxql planner
* chore: Move code back; it is better encapsulated here
* chore: Remove redundant attribute
* chore: Improve regex compatibility with InfluxQL / Go
* chore: Style improvement.
Co-authored-by: CircleCI[bot] <circleci@influxdata.com>
* fix: `identifier` parser consumes preceding whitespace
* chore: Update module docs
* feat: Add function to identify when an identifier requires quotes
* feat: Add ability to deref OneOrMore to its vector representation
This feature was used as part the InfluxQL logical planner in IOx
* chore: Feedback, prefer slice `[T]` rather than `Vec<T>`
* feat: Added single and inline comment combinators
* chore: Add tests for ws0 function
* feat: Add ws1 combinator
* feat: Use ws0 and ws1 combinators to properly handle comments
* fix: Parse regular expressions starting with possible escape sequence
This was failing because the previous combinator, `is_not`, would return
an error if it consumed no input when identifying one of the characters
in its set. This case would then prevent the remainder of the
`regex_literal` parser from identifying and ignoring sequences like "\w"
* fix: Parse microsecond duration literals with correct unit suffix
* fix: Parse a var ref as a 3-part, segmented identifier
Closes#6033
* chore: Address lint warnings
* chore: Additional test cases per feedback
* chore: Keep types in their respective modules
Also adds required documentation now that the individual modules are
public.
* chore: Fix incomplete docs
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* feat: Reimplement keywords as BTreeSet for more efficient lookup
Added a `Token` type to perform case-insensitive comparisons to avoid
allocations when performing lookups in the set.
Also introduced new `keyword` combinator to replace use of
`tag_no_case`. This is necessary to prevent eagerly recognising tags
without the appropriate separator. For example, `tag_no_case("OR")`
will recognise `ORDER` in a conditional expression.
The new combinator a `keyword` follows the pattern:
```
keyword ::= (a..z | A..Z)* keyword_separator
keyword_separator ::= ' ' | '(' | ')' | ';' | ',' | '=' |
'\n' | '\t'
```
* fix: Allow quoted time; using more efficient case-insensitive comparison
* fix: Digits to right of decimal point are optional
* fix: More idiomatic use of zip
* fix: Use `keyword` combinator and adjust whitespace handling
* fix: <> is a valid alias for the != operator
* fix: Special handling of DISTINCT identifier for function call name
* chore: Add tests
* chore: Feedback to remove unnecessary comments
* chore: Switch from BTreeSet to HashSet – thanks @domodwyer!
* feat: Partition implementation of Visitable for InfluxQL AST
* feat: Added consistent structures for each clause to simplify visitor
Continued to expand `accept` and `pre` / `post` visit implementations.
* feat: Added insta and tests using snapshots (thanks @crepererum)
The insta crate simplifies the process of validating the combination of
visitor and accept implementations are called and in the correct order.
* chore: Run cargo hakari tasks
* feat: Added remaining snapshot tests
Some tests are failing as some minor type changes must be added along
with the addition of related visitor functions.
* feat: Add types to represent each clause in numerous statements
These clauses permit distinct visit functions on the `Visitor` type.
* chore: Reformat `SELECT`
* chore: Explicitly specify access to export selected types only
This required completing all the missing documentation for the exported
types.
* chore: Update Cargo.lock
* chore: macro to implement common traits and hide 0th tuple element
Co-authored-by: CircleCI[bot] <circleci@influxdata.com>
* feat: Identifier → VarRef, which represents a tag or field reference
InfluxQL calls these variables, so the Rust parser will follow
precedent.
* chore: Add docs
* chore: Separate arithmetic and conditional expression parsing
This is necessary to ensure conditional expressions are only supported
in a `WHERE` clause and arithmetic expressions in `SELECT` field
projection list
* feat: Add a `verify` API to transform combinator functions to errors
This is useful to preform additional validation on a valid result.
* feat: Add customisation for operand parsing to arithmetic expressions
This permits narrowing of valid function calls in `WHERE` clauses
and to customise valid operands in a `SELECT` projection, such as a
wildcard (`*`)
* chore: move logic to appropriate modules.
* feat: Add wildcard discriminator to Expr enum required for `SELECT`
* chore: Remove dead_code attribute
* feat: Add `DISTINCT` operator
* chore: Add `distinct` macro; simplify existing macros
* chore: add assert_matches; parse Field and Field list; refactor literal
* feat: Add a new type to parse a separated_list1 into a specialised type
* chore: Refactor types using `separated_list1`
* chore: Ensure items in a list can be preceded by a space
* chore: Refactor IN clause to use OneOrMore
* feat: Parse `GROUP BY` clause
* chore: appease clippy
* chore: refactor number parsing to share code; add signed Number type
* feat: completed `SELECT` statement parser.
* chore: Consistent error messages when expecting tokens
* chore: Add recommended derive implementations
* feat: Add `SELECT` statement to `statement` combinator
* chore: Refactor OneOrMore::separated_list1 to a single error message
* chore: More tests and cleanup 🧹
* chore: More tests
* chore: Appease broken doc links checker
* chore: remove remaining `dead_code` attributes 🥳
* chore: Address PR feedback
* https://github.com/influxdata/influxdb_iox/pull/5692#discussion_r982559420
* https://github.com/influxdata/influxdb_iox/pull/5692#discussion_r982527476
* chore: Address PR feedback
* https://github.com/influxdata/influxdb_iox/pull/5692#discussion_r982626857
* https://github.com/influxdata/influxdb_iox/pull/5692#discussion_r982569760
* chore: Address PR feedback for Display implementations
Also removed duplicate test case
* chore: Refactor `FROM` clause parser to be generic
This will allow us to use it for `DELETE` statements, which has
a more restrictive requirement, only allowing regular expressions
or single part identifiers.
* feat: Add `DELETE` series statement
* chore: Add test case for insignificant whitespace between operators
NOTE: Added a skipped test until #5663 is implemented
* feat: Add `DROP MEASUREMENT` statement
* chore: Add DropMeasurementStatement struct
* chore: `Statement` enum contains only `Box`ed types
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
* feat: Add `SHOW DATABASES`
* feat: Add `SHOW RETENTION POLICIES`
* chore: Drive by clean up, use consistent names for functions
* feat: Parse `SHOW TAG KEYS` statement
* chore: drive-by: Ensure parsing succeeds when whitespace omitted
* feat: `SHOW TAG VALUES` statement
* feat: `SHOW FIELD KEYS` statement
* chore: Finish docs
* chore: Add additional docs to `FromMeasurementClause`
NOTE: technically, the EBNF does not match the current implementation,
but will be addressed in #5662
* chore: Remove variants from Identifier and BindParameter types
This simplifies usage of these types. Display traits have been updated
to properly quote and escape the output, when necessary.
* chore: Fix docs
* chore: Drive by to improve tests and coverage
* chore: Make Error generic, so we can change it
* chore: change visibility
pub(crate) is superfluous, as we are yet to specify
which APIs are public outside the crate in lib.rs
* chore: Introduce crate IResult type
In preparation of adding custom error type
* feat: Initial implementation of custom error type
* chore: Add module docs
* chore: Rename IResult → ParseResult; syntax and expect errors
* chore: ParserResult and error refactoring
* chore: Drive by simplification
* feat: Add custom errors to string parsing
* feat: Added public API to parse a set of statements
* chore: Errors are dyn Display to convey their intent
Errors from the parser are only displayable messages.
* chore: Separate SHOW for improved error handling
By moving SHOW to a separate parser, we can display clearer error
messages when consuming SHOW followed by an unexpected token.
* chore: Docs and cleanup
* chore: Add tests and a specific `ParseError` type
The fields are intentionally not public yet, as we would like clients
of the package to display the message only.
* chore: PR feedback to improve the `ORDER BY` error message
* feat: Add measurement expression and statement terminator combinators
* feat: Begin parsing SHOW MEASUREMENTS statements
* chore: Placate clippy
* feat: parse LIMIT clause
* feat: parse OFFSET clause
* chore: Clippy
* chore: Fix doc comments
* feat: Parse ORDER BY clause
* feat: Parse WHERE clause
* feat: Add Call expression
* chore: Clippy
* feat: parse WITH MEASUREMENT regex; WHERE clause
* chore: Test to validate regex not-equal operator is not supported
* chore: No need to be public
* chore: Remove invalid comment
* chore: PR Feedback – use `tag_no_case`
Also added `cut` to force Err::Failure state, as `ORDER BY` must be
followed by one of the specified rules.
* feat: Parse various InfluxQL literals
* feat: Parse regex, refactor single and double quoted string parsing
* chore: Literals do not include sign; those are unary expressions
* chore: Add docs
* chore: Integer literals are unsigned
Add more tests for max values
* chore: Impl Display for Literal; add macro to write escaped strings
Also added Duration type for InfluxQL durations, so they can be properly
formatted when displayed.
The macro uses match to efficiently map a small number of characters
to their escaped equivalent. It also removes a bit of boilerplate.
* chore: Don't tie lifetime of AST elements to source `str`
* feat: Impl From trait for Literal, Regex and Duration
* chore: Derive Copy for Duration
* chore: PR Feedback, use unwrap_err for better output when API fails
* chore: Drive-by cleanup using unwrap_err
* feat: Parse InfluxQL identifiers
Closes#5424
* chore: Add common derive implementations
* feat: Implement fmt::Display trait for Identifier
* feat: Display implementation, nouns for combinator functions
* chore: Update docs
* chore: Double quoted are identifiers, single quoted are literals
Single quoted strings will be parsed in a separate module.