pub trait Dialect: Debug + Any {
Show 17 methods
// Required methods
fn is_identifier_start(&self, ch: char) -> bool;
fn is_identifier_part(&self, ch: char) -> bool;
// Provided methods
fn dialect(&self) -> TypeId { ... }
fn is_delimited_identifier_start(&self, ch: char) -> bool { ... }
fn identifier_quote_style(&self, _identifier: &str) -> Option<char> { ... }
fn is_proper_identifier_inside_quotes(
&self,
_chars: Peekable<Chars<'_>>
) -> bool { ... }
fn supports_filter_during_aggregation(&self) -> bool { ... }
fn supports_within_after_array_aggregation(&self) -> bool { ... }
fn supports_group_by_expr(&self) -> bool { ... }
fn supports_in_empty_list(&self) -> bool { ... }
fn supports_start_transaction_modifier(&self) -> bool { ... }
fn supports_named_fn_args_with_eq_operator(&self) -> bool { ... }
fn convert_type_before_value(&self) -> bool { ... }
fn parse_prefix(
&self,
_parser: &mut Parser<'_>
) -> Option<Result<Expr, ParserError>> { ... }
fn parse_infix(
&self,
_parser: &mut Parser<'_>,
_expr: &Expr,
_precedence: u8
) -> Option<Result<Expr, ParserError>> { ... }
fn get_next_precedence(
&self,
_parser: &Parser<'_>
) -> Option<Result<u8, ParserError>> { ... }
fn parse_statement(
&self,
_parser: &mut Parser<'_>
) -> Option<Result<Statement, ParserError>> { ... }
}
Expand description
Encapsulates the differences between SQL implementations.
§SQL Dialects
SQL implementations deviatiate from one another, either due to custom extensions or various historical reasons. This trait encapsulates the parsing differences between dialects.
GenericDialect
is the most permissive dialect, and parses the union of
all the other dialects, when there is no ambiguity. However, it does not
currently allow CREATE TABLE
statements without types specified for all
columns; use SQLiteDialect
if you require that.
§Examples
Most users create a Dialect
directly, as shown on the module
level documentation:
let dialect = AnsiDialect {};
It is also possible to dynamically create a Dialect
from its
name. For example:
let dialect = dialect_from_str("ansi").unwrap();
// Parsed dialect is an instance of `AnsiDialect`:
assert!(dialect.is::<AnsiDialect>());
Required Methods§
sourcefn is_identifier_start(&self, ch: char) -> bool
fn is_identifier_start(&self, ch: char) -> bool
Determine if a character is a valid start character for an unquoted identifier
sourcefn is_identifier_part(&self, ch: char) -> bool
fn is_identifier_part(&self, ch: char) -> bool
Determine if a character is a valid unquoted identifier character
Provided Methods§
sourcefn dialect(&self) -> TypeId
fn dialect(&self) -> TypeId
Determine the TypeId
of this dialect.
By default, return the same TypeId
as Any::type_id
. Can be overridden
by dialects that behave like other dialects
(for example when wrapping a dialect).
sourcefn is_delimited_identifier_start(&self, ch: char) -> bool
fn is_delimited_identifier_start(&self, ch: char) -> bool
Determine if a character starts a quoted identifier. The default
implementation, accepting “double quoted” ids is both ANSI-compliant
and appropriate for most dialects (with the notable exception of
MySQL, MS SQL, and sqlite). You can accept one of characters listed
in Word::matching_end_quote
here
sourcefn identifier_quote_style(&self, _identifier: &str) -> Option<char>
fn identifier_quote_style(&self, _identifier: &str) -> Option<char>
Return the character used to quote identifiers.
sourcefn is_proper_identifier_inside_quotes(
&self,
_chars: Peekable<Chars<'_>>
) -> bool
fn is_proper_identifier_inside_quotes( &self, _chars: Peekable<Chars<'_>> ) -> bool
Determine if quoted characters are proper for identifier
sourcefn supports_filter_during_aggregation(&self) -> bool
fn supports_filter_during_aggregation(&self) -> bool
Does the dialect support FILTER (WHERE expr)
for aggregate queries?
sourcefn supports_within_after_array_aggregation(&self) -> bool
fn supports_within_after_array_aggregation(&self) -> bool
Returns true if the dialect supports ARRAY_AGG() [WITHIN GROUP (ORDER BY)]
expressions.
Otherwise, the dialect should expect an ORDER BY
without the WITHIN GROUP
clause, e.g. ANSI
sourcefn supports_group_by_expr(&self) -> bool
fn supports_group_by_expr(&self) -> bool
Returns true if the dialects supports group sets, roll up, or cube
expressions.
sourcefn supports_in_empty_list(&self) -> bool
fn supports_in_empty_list(&self) -> bool
Returns true if the dialect supports (NOT) IN ()
expressions
sourcefn supports_start_transaction_modifier(&self) -> bool
fn supports_start_transaction_modifier(&self) -> bool
Returns true if the dialect supports BEGIN {DEFERRED | IMMEDIATE | EXCLUSIVE} [TRANSACTION]
statements
sourcefn supports_named_fn_args_with_eq_operator(&self) -> bool
fn supports_named_fn_args_with_eq_operator(&self) -> bool
Returns true if the dialect supports named arguments of the form FUN(a = ‘1’, b = ‘2’).
sourcefn convert_type_before_value(&self) -> bool
fn convert_type_before_value(&self) -> bool
Returns true if the dialect has a CONVERT function which accepts a type first
and an expression second, e.g. CONVERT(varchar, 1)
sourcefn parse_prefix(
&self,
_parser: &mut Parser<'_>
) -> Option<Result<Expr, ParserError>>
fn parse_prefix( &self, _parser: &mut Parser<'_> ) -> Option<Result<Expr, ParserError>>
Dialect-specific prefix parser override
sourcefn parse_infix(
&self,
_parser: &mut Parser<'_>,
_expr: &Expr,
_precedence: u8
) -> Option<Result<Expr, ParserError>>
fn parse_infix( &self, _parser: &mut Parser<'_>, _expr: &Expr, _precedence: u8 ) -> Option<Result<Expr, ParserError>>
Dialect-specific infix parser override
sourcefn get_next_precedence(
&self,
_parser: &Parser<'_>
) -> Option<Result<u8, ParserError>>
fn get_next_precedence( &self, _parser: &Parser<'_> ) -> Option<Result<u8, ParserError>>
Dialect-specific precedence override
sourcefn parse_statement(
&self,
_parser: &mut Parser<'_>
) -> Option<Result<Statement, ParserError>>
fn parse_statement( &self, _parser: &mut Parser<'_> ) -> Option<Result<Statement, ParserError>>
Dialect-specific statement parser override