use super::{
AccessControlSyntax, AggregateCallSyntax, CallSyntax, CaretOperator, Casing,
ColumnDefinitionSyntax, CommentSyntax, ConstraintSyntax, CreateTableClauseSyntax,
DoubleAmpersand, ExistenceGuards, ExpressionSyntax, FeatureSet, GroupingSyntax,
IdentifierSyntax, IndexAlterSyntax, JoinSyntax, KeywordOperators, KeywordSet,
MaintenanceSyntax, MutationSyntax, NullOrdering, NumericLiteralSyntax, OperatorSyntax,
ParameterSyntax, PipeOperator, PredicateSyntax, QueryTailSyntax, RESERVED_BARE_ALIAS,
RESERVED_COLUMN_NAME, RESERVED_FUNCTION_NAME, RESERVED_TYPE_NAME, STANDARD_BYTE_CLASSES,
STANDARD_IDENTIFIER_QUOTES, SelectSyntax, SessionVariableSyntax, ShowSyntax, StatementDdlGates,
StringFuncForms, StringLiteralSyntax, TableExpressionSyntax, TableFactorSyntax, TargetSpelling,
TransactionSyntax, TypeNameSyntax, UtilitySyntax, ViewSequenceClauseSyntax,
};
use crate::precedence::{STANDARD_BINDING_POWERS, STANDARD_SET_OPERATION_BINDING_POWERS};
impl FeatureSet {
pub const REDSHIFT: Self = Self {
identifier_casing: Casing::Lower,
identifier_quotes: STANDARD_IDENTIFIER_QUOTES,
default_null_ordering: NullOrdering::NullsLast,
reserved_column_name: RESERVED_COLUMN_NAME,
reserved_function_name: RESERVED_FUNCTION_NAME,
reserved_type_name: RESERVED_TYPE_NAME,
reserved_bare_alias: RESERVED_BARE_ALIAS,
reserved_as_label: KeywordSet::EMPTY,
catalog_qualified_names: true,
byte_classes: STANDARD_BYTE_CLASSES,
binding_powers: STANDARD_BINDING_POWERS,
set_operation_powers: STANDARD_SET_OPERATION_BINDING_POWERS,
string_literals: StringLiteralSyntax::ANSI,
numeric_literals: NumericLiteralSyntax::ANSI,
parameters: ParameterSyntax::ANSI,
session_variables: SessionVariableSyntax::ANSI,
identifier_syntax: IdentifierSyntax::ANSI,
table_expressions: TableExpressionSyntax {
table_json_path: true,
only: false,
table_sample: false,
parenthesized_joins: true,
table_alias_column_lists: true,
join_using_alias: false,
index_hints: false,
table_hints: false,
partition_selection: false,
base_table_alias_column_lists: true,
string_literal_aliases: false,
aliased_parenthesized_join: true,
bare_table_alias_is_bare_label: false,
table_version: false,
indexed_by: false,
prefix_colon_alias: false,
},
join_syntax: JoinSyntax::ANSI,
table_factor_syntax: TableFactorSyntax::ANSI,
expression_syntax: ExpressionSyntax::ANSI,
operator_syntax: OperatorSyntax::ANSI,
call_syntax: CallSyntax::ANSI,
string_func_forms: StringFuncForms::ANSI,
aggregate_call_syntax: AggregateCallSyntax::ANSI,
predicate_syntax: PredicateSyntax::ANSI,
pipe_operator: PipeOperator::StringConcat,
double_ampersand: DoubleAmpersand::Unsupported,
keyword_operators: KeywordOperators::Unsupported,
caret_operator: CaretOperator::Unsupported,
hash_bitwise_xor: false,
comment_syntax: CommentSyntax::ANSI,
mutation_syntax: MutationSyntax::ANSI,
statement_ddl_gates: StatementDdlGates::ANSI,
view_sequence_clause_syntax: ViewSequenceClauseSyntax::ANSI,
create_table_clause_syntax: CreateTableClauseSyntax::ANSI,
column_definition_syntax: ColumnDefinitionSyntax::ANSI,
constraint_syntax: ConstraintSyntax::ANSI,
index_alter_syntax: IndexAlterSyntax::ANSI,
existence_guards: ExistenceGuards::ANSI,
select_syntax: SelectSyntax::ANSI,
query_tail_syntax: QueryTailSyntax::ANSI,
grouping_syntax: GroupingSyntax::ANSI,
utility_syntax: UtilitySyntax::ANSI,
transaction_syntax: TransactionSyntax::ANSI,
show_syntax: ShowSyntax::ANSI,
maintenance_syntax: MaintenanceSyntax::ANSI,
access_control_syntax: AccessControlSyntax::ANSI,
type_name_syntax: TypeNameSyntax::ANSI,
target_spelling: TargetSpelling::Ansi,
};
}
pub const REDSHIFT: FeatureSet = FeatureSet::REDSHIFT;
const _: () = assert!(FeatureSet::REDSHIFT.is_lexically_consistent());
const _: () = assert!(FeatureSet::REDSHIFT.has_satisfied_feature_dependencies());
const _: () = assert!(FeatureSet::REDSHIFT.has_no_grammar_conflict());
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn redshift_is_ansi_plus_only_the_lowercase_fold() {
let ansi = FeatureSet::ANSI;
let redshift = FeatureSet::REDSHIFT;
assert_eq!(redshift.identifier_casing, Casing::Lower);
assert!(redshift.table_expressions.table_json_path);
assert!(!redshift.predicate_syntax.ilike);
assert!(!redshift.predicate_syntax.similar_to);
assert!(!redshift.select_syntax.distinct_on);
assert!(!redshift.select_syntax.qualify);
crate::dialect::closed_delta::assert_closed_delta(
&ansi,
&redshift,
&["identifier_casing", "table_expressions"],
);
}
#[test]
fn redshift_recovers_ansi_when_the_fold_is_forced_back() {
let ansi = FeatureSet::ANSI;
let redshift = FeatureSet::REDSHIFT;
assert_eq!(
FeatureSet {
identifier_casing: Casing::Upper,
table_expressions: TableExpressionSyntax {
table_json_path: false,
..redshift.table_expressions
},
..redshift
},
ansi,
);
}
#[test]
fn redshift_is_lexically_consistent_and_dependency_clean() {
let redshift = FeatureSet::REDSHIFT;
assert_eq!(redshift.lexical_conflict(), None);
assert!(redshift.is_lexically_consistent());
assert_eq!(redshift.feature_dependencies(), None);
assert!(redshift.has_satisfied_feature_dependencies());
assert_eq!(redshift.grammar_conflict(), None);
assert!(redshift.has_no_grammar_conflict());
}
}