reifydb-rql 0.4.12

ReifyDB Query Language (RQL) parser and AST
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2025 ReifyDB

use std::marker::PhantomData;

use reifydb_core::{error::diagnostic::catalog::namespace_not_found, interface::resolved::ResolvedNamespace};
use reifydb_transaction::transaction::Transaction;
use reifydb_type::{fragment::Fragment, return_error};

use crate::{
	Result,
	plan::{
		logical::alter::table::{
			AlterTableAction as LogicalAlterTableAction, AlterTableNode as LogicalAlterTableNode,
		},
		physical::{AlterTableAction, AlterTableNode, Compiler, PhysicalPlan},
	},
};

impl<'bump> Compiler<'bump> {
	pub(crate) fn compile_alter_table(
		&mut self,
		rx: &mut Transaction<'_>,
		alter: LogicalAlterTableNode<'bump>,
	) -> Result<PhysicalPlan<'bump>> {
		let ns_segments: Vec<&str> = alter.table.namespace.iter().map(|n| n.text()).collect();
		let Some(namespace) = self.catalog.find_namespace_by_segments(rx, &ns_segments)? else {
			let ns_name = ns_segments.join("::");
			let ns_fragment = if let Some(n) = alter.table.namespace.first() {
				let interned = self.interner.intern_fragment(n);
				interned.with_text(&ns_name)
			} else {
				Fragment::internal("default".to_string())
			};
			return_error!(namespace_not_found(ns_fragment, &ns_name));
		};

		let namespace_id = if let Some(n) = alter.table.namespace.first() {
			let interned = self.interner.intern_fragment(n);
			interned.with_text(namespace.name())
		} else {
			Fragment::internal(namespace.name().to_string())
		};
		let resolved_namespace = ResolvedNamespace::new(namespace_id, namespace);

		let action = match alter.action {
			LogicalAlterTableAction::AddColumn {
				column,
			} => AlterTableAction::AddColumn {
				column,
			},
			LogicalAlterTableAction::DropColumn {
				column,
			} => AlterTableAction::DropColumn {
				column: self.interner.intern_fragment(&column),
			},
			LogicalAlterTableAction::RenameColumn {
				old_name,
				new_name,
			} => AlterTableAction::RenameColumn {
				old_name: self.interner.intern_fragment(&old_name),
				new_name: self.interner.intern_fragment(&new_name),
			},
		};

		Ok(PhysicalPlan::AlterTable(AlterTableNode {
			namespace: resolved_namespace,
			table: self.interner.intern_fragment(&alter.table.name),
			action,
			_phantom: PhantomData,
		}))
	}
}