Skip to main content

dbx_core/sql/planner/logical/
update.rs

1//! UPDATE statement planning
2
3use crate::error::{DbxError, DbxResult};
4use crate::sql::planner::types::*;
5use sqlparser::ast::Statement;
6
7use super::LogicalPlanner;
8
9impl LogicalPlanner {
10    /// UPDATE → LogicalPlan 변환
11    pub(super) fn plan_update(&self, statement: &Statement) -> DbxResult<LogicalPlan> {
12        if let Statement::Update {
13            table,
14            assignments,
15            selection,
16            ..
17        } = statement
18        {
19            let table_name = table.relation.to_string();
20
21            // Parse SET assignments
22            let mut parsed_assignments = Vec::new();
23            for assignment in assignments {
24                let column = assignment.target.to_string();
25                let value = self.plan_expr(&assignment.value)?;
26                parsed_assignments.push((column, value));
27            }
28
29            // Parse WHERE clause (optional)
30            let filter = if let Some(sel) = selection {
31                Some(self.plan_expr(sel)?)
32            } else {
33                None
34            };
35
36            Ok(LogicalPlan::Update {
37                table: table_name,
38                assignments: parsed_assignments,
39                filter,
40            })
41        } else {
42            Err(DbxError::SqlNotSupported {
43                feature: "UPDATE statement".to_string(),
44                hint: "Expected UPDATE statement".to_string(),
45            })
46        }
47    }
48}