Skip to content

Commit cd3496d

Browse files
committed
clickhouse: tokenize == as Token::DoubleEq
1 parent 3aff6eb commit cd3496d

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

src/parser.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5964,7 +5964,7 @@ impl<'a> Parser<'a> {
59645964
| TableFactor::Function { alias, .. }
59655965
| TableFactor::UNNEST { alias, .. }
59665966
| TableFactor::TableFunction { alias, .. }
5967-
| TableFactor::FieldAccessor { alias, ..}
5967+
| TableFactor::FieldAccessor { alias, .. }
59685968
| TableFactor::Pivot {
59695969
pivot_alias: alias, ..
59705970
}

src/test_utils.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::{ast::*, parser::ParserOptions};
3232

3333

3434
#[cfg(test)]
35-
use pretty_assertions::{assert_eq, assert_ne};
35+
use pretty_assertions::{assert_eq};
3636

3737
/// Tests use the methods on this struct to invoke the parser on one or
3838
/// multiple dialects.

src/tokenizer.rs

+26-3
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,13 @@ use core::str::Chars;
3030

3131
#[cfg(feature = "serde")]
3232
use serde::{Deserialize, Serialize};
33-
3433
#[cfg(feature = "visitor")]
3534
use sqlparser_derive::{Visit, VisitMut};
3635

3736
use crate::ast::DollarQuotedString;
38-
use crate::dialect::{BigQueryDialect, DuckDbDialect, GenericDialect, SnowflakeDialect};
37+
use crate::dialect::{BigQueryDialect, ClickHouseDialect, DuckDbDialect, GenericDialect, SnowflakeDialect};
3938
use crate::dialect::{Dialect, MySqlDialect};
40-
use crate::keywords::{Keyword, ALL_KEYWORDS, ALL_KEYWORDS_INDEX};
39+
use crate::keywords::{ALL_KEYWORDS, ALL_KEYWORDS_INDEX, Keyword};
4140

4241
/// SQL Token enumeration
4342
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
@@ -800,6 +799,8 @@ impl<'a> Tokenizer<'a> {
800799
chars.next(); // consume
801800
match chars.peek() {
802801
Some('>') => self.consume_and_return(chars, Token::RArrow),
802+
Some('=') if dialect_of!(self is ClickHouseDialect) =>
803+
self.consume_and_return(chars, Token::DoubleEq),
803804
_ => Ok(Some(Token::Eq)),
804805
}
805806
}
@@ -1308,6 +1309,28 @@ mod tests {
13081309
compare(expected, tokens);
13091310
}
13101311

1312+
#[test]
1313+
fn tokenize_clickhouse_double_equal() {
1314+
let sql = String::from("SELECT foo=='1'");
1315+
let dialect = ClickHouseDialect {};
1316+
let mut tokenizer = Tokenizer::new(&dialect, &sql);
1317+
let tokens = tokenizer.tokenize().unwrap();
1318+
1319+
let expected = vec![
1320+
Token::make_keyword("SELECT"),
1321+
Token::Whitespace(Whitespace::Space),
1322+
Token::Word(Word {
1323+
value: "foo".to_string(),
1324+
quote_style: None,
1325+
keyword: Keyword::NoKeyword,
1326+
}),
1327+
Token::DoubleEq,
1328+
Token::SingleQuotedString("1".to_string()),
1329+
];
1330+
1331+
compare(expected, tokens);
1332+
}
1333+
13111334
#[test]
13121335
fn tokenize_select_exponent() {
13131336
let sql = String::from("SELECT 1e10, 1e-10, 1e+10, 1ea, 1e-10a, 1e-10-10");

tests/sqlparser_clickhouse.rs

+8
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,14 @@ fn parse_array_join() {
370370
);
371371
}
372372

373+
#[test]
374+
fn parse_double_equal() {
375+
clickhouse().one_statement_parses_to(
376+
r#"SELECT foo FROM bar WHERE buz == 'buz'"#,
377+
r#"SELECT foo FROM bar WHERE buz = 'buz'"#,
378+
);
379+
}
380+
373381
fn clickhouse() -> TestedDialects {
374382
TestedDialects {
375383
dialects: vec![Box::new(ClickHouseDialect {})],

0 commit comments

Comments
 (0)