Skip to main content

uqa_sql/schema/sequences/
actions.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Validate combinations of SQL sequence actions and persistence changes.
8use crate::ast::{RelationPersistence, SequenceBound, SequenceRestart};
9use crate::SQLError;
10
11pub fn altered_sequence_persistence(
12    alter: &crate::ast::AlterSequence,
13    current: RelationPersistence,
14    relation_name: &str,
15) -> Result<RelationPersistence, SQLError> {
16    match alter.persistence {
17        None => Ok(current),
18        Some(RelationPersistence::Permanent | RelationPersistence::Unlogged)
19            if current == RelationPersistence::Temporary =>
20        {
21            Err(SQLError::Routine {
22                sqlstate: "42P16".into(),
23                message: format!(
24                    "cannot change logged status of table \"{relation_name}\" because it is temporary"
25                ),
26            })
27        }
28        Some(requested @ (RelationPersistence::Permanent | RelationPersistence::Unlogged)) => {
29            Ok(requested)
30        }
31        Some(RelationPersistence::Temporary) => Err(SQLError::Internal(
32            "ALTER SEQUENCE cannot request temporary persistence".into(),
33        )),
34    }
35}
36
37pub fn sequence_alter_is_persistence_only(alter: &crate::ast::AlterSequence) -> bool {
38    alter.persistence.is_some()
39        && alter.role_owner.is_none()
40        && alter.restart == SequenceRestart::Unchanged
41        && alter.increment.is_none()
42        && alter.start.is_none()
43        && alter.data_type.is_none()
44        && alter.min_value == SequenceBound::Unchanged
45        && alter.max_value == SequenceBound::Unchanged
46        && alter.cycle.is_none()
47        && alter.cache_size.is_none()
48        && alter.ownership == crate::ast::SequenceOwnership::Unchanged
49}
50
51pub fn validate_sequence_role_owner_shape(
52    alter: &crate::ast::AlterSequence,
53) -> Result<(), SQLError> {
54    if alter.restart != SequenceRestart::Unchanged
55        || alter.increment.is_some()
56        || alter.start.is_some()
57        || alter.data_type.is_some()
58        || alter.min_value != SequenceBound::Unchanged
59        || alter.max_value != SequenceBound::Unchanged
60        || alter.cycle.is_some()
61        || alter.cache_size.is_some()
62        || alter.ownership != crate::ast::SequenceOwnership::Unchanged
63        || alter.persistence.is_some()
64        || alter.lifecycle != crate::ast::SequenceLifecycle::Unchanged
65    {
66        return Err(SQLError::Internal(
67            "ALTER SEQUENCE OWNER TO cannot contain another action".into(),
68        ));
69    }
70    Ok(())
71}