Skip to main content

oak_sql/language/
mod.rs

1#![doc = include_str!("readme.md")]
2use oak_core::{Language, LanguageCategory};
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6/// SQL language implementation.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub struct SqlLanguage {
10    /// Whether it is case sensitive.
11    pub case_sensitive: bool,
12    /// Whether to allow double-quoted identifiers.
13    pub quoted_identifiers: bool,
14    /// Whether to allow backtick identifiers.
15    pub backtick_identifiers: bool,
16    /// Whether to allow bracket identifiers.
17    pub bracket_identifiers: bool,
18}
19
20impl SqlLanguage {
21    /// Creates a new SQL language instance.
22    pub fn new() -> Self {
23        Self::default()
24    }
25
26    /// Creates a standard SQL language instance.
27    pub fn standard() -> Self {
28        Self::default()
29    }
30
31    /// Creates a MySQL-style SQL language instance.
32    pub fn mysql() -> Self {
33        Self { case_sensitive: false, quoted_identifiers: true, backtick_identifiers: true, bracket_identifiers: false }
34    }
35
36    /// Creates a PostgreSQL-style SQL language instance.
37    pub fn postgresql() -> Self {
38        Self { case_sensitive: false, quoted_identifiers: true, backtick_identifiers: false, bracket_identifiers: false }
39    }
40
41    /// Creates a SQL Server-style SQL language instance.
42    pub fn sqlserver() -> Self {
43        Self { case_sensitive: false, quoted_identifiers: true, backtick_identifiers: false, bracket_identifiers: true }
44    }
45}
46
47impl Default for SqlLanguage {
48    fn default() -> Self {
49        Self { case_sensitive: false, quoted_identifiers: true, backtick_identifiers: false, bracket_identifiers: false }
50    }
51}
52
53impl Language for SqlLanguage {
54    const NAME: &'static str = "sql";
55    const CATEGORY: LanguageCategory = LanguageCategory::Dsl;
56
57    type TokenType = crate::lexer::token_type::SqlTokenType;
58    type ElementType = crate::parser::element_type::SqlElementType;
59    type TypedRoot = ();
60}