Skip to main content

uqa_sql/schema/indexes/
unique.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Unique-index access-method and partition-key declaration rules.
8use crate::{
9    ast::{CreateIndex, TableHierarchy},
10    SQLError,
11};
12pub fn validate_unique_index_method(statement: &CreateIndex) -> Result<(), SQLError> {
13    if !matches!(statement.access_method.as_str(), "" | "btree") {
14        return Err(SQLError::Routine {
15            sqlstate: "0A000".into(),
16            message: format!(
17                "access method \"{}\" does not support unique indexes",
18                statement.access_method
19            ),
20        });
21    }
22    Ok(())
23}
24pub fn validate_unique_partition_columns(
25    statement: &CreateIndex,
26    hierarchy: &TableHierarchy,
27) -> Result<(), SQLError> {
28    if let Some(partition) = &hierarchy.partition_spec {
29        for key in &partition.keys {
30            if !matches!(key, crate::ast::Expr::Column(column) if statement.columns.iter().any(|key| key.column() == Some(column.as_str())))
31            {
32                return Err(SQLError::Routine {
33                    sqlstate: "0A000".into(),
34                    message: "unique constraint on partitioned table must include all partitioning columns".into(),
35                });
36            }
37        }
38    }
39    Ok(())
40}