* 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.