Skip to content

Commit

Permalink
sigma element table factor
Browse files Browse the repository at this point in the history
  • Loading branch information
jmhain committed Mar 9, 2024
1 parent 4d6ff63 commit 2730712
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/ast/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,11 @@ pub enum TableFactor {
/// [Partition selection](https://dev.mysql.com/doc/refman/8.0/en/partitioning-selection.html), supported by MySQL.
partitions: Vec<Ident>,
},
/// A reference to an element in a Sigma workbook.
SigmaElement {
element: Ident,
alias: Option<TableAlias>,
},
Derived {
lateral: bool,
subquery: Box<Query>,
Expand Down Expand Up @@ -887,6 +892,13 @@ impl fmt::Display for TableFactor {
}
Ok(())
}
TableFactor::SigmaElement { element, alias } => {
write!(f, "@sigma.{element}")?;
if let Some(alias) = alias {
write!(f, " AS {alias}")?;
}
Ok(())
}
TableFactor::Derived {
lateral,
subquery,
Expand Down
1 change: 1 addition & 0 deletions src/keywords.rs
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,7 @@ define_keywords!(
SETS,
SHARE,
SHOW,
SIGMA,
SIMILAR,
SKIP,
SLOW,
Expand Down
13 changes: 13 additions & 0 deletions src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7985,6 +7985,7 @@ impl<'a> Parser<'a> {
match &mut table_and_joins.relation {
TableFactor::Derived { alias, .. }
| TableFactor::Table { alias, .. }
| TableFactor::SigmaElement { alias, .. }
| TableFactor::Function { alias, .. }
| TableFactor::UNNEST { alias, .. }
| TableFactor::JsonTable { alias, .. }
Expand Down Expand Up @@ -8062,6 +8063,18 @@ impl<'a> Parser<'a> {
columns,
alias,
})
} else if self
.maybe_parse(|p| {
p.expect_token(&Token::AtSign)?;
p.expect_keyword(Keyword::SIGMA)?;
Ok(())
})
.is_some()
{
self.expect_token(&Token::Period)?;
let element = self.parse_identifier(true)?;
let alias = self.parse_optional_table_alias(keywords::RESERVED_FOR_TABLE_ALIAS)?;
Ok(TableFactor::SigmaElement { element, alias })
} else {
let name = self.parse_object_name(true)?;

Expand Down
30 changes: 30 additions & 0 deletions tests/sqlparser_sigma.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#![warn(clippy::all)]

use sqlparser::ast::*;
use sqlparser::dialect::SnowflakeDialect;
use test_utils::*;

#[macro_use]
mod test_utils;

fn snowflake() -> TestedDialects {
TestedDialects {
dialects: vec![Box::new(SnowflakeDialect {})],
options: None,
}
}
#[test]
fn parse_sigma() {
let sql = "SELECT my_column FROM @sigma.my_element";
let select = snowflake().verified_only_select(sql);
assert_eq!(
select.from,
vec![TableWithJoins {
relation: TableFactor::SigmaElement {
element: Ident::new("my_element"),
alias: None
},
joins: vec![]
}]
)
}

0 comments on commit 2730712

Please sign in to comment.