@@ -32,8 +32,8 @@ use sqlparser::ast::TableFactor::{Pivot, Unpivot};
3232use sqlparser::ast::*;
3333use sqlparser::dialect::{
3434 AnsiDialect, BigQueryDialect, ClickHouseDialect, DatabricksDialect, Dialect, DuckDbDialect,
35- GenericDialect, HiveDialect, IsNotNullAlias, MsSqlDialect, MySqlDialect, PostgreSqlDialect,
36- RedshiftSqlDialect, SQLiteDialect, SnowflakeDialect,
35+ GenericDialect, HiveDialect, MsSqlDialect, MySqlDialect, PostgreSqlDialect, RedshiftSqlDialect ,
36+ SQLiteDialect, SnowflakeDialect,
3737};
3838use sqlparser::keywords::{Keyword, ALL_KEYWORDS};
3939use sqlparser::parser::{Parser, ParserError, ParserOptions};
@@ -15975,69 +15975,53 @@ fn parse_create_procedure_with_parameter_modes() {
1597515975 }
1597615976}
1597715977
15978- #[test]
15979- fn parse_not_null_unsupported() {
15980- // Only DuckDB and SQLite support `x NOT NULL` as an expression
15981- // All other dialects fail to parse the `NOT NULL` portion
15982- let dialects =
15983- all_dialects_except(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotSpaceNull));
15984- let _ = dialects.expr_parses_to("x NOT NULL", "x");
15985- }
15986-
1598715978#[test]
1598815979fn parse_not_null_supported() {
15989- // DuckDB and SQLite support `x NOT NULL` as an alias for `x IS NOT NULL`
15990- let dialects =
15991- all_dialects_where(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotSpaceNull));
15992- let _ = dialects.expr_parses_to("x NOT NULL", "x IS NOT NULL");
15980+ let _ = all_dialects().expr_parses_to("x NOT NULL", "x IS NOT NULL");
15981+ let _ = all_dialects().expr_parses_to("NULL NOT NULL", "NULL IS NOT NULL");
1599315982}
1599415983
1599515984#[test]
1599615985fn test_not_null_precedence() {
15997- // For dialects which support it, `NOT NULL NOT NULL` should
15998- // parse as `(NOT (NULL IS NOT NULL))`
15999- let supported_dialects =
16000- all_dialects_where(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotSpaceNull));
16001- let unsuported_dialects =
16002- all_dialects_except(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotSpaceNull));
16003-
1600415986 assert_matches!(
16005- supported_dialects.expr_parses_to("NOT NULL NOT NULL", "NOT NULL IS NOT NULL"),
15987+ all_dialects().expr_parses_to("NOT NULL NOT NULL", "NOT NULL IS NOT NULL"),
15988+ Expr::UnaryOp {
15989+ op: UnaryOperator::Not,
15990+ ..
15991+ }
15992+ );
15993+ assert_matches!(
15994+ all_dialects().expr_parses_to("NOT x NOT NULL", "NOT x IS NOT NULL"),
1600615995 Expr::UnaryOp {
1600715996 op: UnaryOperator::Not,
1600815997 ..
1600915998 }
1601015999 );
16011-
16012- // for unsupported dialects, parsing should stop at `NOT NULL`
16013- unsuported_dialects.expr_parses_to("NOT NULL NOT NULL", "NOT NULL");
1601416000}
1601516001
1601616002#[test]
1601716003fn parse_notnull_unsupported() {
1601816004 // Only Postgres, DuckDB, and SQLite support `x NOTNULL` as an expression
1601916005 // All other dialects consider `x NOTNULL` like `x AS NOTNULL` and thus
1602016006 // consider `NOTNULL` an alias for x.
16021- let dialects = all_dialects_except(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotNull ));
16007+ let dialects = all_dialects_except(|d| d.supports_notnull_operator( ));
1602216008 let _ = dialects
1602316009 .verified_only_select_with_canonical("SELECT NULL NOTNULL", "SELECT NULL AS NOTNULL");
1602416010}
1602516011
1602616012#[test]
1602716013fn parse_notnull_supported() {
1602816014 // Postgres, DuckDB and SQLite support `x NOTNULL` as an alias for `x IS NOT NULL`
16029- let dialects = all_dialects_where(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotNull ));
16015+ let dialects = all_dialects_where(|d| d.supports_notnull_operator( ));
1603016016 let _ = dialects.expr_parses_to("x NOTNULL", "x IS NOT NULL");
1603116017}
1603216018
1603316019#[test]
1603416020fn test_notnull_precedence() {
1603516021 // For dialects which support it, `NOT NULL NOTNULL` should
1603616022 // parse as `(NOT (NULL IS NOT NULL))`
16037- let supported_dialects =
16038- all_dialects_where(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotNull));
16039- let unsuported_dialects =
16040- all_dialects_except(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotNull));
16023+ let supported_dialects = all_dialects_where(|d| d.supports_notnull_operator());
16024+ let unsupported_dialects = all_dialects_except(|d| d.supports_notnull_operator());
1604116025
1604216026 assert_matches!(
1604316027 supported_dialects.expr_parses_to("NOT NULL NOTNULL", "NOT NULL IS NOT NULL"),
@@ -16048,5 +16032,5 @@ fn test_notnull_precedence() {
1604816032 );
1604916033
1605016034 // for unsupported dialects, parsing should stop at `NOT NULL`
16051- unsuported_dialects .expr_parses_to("NOT NULL NOTNULL", "NOT NULL");
16035+ unsupported_dialects .expr_parses_to("NOT NULL NOTNULL", "NOT NULL");
1605216036}
0 commit comments