@@ -21022,3 +21022,55 @@ fn parse_window_spec_keyword_base_window_name() {
2102221022 "SELECT count(*) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM t",
2102321023 );
2102421024}
21025+
21026+ #[test]
21027+ fn parse_comparison_in_between_low_bound() {
21028+ let dialects = all_dialects_where(|d| d.supports_comparison_in_between_low_bound());
21029+ for (sql, expected) in [
21030+ ("a BETWEEN b > 1 AND c", BinaryOperator::Gt),
21031+ ("a BETWEEN b <> 1 AND c", BinaryOperator::NotEq),
21032+ ("a BETWEEN b + 1 >= 2 AND c", BinaryOperator::GtEq),
21033+ ] {
21034+ match dialects.verified_expr(sql) {
21035+ Expr::Between { low, .. } => assert!(
21036+ matches!(&*low, Expr::BinaryOp { op, .. } if *op == expected),
21037+ "{sql}: {low:?}"
21038+ ),
21039+ other => panic!("{sql}: expected BETWEEN, got {other:?}"),
21040+ }
21041+ }
21042+ for (sql, error) in [
21043+ (
21044+ "SELECT a BETWEEN b = 1 = true AND c",
21045+ "Expected: AND, found: =",
21046+ ),
21047+ (
21048+ "SELECT a BETWEEN b LIKE 'x' AND c",
21049+ "Expected: AND, found: LIKE",
21050+ ),
21051+ (
21052+ "SELECT a BETWEEN b IS NULL AND c",
21053+ "Expected: AND, found: IS",
21054+ ),
21055+ (
21056+ "SELECT a BETWEEN b BETWEEN 1 AND 2 AND c",
21057+ "Expected: AND, found: BETWEEN",
21058+ ),
21059+ ] {
21060+ assert_eq!(
21061+ dialects.parse_sql_statements(sql),
21062+ Err(ParserError::ParserError(error.to_string())),
21063+ "{sql}"
21064+ );
21065+ }
21066+
21067+ assert_eq!(
21068+ all_dialects_except(|d| {
21069+ d.supports_comparison_in_between_low_bound() || d.is::<SQLiteDialect>()
21070+ })
21071+ .parse_sql_statements("SELECT a BETWEEN b > 1 AND c"),
21072+ Err(ParserError::ParserError(
21073+ "Expected: AND, found: >".to_string()
21074+ ))
21075+ );
21076+ }
0 commit comments