uqa_sql/schema/sequences/
actions.rs1use 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}