From dfd9b9145fa5948940f3d29348065963cfcb9a1b Mon Sep 17 00:00:00 2001 From: Sarah Yurick Date: Wed, 17 Aug 2022 14:48:50 -0700 Subject: [PATCH 1/2] add unknown, is not true/false/unknown --- src/ast/mod.rs | 12 ++++++++++++ src/parser.rs | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index b91aae43c..8015f9c73 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -227,12 +227,20 @@ pub enum Expr { CompositeAccess { expr: Box, key: Ident }, /// `IS FALSE` operator IsFalse(Box), + /// `IS NOT FALSE` operator + IsNotFalse(Box), /// `IS TRUE` operator IsTrue(Box), + /// `IS NOT TRUE` operator + IsNotTrue(Box), /// `IS NULL` operator IsNull(Box), /// `IS NOT NULL` operator IsNotNull(Box), + /// `IS UNKNOWN` operator + IsUnknown(Box), + /// `IS NOT UNKNOWN` operator + IsNotUnknown(Box), /// `IS DISTINCT FROM` operator IsDistinctFrom(Box, Box), /// `IS NOT DISTINCT FROM` operator @@ -412,9 +420,13 @@ impl fmt::Display for Expr { } Expr::CompoundIdentifier(s) => write!(f, "{}", display_separated(s, ".")), Expr::IsTrue(ast) => write!(f, "{} IS TRUE", ast), + Expr::IsNotTrue(ast) => write!(f, "{} IS NOT TRUE", ast), Expr::IsFalse(ast) => write!(f, "{} IS FALSE", ast), + Expr::IsNotFalse(ast) => write!(f, "{} IS NOT FALSE", ast), Expr::IsNull(ast) => write!(f, "{} IS NULL", ast), Expr::IsNotNull(ast) => write!(f, "{} IS NOT NULL", ast), + Expr::IsUnknown(ast) => write!(f, "{} IS UNKNOWN", ast), + Expr::IsNotUnknown(ast) => write!(f, "{} IS NOT UNKNOWN", ast), Expr::InList { expr, list, diff --git a/src/parser.rs b/src/parser.rs index 3a90b3ccb..5cd6ae14b 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1255,8 +1255,16 @@ impl<'a> Parser<'a> { Ok(Expr::IsNotNull(Box::new(expr))) } else if self.parse_keywords(&[Keyword::TRUE]) { Ok(Expr::IsTrue(Box::new(expr))) + } else if self.parse_keywords(&[Keyword::NOT, Keyword::TRUE]) { + Ok(Expr::IsNotTrue(Box::new(expr))) } else if self.parse_keywords(&[Keyword::FALSE]) { Ok(Expr::IsFalse(Box::new(expr))) + } else if self.parse_keywords(&[Keyword::NOT, Keyword::FALSE]) { + Ok(Expr::IsNotFalse(Box::new(expr))) + } else if self.parse_keywords(&[Keyword::UNKNOWN]) { + Ok(Expr::IsUnknown(Box::new(expr))) + } else if self.parse_keywords(&[Keyword::NOT, Keyword::UNKNOWN]) { + Ok(Expr::IsNotUnknown(Box::new(expr))) } else if self.parse_keywords(&[Keyword::DISTINCT, Keyword::FROM]) { let expr2 = self.parse_expr()?; Ok(Expr::IsDistinctFrom(Box::new(expr), Box::new(expr2))) From 5268d4b7efb680db9efd73f5a8468299e62be2b4 Mon Sep 17 00:00:00 2001 From: Sarah Yurick Date: Wed, 28 Sep 2022 13:13:03 -0700 Subject: [PATCH 2/2] millennium --- src/ast/value.rs | 2 ++ src/keywords.rs | 1 + src/parser.rs | 2 ++ tests/sqlparser_common.rs | 1 + 4 files changed, 6 insertions(+) diff --git a/src/ast/value.rs b/src/ast/value.rs index 6f5953c4b..96d525ac6 100644 --- a/src/ast/value.rs +++ b/src/ast/value.rs @@ -85,6 +85,7 @@ pub enum DateTimeField { Julian, Microseconds, Millenium, + Millennium, Milliseconds, Quarter, Timezone, @@ -112,6 +113,7 @@ impl fmt::Display for DateTimeField { DateTimeField::Julian => "JULIAN", DateTimeField::Microseconds => "MICROSECONDS", DateTimeField::Millenium => "MILLENIUM", + DateTimeField::Millennium => "MILLENNIUM", DateTimeField::Milliseconds => "MILLISECONDS", DateTimeField::Quarter => "QUARTER", DateTimeField::Timezone => "TIMEZONE", diff --git a/src/keywords.rs b/src/keywords.rs index 35d98eef7..06d464073 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -331,6 +331,7 @@ define_keywords!( METHOD, MICROSECONDS, MILLENIUM, + MILLENNIUM, MILLISECONDS, MIN, MINUTE, diff --git a/src/parser.rs b/src/parser.rs index 76ffa1661..f2eb385a1 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1065,6 +1065,7 @@ impl<'a> Parser<'a> { Keyword::JULIAN => Ok(DateTimeField::Julian), Keyword::MICROSECONDS => Ok(DateTimeField::Microseconds), Keyword::MILLENIUM => Ok(DateTimeField::Millenium), + Keyword::MILLENNIUM => Ok(DateTimeField::Millennium), Keyword::MILLISECONDS => Ok(DateTimeField::Milliseconds), Keyword::QUARTER => Ok(DateTimeField::Quarter), Keyword::TIMEZONE => Ok(DateTimeField::Timezone), @@ -1144,6 +1145,7 @@ impl<'a> Parser<'a> { Keyword::JULIAN, Keyword::MICROSECONDS, Keyword::MILLENIUM, + Keyword::MILLENNIUM, Keyword::MILLISECONDS, Keyword::QUARTER, Keyword::TIMEZONE, diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 048e3517f..7d9b051bc 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -1750,6 +1750,7 @@ fn parse_extract() { verified_stmt("SELECT EXTRACT(JULIAN FROM d)"); verified_stmt("SELECT EXTRACT(MICROSECONDS FROM d)"); verified_stmt("SELECT EXTRACT(MILLENIUM FROM d)"); + verified_stmt("SELECT EXTRACT(MILLENNIUM FROM d)"); verified_stmt("SELECT EXTRACT(MILLISECONDS FROM d)"); verified_stmt("SELECT EXTRACT(QUARTER FROM d)"); verified_stmt("SELECT EXTRACT(TIMEZONE FROM d)");