Extract join type, equi-join keys, and non-equi condition.
(op: &ast::JoinOperator)
| 14 | |
| 15 | /// Extract join type, equi-join keys, and non-equi condition. |
| 16 | pub(super) fn extract_join_spec(op: &ast::JoinOperator) -> Result<JoinSpec> { |
| 17 | match op { |
| 18 | ast::JoinOperator::Inner(constraint) | ast::JoinOperator::Join(constraint) => { |
| 19 | let (keys, cond) = extract_join_constraint(constraint)?; |
| 20 | Ok((JoinType::Inner, keys, cond)) |
| 21 | } |
| 22 | ast::JoinOperator::Left(constraint) | ast::JoinOperator::LeftOuter(constraint) => { |
| 23 | let (keys, cond) = extract_join_constraint(constraint)?; |
| 24 | Ok((JoinType::Left, keys, cond)) |
| 25 | } |
| 26 | ast::JoinOperator::Right(constraint) | ast::JoinOperator::RightOuter(constraint) => { |
| 27 | let (keys, cond) = extract_join_constraint(constraint)?; |
| 28 | Ok((JoinType::Right, keys, cond)) |
| 29 | } |
| 30 | ast::JoinOperator::FullOuter(constraint) => { |
| 31 | let (keys, cond) = extract_join_constraint(constraint)?; |
| 32 | Ok((JoinType::Full, keys, cond)) |
| 33 | } |
| 34 | ast::JoinOperator::CrossJoin(constraint) => { |
| 35 | let (keys, cond) = extract_join_constraint(constraint)?; |
| 36 | Ok((JoinType::Cross, keys, cond)) |
| 37 | } |
| 38 | ast::JoinOperator::Semi(constraint) | ast::JoinOperator::LeftSemi(constraint) => { |
| 39 | let (keys, cond) = extract_join_constraint(constraint)?; |
| 40 | Ok((JoinType::Semi, keys, cond)) |
| 41 | } |
| 42 | ast::JoinOperator::Anti(constraint) | ast::JoinOperator::LeftAnti(constraint) => { |
| 43 | let (keys, cond) = extract_join_constraint(constraint)?; |
| 44 | Ok((JoinType::Anti, keys, cond)) |
| 45 | } |
| 46 | _ => Err(SqlError::Unsupported { |
| 47 | detail: format!("join type: {op:?}"), |
| 48 | }), |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | /// (equi_keys, non-equi condition) |
| 53 | type JoinConstraintResult = (Vec<(String, String)>, Option<SqlExpr>); |
no test coverage detected