Skip to main content

uqa_sql/schema/sequences/
names.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Resolve persisted sequence names against the loaded catalog, independently of `search_path`.
8use uqa_core::RelationIdentity;
9pub trait StoredSequenceRegistry {
10    fn contains_sequence(&self, relation: &RelationIdentity) -> bool;
11    fn sequence_names(&self) -> Vec<RelationIdentity>;
12}
13pub fn resolve_stored_sequence_reference(
14    catalog: &dyn StoredSequenceRegistry,
15    reference: &str,
16) -> Result<String, String> {
17    let (schema, local_name) = RelationIdentity::parse_reference(reference)
18        .map_err(|error| format!("invalid persisted sequence reference `{reference}`: {error}"))?;
19    if let Some(schema) = schema {
20        let target = RelationIdentity::new(schema, local_name);
21        if catalog.contains_sequence(&target) {
22            return Ok(target.qualified_name());
23        }
24        return Err(format!(
25            "dangling persisted sequence reference `{reference}`"
26        ));
27    }
28    let candidates = catalog
29        .sequence_names()
30        .into_iter()
31        .filter(|candidate| candidate.name == local_name)
32        .map(|candidate| candidate.qualified_name())
33        .collect::<Vec<_>>();
34    match candidates.as_slice() {
35        [target] => Ok(target.clone()),
36        [] => Err(format!(
37            "dangling persisted sequence reference `{reference}`"
38        )),
39        _ => Err(format!(
40            "ambiguous persisted sequence reference `{reference}` matches {}",
41            candidates.join(", ")
42        )),
43    }
44}