use super::{
AccessControlSyntax, AggregateCallSyntax, CallSyntax, CaretOperator, Casing,
ColumnDefinitionSyntax, CommentSyntax, ConstraintSyntax, CreateTableClauseSyntax,
DoubleAmpersand, ExistenceGuards, ExpressionSyntax, FeatureSet, GroupingSyntax,
IdentifierQuote, IdentifierSyntax, IndexAlterSyntax, JoinSyntax, Keyword, 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, SelectSyntax, SessionVariableSyntax, ShowSyntax, StatementDdlGates,
StringFuncForms, StringLiteralSyntax, TableExpressionSyntax, TableFactorSyntax, TargetSpelling,
TransactionSyntax, TypeNameSyntax, UtilitySyntax, ViewSequenceClauseSyntax,
};
use crate::precedence::{STANDARD_BINDING_POWERS, STANDARD_SET_OPERATION_BINDING_POWERS};
pub const DATABRICKS_IDENTIFIER_QUOTES: &[IdentifierQuote] = &[
IdentifierQuote::Symmetric('"'),
IdentifierQuote::Symmetric('`'),
];
pub const DATABRICKS_QUALIFY_RESERVATION: KeywordSet =
KeywordSet::from_keywords(&[Keyword::Qualify]);
pub const DATABRICKS_RESERVED_COLUMN_NAME: KeywordSet =
RESERVED_COLUMN_NAME.union(DATABRICKS_QUALIFY_RESERVATION);
pub const DATABRICKS_RESERVED_FUNCTION_NAME: KeywordSet =
RESERVED_FUNCTION_NAME.union(DATABRICKS_QUALIFY_RESERVATION);
pub const DATABRICKS_RESERVED_TYPE_NAME: KeywordSet =
RESERVED_TYPE_NAME.union(DATABRICKS_QUALIFY_RESERVATION);
pub const DATABRICKS_RESERVED_BARE_ALIAS: KeywordSet =
RESERVED_BARE_ALIAS.union(DATABRICKS_QUALIFY_RESERVATION);
impl SelectSyntax {
pub const DATABRICKS: Self = Self {
qualify: true,
lateral_view_clause: true,
distinct_on: false,
select_into: false,
empty_target_list: false,
alias_string_literals: false,
bare_alias_string_literals: false,
union_by_name: false,
wildcard_modifiers: false,
wildcard_replace: false,
intersect_all: true,
except_all: true,
qualified_wildcard_alias: false,
from_first: false,
explicit_table: true,
parenthesized_query_operands: true,
values_rows_require_equal_arity: false,
values_row_constructor: true,
as_alias_rejects_reserved: false,
trailing_comma: false,
prefix_colon_alias: false,
connect_by_clause: false,
};
}
impl QueryTailSyntax {
pub const DATABRICKS: Self = Self {
fetch_first: true,
limit_offset_comma: false,
locking_clauses: false,
key_lock_strengths: false,
stacked_locking_clauses: false,
using_sample: false,
leading_offset: true,
limit_expressions: true,
limit_percent: false,
with_ties_requires_order_by: false,
pipe_syntax: false,
limit_by_clause: false,
settings_clause: false,
format_clause: false,
for_xml_json_clause: false,
};
}
impl GroupingSyntax {
pub const DATABRICKS: Self = Self {
group_by_all: true,
group_by_set_quantifier: false,
order_by_all: true,
grouping_sets: true,
with_rollup: false,
order_by_using: false,
};
}
impl ExpressionSyntax {
pub const DATABRICKS: Self = Self {
semi_structured_access: true,
typecast_operator: false,
subscript: false,
slice_step: false,
collate: false,
at_time_zone: false,
array_constructor: false,
multidim_array_literals: false,
collection_literals: false,
row_constructor: false,
struct_constructor: false,
field_selection: false,
field_wildcard: false,
typed_string_literals: true,
typed_interval_literal: true,
relaxed_interval_syntax: false,
mysql_interval_operator: false,
positional_column: false,
lambda_keyword: false,
};
}
impl TableExpressionSyntax {
pub const DATABRICKS: Self = Self {
table_version: 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_json_path: false,
indexed_by: false,
prefix_colon_alias: false,
};
}
impl JoinSyntax {
pub const DATABRICKS: Self = Self {
sided_semi_anti_join: true,
stacked_join_qualifiers: true,
full_outer_join: true,
natural_cross_join: false,
straight_join: false,
asof_join: false,
positional_join: false,
semi_anti_join: false,
apply_join: false,
recursive_search_cycle: false,
recursive_union_rejects_order_limit: false,
recursive_using_key: false,
};
}
impl TableFactorSyntax {
pub const DATABRICKS: Self = Self {
lateral: false,
table_functions: false,
rows_from: false,
unnest: false,
unnest_with_offset: false,
table_function_ordinality: false,
special_function_table_source: true,
pivot: false,
unpivot: false,
show_ref: false,
from_values: false,
json_table: false,
xml_table: false,
table_expr_factor: false,
pivot_value_sources: false,
match_recognize: false,
open_json: false,
};
}
impl UtilitySyntax {
pub const DATABRICKS: Self = Self {
copy: false,
copy_into: false,
stage_references: false,
comment_on: false,
comment_if_exists: false,
pragma: false,
attach: false,
kill: false,
handler_statements: false,
plugin_component_statements: false,
shutdown: false,
restart: false,
clone: false,
import_table: false,
help_statement: false,
binlog: false,
key_cache_statements: false,
use_statement: false,
use_qualified_name: false,
use_string_literal_name: false,
prepared_statements: false,
prepare_typed_parameters: false,
prepared_statements_from: false,
call: false,
call_bare_name: false,
load_extension: false,
load_bare_name: false,
load_data: false,
reset_scope: false,
detach_if_exists: false,
do_statement: false,
do_expression_list: false,
lock_tables: false,
lock_instance: false,
rename_statement: false,
signal_diagnostics: false,
export_import_database: false,
update_extensions: false,
flush: false,
purge_binary_logs: false,
replication_statements: false,
};
}
impl TransactionSyntax {
pub const DATABRICKS: Self = Self {
start_transaction: true,
start_transaction_block_optional: false,
transaction_work_keyword: true,
begin_transaction_keyword: true,
commit_transaction_keyword: true,
rollback_transaction_keyword: true,
transaction_name: false,
begin_transaction_modes: true,
transaction_savepoints: true,
set_transaction: true,
transaction_isolation_mode: true,
transaction_access_mode: true,
transaction_deferrable_mode: true,
start_transaction_isolation_mode: true,
start_transaction_deferrable_mode: true,
start_transaction_consistent_snapshot: false,
transaction_multiple_modes: true,
transaction_modes_require_commas: false,
transaction_modes_reject_duplicates: false,
abort_transaction_alias: false,
end_transaction_alias: false,
transaction_release: false,
transaction_chain: true,
release_savepoint_keyword_optional: true,
begin_transaction_mode: false,
xa_transactions: false,
};
}
impl ShowSyntax {
pub const DATABRICKS: Self = Self {
show_functions: true,
describe: false,
describe_summarize: false,
session_statements: true,
set_value_reserved_words: super::RESERVED_SET_VALUE_WORDS,
set_value_on_keyword: true,
set_value_null_keyword: false,
show_tables: false,
show_columns: false,
show_create_table: false,
show_routine_status: false,
show_verbose: false,
show_admin: false,
};
}
impl MaintenanceSyntax {
pub const DATABRICKS: Self = Self {
vacuum: false,
vacuum_analyze: false,
reindex: false,
analyze: false,
analyze_columns: false,
checkpoint: false,
checkpoint_database: false,
table_maintenance: false,
};
}
impl AccessControlSyntax {
pub const DATABRICKS: Self = Self {
alter_role_rename: false,
access_control: true,
access_control_extended_objects: true,
user_role_management: false,
access_control_account_grants: false,
};
}
impl FeatureSet {
pub const DATABRICKS: Self = Self {
identifier_casing: Casing::Preserve,
identifier_quotes: DATABRICKS_IDENTIFIER_QUOTES,
default_null_ordering: NullOrdering::NullsLast,
reserved_column_name: DATABRICKS_RESERVED_COLUMN_NAME,
reserved_function_name: DATABRICKS_RESERVED_FUNCTION_NAME,
reserved_type_name: DATABRICKS_RESERVED_TYPE_NAME,
reserved_bare_alias: DATABRICKS_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::DATABRICKS,
join_syntax: JoinSyntax::DATABRICKS,
table_factor_syntax: TableFactorSyntax::DATABRICKS,
expression_syntax: ExpressionSyntax::DATABRICKS,
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::DATABRICKS,
query_tail_syntax: QueryTailSyntax::DATABRICKS,
grouping_syntax: GroupingSyntax::DATABRICKS,
utility_syntax: UtilitySyntax::DATABRICKS,
transaction_syntax: TransactionSyntax::DATABRICKS,
show_syntax: ShowSyntax::DATABRICKS,
maintenance_syntax: MaintenanceSyntax::DATABRICKS,
access_control_syntax: AccessControlSyntax::DATABRICKS,
type_name_syntax: TypeNameSyntax::ANSI,
target_spelling: TargetSpelling::Ansi,
};
}
pub const DATABRICKS: FeatureSet = FeatureSet::DATABRICKS;
const _: () = assert!(FeatureSet::DATABRICKS.is_lexically_consistent());
const _: () = assert!(FeatureSet::DATABRICKS.has_satisfied_feature_dependencies());
const _: () = assert!(FeatureSet::DATABRICKS.has_no_grammar_conflict());
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn databricks_is_ansi_plus_the_six_gates_and_two_lexical_facts() {
let ansi = FeatureSet::ANSI;
let dbx = FeatureSet::DATABRICKS;
assert_eq!(dbx.identifier_casing, Casing::Preserve);
assert_ne!(dbx.identifier_casing, ansi.identifier_casing);
assert_eq!(dbx.identifier_quotes, DATABRICKS_IDENTIFIER_QUOTES);
assert_ne!(dbx.identifier_quotes, ansi.identifier_quotes);
assert!(!dbx.string_literals.double_quoted_strings);
assert!(!dbx.parameters.named_colon);
assert_eq!(dbx.select_syntax, SelectSyntax::DATABRICKS);
assert_ne!(dbx.select_syntax, ansi.select_syntax);
assert_eq!(dbx.expression_syntax, ExpressionSyntax::DATABRICKS);
assert_ne!(dbx.expression_syntax, ansi.expression_syntax);
assert_eq!(dbx.table_expressions, TableExpressionSyntax::DATABRICKS);
assert_eq!(dbx.join_syntax, JoinSyntax::DATABRICKS);
assert_ne!(dbx.join_syntax, ansi.join_syntax);
assert_eq!(dbx.utility_syntax, UtilitySyntax::DATABRICKS);
assert_eq!(dbx.show_syntax, ShowSyntax::DATABRICKS);
assert_ne!(dbx.show_syntax, ansi.show_syntax);
assert!(dbx.show_syntax.show_functions);
assert_eq!(
ShowSyntax {
show_functions: false,
..dbx.show_syntax
},
ansi.show_syntax,
);
assert_eq!(dbx.reserved_column_name, DATABRICKS_RESERVED_COLUMN_NAME);
assert_ne!(dbx.reserved_column_name, ansi.reserved_column_name);
assert_eq!(
dbx.reserved_function_name,
DATABRICKS_RESERVED_FUNCTION_NAME
);
assert_eq!(dbx.reserved_type_name, DATABRICKS_RESERVED_TYPE_NAME);
assert_eq!(dbx.reserved_bare_alias, DATABRICKS_RESERVED_BARE_ALIAS);
assert_eq!(
dbx.reserved_column_name
.difference(DATABRICKS_QUALIFY_RESERVATION),
ansi.reserved_column_name,
);
assert!(dbx.reserved_column_name.contains(Keyword::Qualify));
assert!(dbx.reserved_bare_alias.contains(Keyword::Qualify));
assert_eq!(dbx.reserved_as_label, KeywordSet::EMPTY);
assert_eq!(dbx.string_literals, ansi.string_literals);
assert_eq!(dbx.numeric_literals, ansi.numeric_literals);
assert_eq!(dbx.parameters, ansi.parameters);
assert_eq!(dbx.session_variables, ansi.session_variables);
assert_eq!(dbx.identifier_syntax, ansi.identifier_syntax);
assert_eq!(dbx.operator_syntax, ansi.operator_syntax);
assert_eq!(dbx.call_syntax, ansi.call_syntax);
assert_eq!(dbx.predicate_syntax, ansi.predicate_syntax);
assert_eq!(dbx.mutation_syntax, ansi.mutation_syntax);
assert_eq!(dbx.statement_ddl_gates, ansi.statement_ddl_gates);
assert_eq!(
dbx.create_table_clause_syntax,
ansi.create_table_clause_syntax
);
assert_eq!(dbx.column_definition_syntax, ansi.column_definition_syntax);
assert_eq!(dbx.constraint_syntax, ansi.constraint_syntax);
assert_eq!(dbx.index_alter_syntax, ansi.index_alter_syntax);
assert_eq!(dbx.existence_guards, ansi.existence_guards);
assert_eq!(dbx.type_name_syntax, ansi.type_name_syntax);
assert_eq!(dbx.byte_classes, ansi.byte_classes);
assert_eq!(dbx.binding_powers, ansi.binding_powers);
assert_eq!(dbx.target_spelling, ansi.target_spelling);
assert_eq!(dbx.default_null_ordering, ansi.default_null_ordering);
}
#[test]
fn databricks_enables_exactly_the_six_staged_gates() {
let ansi = FeatureSet::ANSI;
let dbx = FeatureSet::DATABRICKS;
assert!(dbx.join_syntax.sided_semi_anti_join);
assert!(!ansi.join_syntax.sided_semi_anti_join);
assert!(!dbx.join_syntax.semi_anti_join);
assert!(dbx.expression_syntax.semi_structured_access);
assert!(!ansi.expression_syntax.semi_structured_access);
assert!(dbx.select_syntax.qualify && !ansi.select_syntax.qualify);
assert!(dbx.grouping_syntax.group_by_all && !ansi.grouping_syntax.group_by_all);
assert!(dbx.grouping_syntax.order_by_all && !ansi.grouping_syntax.order_by_all);
assert!(dbx.select_syntax.lateral_view_clause && !ansi.select_syntax.lateral_view_clause);
assert!(!dbx.table_factor_syntax.lateral);
assert_eq!(
SelectSyntax {
qualify: false,
lateral_view_clause: false,
..dbx.select_syntax
},
ansi.select_syntax,
);
assert_eq!(
GroupingSyntax {
group_by_all: false,
order_by_all: false,
..dbx.grouping_syntax
},
ansi.grouping_syntax,
);
assert_eq!(
ExpressionSyntax {
semi_structured_access: false,
..dbx.expression_syntax
},
ansi.expression_syntax,
);
assert_eq!(
JoinSyntax {
sided_semi_anti_join: false,
..dbx.join_syntax
},
ansi.join_syntax,
);
}
#[test]
fn databricks_is_lexically_consistent_and_dependency_clean() {
let dbx = FeatureSet::DATABRICKS;
assert_eq!(dbx.lexical_conflict(), None);
assert!(dbx.is_lexically_consistent());
assert_eq!(dbx.feature_dependencies(), None);
assert!(dbx.has_satisfied_feature_dependencies());
assert_eq!(dbx.grammar_conflict(), None);
assert!(dbx.has_no_grammar_conflict());
}
#[test]
fn databricks_closed_delta_axes_match_documented_set() {
crate::dialect::closed_delta::assert_closed_delta(
&FeatureSet::ANSI,
&FeatureSet::DATABRICKS,
&[
"identifier_casing",
"identifier_quotes",
"reserved_column_name",
"reserved_function_name",
"reserved_type_name",
"reserved_bare_alias",
"table_expressions",
"join_syntax",
"expression_syntax",
"select_syntax",
"grouping_syntax",
"show_syntax",
],
);
}
}