MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / extract_join_constraint

Function extract_join_constraint

nodedb-sql/src/planner/join/constraint.rs:55–93  ·  view source on GitHub ↗
(constraint: &ast::JoinConstraint)

Source from the content-addressed store, hash-verified

53type JoinConstraintResult = (Vec<(String, String)>, Option<SqlExpr>);
54
55fn extract_join_constraint(constraint: &ast::JoinConstraint) -> Result<JoinConstraintResult> {
56 match constraint {
57 ast::JoinConstraint::On(expr) => {
58 let mut keys = Vec::new();
59 let mut non_equi = Vec::new();
60 extract_equi_keys(expr, &mut keys, &mut non_equi)?;
61 let cond = if non_equi.is_empty() {
62 None
63 } else {
64 let mut combined = convert_expr(&non_equi[0])?;
65 for pred in &non_equi[1..] {
66 combined = SqlExpr::BinaryOp {
67 left: Box::new(combined),
68 op: crate::types::BinaryOp::And,
69 right: Box::new(convert_expr(pred)?),
70 };
71 }
72 Some(combined)
73 };
74 Ok((keys, cond))
75 }
76 ast::JoinConstraint::Using(columns) => {
77 let keys = columns
78 .iter()
79 .map(|c| {
80 let name = crate::parser::normalize::normalize_object_name_checked(c)?;
81 Ok((name.clone(), name))
82 })
83 .collect::<Result<Vec<_>>>()?;
84 Ok((keys, None))
85 }
86 ast::JoinConstraint::Natural => Err(SqlError::Unsupported {
87 detail: "NATURAL JOIN is not supported; use explicit ON or USING clause".into(),
88 }),
89 ast::JoinConstraint::None => Err(SqlError::Unsupported {
90 detail: "implicit cross join (no ON/USING clause) is not supported".into(),
91 }),
92 }
93}
94
95fn extract_equi_keys(
96 expr: &ast::Expr,

Callers 1

extract_join_specFunction · 0.85

Calls 6

extract_equi_keysFunction · 0.85
convert_exprFunction · 0.85
is_emptyMethod · 0.45
iterMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected