Skip to main content

uqa_sql/schema/indexes/
routines.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Analyze durable routine references in index keys before the partial-index predicate.
8
9use crate::{
10    ast::{FunctionBinding, IndexKey},
11    catalog::{
12        index::IndexDefinition,
13        stored_ast::{expression_references_routine_identity, rewrite_expression_routine_identity},
14    },
15    SQLError,
16};
17
18pub fn index_references_routine(
19    keys: &[IndexKey],
20    definition: &IndexDefinition,
21    target: &FunctionBinding,
22) -> Result<bool, SQLError> {
23    for expression in keys
24        .iter()
25        .filter_map(|key| match key {
26            IndexKey::Expression(expr) => Some(expr.as_ref()),
27            IndexKey::Column(_) => None,
28        })
29        .chain(definition.predicate.as_deref())
30    {
31        if expression_references_routine_identity(expression, target)? {
32            return Ok(true);
33        }
34    }
35    Ok(false)
36}
37
38pub fn rewrite_index_routine_references(
39    keys: &mut [IndexKey],
40    definition: &mut IndexDefinition,
41    target: &FunctionBinding,
42    name: &str,
43) -> Result<bool, SQLError> {
44    let mut changed = false;
45    for expression in keys
46        .iter_mut()
47        .filter_map(|key| match key {
48            IndexKey::Expression(expr) => Some(expr.as_mut()),
49            IndexKey::Column(_) => None,
50        })
51        .chain(definition.predicate.as_deref_mut())
52    {
53        changed |= rewrite_expression_routine_identity(expression, target, name)?;
54    }
55    Ok(changed)
56}