@@ -7132,12 +7132,45 @@ fn parse_cross_join() {
71327132 Join {
71337133 relation: table_from_name(ObjectName::from(vec![Ident::new("t2")])),
71347134 global: false,
7135- join_operator: JoinOperator::CrossJoin,
7135+ join_operator: JoinOperator::CrossJoin(JoinConstraint::None) ,
71367136 },
71377137 only(only(select.from).joins),
71387138 );
71397139}
71407140
7141+ #[test]
7142+ fn parse_cross_join_constraint() {
7143+ fn join_with_constraint(constraint: JoinConstraint) -> Join {
7144+ Join {
7145+ relation: table_from_name(ObjectName::from(vec![Ident::new("t2")])),
7146+ global: false,
7147+ join_operator: JoinOperator::CrossJoin(constraint),
7148+ }
7149+ }
7150+
7151+ fn test_constraint(sql: &str, constraint: JoinConstraint) {
7152+ let dialect = all_dialects_where(|d| d.supports_cross_join_constraint());
7153+ let select = dialect.verified_only_select(sql);
7154+ assert_eq!(
7155+ join_with_constraint(constraint),
7156+ only(only(select.from).joins),
7157+ );
7158+ }
7159+
7160+ test_constraint(
7161+ "SELECT * FROM t1 CROSS JOIN t2 ON a = b",
7162+ JoinConstraint::On(Expr::BinaryOp {
7163+ left: Box::new(Expr::Identifier(Ident::new("a"))),
7164+ op: BinaryOperator::Eq,
7165+ right: Box::new(Expr::Identifier(Ident::new("b"))),
7166+ }),
7167+ );
7168+ test_constraint(
7169+ "SELECT * FROM t1 CROSS JOIN t2 USING(a)",
7170+ JoinConstraint::Using(vec![ObjectName::from(vec![Ident::new("a")])]),
7171+ );
7172+ }
7173+
71417174#[test]
71427175fn parse_joins_on() {
71437176 fn join_with_constraint(
0 commit comments