quill_sql/plan/logical_planner/
plan_create_index.rs

1use crate::error::{QuillSQLError, QuillSQLResult};
2use crate::plan::logical_plan::{CreateIndex, LogicalPlan};
3
4use super::LogicalPlanner;
5
6impl<'a> LogicalPlanner<'a> {
7    pub fn plan_create_index(
8        &self,
9        index_name: &sqlparser::ast::ObjectName,
10        table_name: &sqlparser::ast::ObjectName,
11        columns: &[sqlparser::ast::OrderByExpr],
12    ) -> QuillSQLResult<LogicalPlan> {
13        let index_name = index_name.0.first().map_or(
14            Err(QuillSQLError::Plan(format!(
15                "Index name {index_name} is not expected"
16            ))),
17            |ident| Ok(ident.value.clone()),
18        )?;
19        let table = self.bind_table_name(table_name)?;
20        let mut columns_expr = vec![];
21        for col in columns.iter() {
22            let col_expr = self.bind_order_by_expr(col)?;
23            columns_expr.push(col_expr);
24        }
25        let table_schema = self.context.catalog.table_heap(&table)?.schema.clone();
26        Ok(LogicalPlan::CreateIndex(CreateIndex {
27            index_name,
28            table,
29            table_schema,
30            columns: columns_expr,
31        }))
32    }
33}