blob: d60fa1e11d4abd84d89dca105f5f0a4901c55883 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//! Tests for the `derive_dialect!` macro.
use sqlparser::derive_dialect;
use sqlparser::dialect::{Dialect, GenericDialect, MySqlDialect, PostgreSqlDialect};
use sqlparser::parser::Parser;
#[test]
fn test_method_overrides() {
derive_dialect!(EnhancedGenericDialect, GenericDialect, overrides = {
supports_order_by_all = true,
supports_triple_quoted_string = true,
});
let dialect = EnhancedGenericDialect::new();
// Overridden methods
assert!(dialect.supports_order_by_all());
assert!(dialect.supports_triple_quoted_string());
// Non-overridden retains base behavior
assert!(!dialect.supports_factorial_operator());
// Parsing works with the overrides
let result = Parser::new(&dialect)
.try_with_sql("SELECT '''value''' FROM t ORDER BY ALL")
.unwrap()
.parse_statements();
assert!(result.is_ok());
}
#[test]
fn test_preserve_type_id() {
// Check the override works and the parser recognizes it as the base type
derive_dialect!(
PreservedTypeDialect,
GenericDialect,
preserve_type_id = true,
overrides = { supports_order_by_all = true }
);
let dialect = PreservedTypeDialect::new();
let d: &dyn Dialect = &dialect;
assert!(dialect.supports_order_by_all());
assert!(d.is::<GenericDialect>());
}
#[test]
fn test_different_base_dialects() {
derive_dialect!(
EnhancedMySqlDialect,
MySqlDialect,
overrides = { supports_order_by_all = true }
);
derive_dialect!(UniquePostgreSqlDialect, PostgreSqlDialect);
let pg = UniquePostgreSqlDialect::new();
let mysql = EnhancedMySqlDialect::new();
// Inherit different base behaviors
assert!(pg.supports_filter_during_aggregation()); // PostgreSQL feature
assert!(mysql.supports_string_literal_backslash_escape()); // MySQL feature
assert!(mysql.supports_order_by_all()); // Override
// Each has unique TypeId
let pg_ref: &dyn Dialect = &pg;
let mysql_ref: &dyn Dialect = &mysql;
assert!(pg_ref.is::<UniquePostgreSqlDialect>());
assert!(!pg_ref.is::<PostgreSqlDialect>());
assert!(mysql_ref.is::<EnhancedMySqlDialect>());
}
#[test]
fn test_identifier_quote_style_overrides() {
derive_dialect!(
BacktickGenericDialect,
GenericDialect,
overrides = { identifier_quote_style = '`' }
);
derive_dialect!(
AnotherBacktickDialect,
GenericDialect,
overrides = { identifier_quote_style = '[' }
);
derive_dialect!(
QuotelessPostgreSqlDialect,
PostgreSqlDialect,
preserve_type_id = true,
overrides = { identifier_quote_style = None }
);
// Char literal (auto-wrapped in Some)
assert_eq!(
BacktickGenericDialect::new().identifier_quote_style("x"),
Some('`')
);
// Another char literal
assert_eq!(
AnotherBacktickDialect::new().identifier_quote_style("x"),
Some('[')
);
// None (overrides PostgreSQL's default '"')
assert_eq!(
QuotelessPostgreSqlDialect::new().identifier_quote_style("x"),
None
);
}