derive_dialect in sqlparser - Rust

Skip to main content

Macro derive_dialect 

Source

derive_dialect!() { /* proc-macro */ }
Expand description

Macro for streamlining the creation of derived Dialect objects. The generated struct includes new() and default() constructors. Requires the derive-dialect feature.

§Syntax

derive_dialect!(NewDialect, BaseDialect);
derive_dialect!(NewDialect, BaseDialect, overrides = { method = value, ... });
derive_dialect!(NewDialect, BaseDialect, preserve_type_id = true);
derive_dialect!(NewDialect, BaseDialect, preserve_type_id = true, overrides = { ... });

§Example

use sqlparser::derive_dialect;
use sqlparser::dialect::{Dialect, GenericDialect};

// Override boolean methods (supports_*, allow_*, etc.)
derive_dialect!(CustomDialect, GenericDialect, overrides = {
    supports_order_by_all = true,
    supports_nested_comments = true,
});

let dialect = CustomDialect::new();
assert!(dialect.supports_order_by_all());
assert!(dialect.supports_nested_comments());

§Overriding identifier_quote_style

Use a char literal or None:

use sqlparser::derive_dialect;
use sqlparser::dialect::{Dialect, PostgreSqlDialect};

derive_dialect!(BacktickPostgreSqlDialect, PostgreSqlDialect,
    preserve_type_id = true,
    overrides = { identifier_quote_style = '`' }
);
let d: &dyn Dialect = &BacktickPostgreSqlDialect::new();
assert_eq!(d.identifier_quote_style("foo"), Some('`'));

derive_dialect!(QuotelessPostgreSqlDialect, PostgreSqlDialect,
    preserve_type_id = true,
    overrides = { identifier_quote_style = None }
);
let d: &dyn Dialect = &QuotelessPostgreSqlDialect::new();
assert_eq!(d.identifier_quote_style("foo"), None);

§Type Identity

By default, derived dialects have their own TypeId. Set preserve_type_id = true to retain the base dialect’s identity with respect to the parser’s dialect.is::<T>() checks:

use sqlparser::derive_dialect;
use sqlparser::dialect::{Dialect, GenericDialect};

derive_dialect!(EnhancedGenericDialect, GenericDialect,
    preserve_type_id = true,
    overrides = {
        supports_order_by_all = true,
        supports_nested_comments = true,
    }
);
let d: &dyn Dialect = &EnhancedGenericDialect::new();
assert!(d.is::<GenericDialect>());  // still recognized as a GenericDialect
assert!(d.supports_nested_comments());
assert!(d.supports_order_by_all());

Procedural macro for deriving new SQL dialects.