@@ -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};
@@ -15989,69 +15989,53 @@ fn parse_create_procedure_with_parameter_modes() {
1598915989 }
1599015990}
1599115991
15992- #[test]
15993- fn parse_not_null_unsupported() {
15994- // Only DuckDB and SQLite support `x NOT NULL` as an expression
15995- // All other dialects fail to parse the `NOT NULL` portion
15996- let dialects =
15997- all_dialects_except(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotSpaceNull));
15998- let _ = dialects.expr_parses_to("x NOT NULL", "x");
15999- }
16000-
1600115992#[test]
1600215993fn parse_not_null_supported() {
16003- // DuckDB and SQLite support `x NOT NULL` as an alias for `x IS NOT NULL`
16004- let dialects =
16005- all_dialects_where(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotSpaceNull));
16006- let _ = dialects.expr_parses_to("x NOT NULL", "x IS NOT NULL");
15994+ let _ = all_dialects().expr_parses_to("x NOT NULL", "x IS NOT NULL");
15995+ let _ = all_dialects().expr_parses_to("NULL NOT NULL", "NULL IS NOT NULL");
1600715996}
1600815997
1600915998#[test]
1601015999fn test_not_null_precedence() {
16011- // For dialects which support it, `NOT NULL NOT NULL` should
16012- // parse as `(NOT (NULL IS NOT NULL))`
16013- let supported_dialects =
16014- all_dialects_where(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotSpaceNull));
16015- let unsuported_dialects =
16016- all_dialects_except(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotSpaceNull));
16017-
1601816000 assert_matches!(
16019- supported_dialects.expr_parses_to("NOT NULL NOT NULL", "NOT NULL IS NOT NULL"),
16001+ all_dialects().expr_parses_to("NOT NULL NOT NULL", "NOT NULL IS NOT NULL"),
16002+ Expr::UnaryOp {
16003+ op: UnaryOperator::Not,
16004+ ..
16005+ }
16006+ );
16007+ assert_matches!(
16008+ all_dialects().expr_parses_to("NOT x NOT NULL", "NOT x IS NOT NULL"),
1602016009 Expr::UnaryOp {
1602116010 op: UnaryOperator::Not,
1602216011 ..
1602316012 }
1602416013 );
16025-
16026- // for unsupported dialects, parsing should stop at `NOT NULL`
16027- unsuported_dialects.expr_parses_to("NOT NULL NOT NULL", "NOT NULL");
1602816014}
1602916015
1603016016#[test]
1603116017fn parse_notnull_unsupported() {
1603216018 // Only Postgres, DuckDB, and SQLite support `x NOTNULL` as an expression
1603316019 // All other dialects consider `x NOTNULL` like `x AS NOTNULL` and thus
1603416020 // consider `NOTNULL` an alias for x.
16035- let dialects = all_dialects_except(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotNull ));
16021+ let dialects = all_dialects_except(|d| d.supports_notnull_operator( ));
1603616022 let _ = dialects
1603716023 .verified_only_select_with_canonical("SELECT NULL NOTNULL", "SELECT NULL AS NOTNULL");
1603816024}
1603916025
1604016026#[test]
1604116027fn parse_notnull_supported() {
1604216028 // Postgres, DuckDB and SQLite support `x NOTNULL` as an alias for `x IS NOT NULL`
16043- let dialects = all_dialects_where(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotNull ));
16029+ let dialects = all_dialects_where(|d| d.supports_notnull_operator( ));
1604416030 let _ = dialects.expr_parses_to("x NOTNULL", "x IS NOT NULL");
1604516031}
1604616032
1604716033#[test]
1604816034fn test_notnull_precedence() {
1604916035 // For dialects which support it, `NOT NULL NOTNULL` should
1605016036 // parse as `(NOT (NULL IS NOT NULL))`
16051- let supported_dialects =
16052- all_dialects_where(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotNull));
16053- let unsuported_dialects =
16054- all_dialects_except(|d| d.supports_is_not_null_alias(IsNotNullAlias::NotNull));
16037+ let supported_dialects = all_dialects_where(|d| d.supports_notnull_operator());
16038+ let unsupported_dialects = all_dialects_except(|d| d.supports_notnull_operator());
1605516039
1605616040 assert_matches!(
1605716041 supported_dialects.expr_parses_to("NOT NULL NOTNULL", "NOT NULL IS NOT NULL"),
@@ -16062,5 +16046,5 @@ fn test_notnull_precedence() {
1606216046 );
1606316047
1606416048 // for unsupported dialects, parsing should stop at `NOT NULL`
16065- unsuported_dialects .expr_parses_to("NOT NULL NOTNULL", "NOT NULL");
16049+ unsupported_dialects .expr_parses_to("NOT NULL NOTNULL", "NOT NULL");
1606616050}
0 commit comments