qusql_parse/
alter_sequence.rs1use alloc::vec::Vec;
14
15use crate::create::parse_sequence_options;
16use crate::{
17 Identifier, OptSpanned, QualifiedName, SequenceOption, Span, Spanned,
18 alter_table::{AlterTableOwner, parse_alter_owner},
19 keywords::Keyword,
20 lexer::Token,
21 parser::{ParseError, Parser},
22 qualified_name::parse_qualified_name_unreserved,
23};
24
25#[derive(Clone, Debug)]
27pub enum AlterSequenceAction<'a> {
28 Options(Vec<SequenceOption<'a>>),
31 RenameTo {
33 rename_to_span: Span,
34 new_name: Identifier<'a>,
35 },
36 SetSchema {
38 set_schema_span: Span,
39 new_schema: Identifier<'a>,
40 },
41 OwnerTo {
43 owner_to_span: Span,
44 new_owner: AlterTableOwner<'a>,
45 },
46}
47
48impl<'a> Spanned for AlterSequenceAction<'a> {
49 fn span(&self) -> Span {
50 match self {
51 AlterSequenceAction::Options(options) => options.opt_span().unwrap(),
53 AlterSequenceAction::RenameTo {
54 rename_to_span,
55 new_name,
56 } => rename_to_span.join_span(new_name),
57 AlterSequenceAction::SetSchema {
58 set_schema_span,
59 new_schema,
60 } => set_schema_span.join_span(new_schema),
61 AlterSequenceAction::OwnerTo {
62 owner_to_span,
63 new_owner,
64 } => owner_to_span.join_span(new_owner),
65 }
66 }
67}
68
69#[derive(Clone, Debug)]
88pub struct AlterSequence<'a> {
89 pub alter_sequence_span: Span,
91 pub if_exists: Option<Span>,
93 pub name: QualifiedName<'a>,
95 pub action: AlterSequenceAction<'a>,
97}
98
99impl<'a> Spanned for AlterSequence<'a> {
100 fn span(&self) -> Span {
101 self.alter_sequence_span
102 .join_span(&self.if_exists)
103 .join_span(&self.name)
104 .join_span(&self.action)
105 }
106}
107
108pub(crate) fn parse_alter_sequence<'a>(
111 parser: &mut Parser<'a, '_>,
112 alter_sequence_span: Span,
113) -> Result<AlterSequence<'a>, ParseError> {
114 parser.postgres_only(&alter_sequence_span);
115 let if_exists = if let Some(if_span) = parser.skip_keyword(Keyword::IF) {
116 Some(parser.consume_keyword(Keyword::EXISTS)?.join_span(&if_span))
117 } else {
118 None
119 };
120 let name = parse_qualified_name_unreserved(parser)?;
121 let action = match &parser.token {
122 Token::Ident(_, Keyword::RENAME) => {
123 let rename_to_span = parser.consume_keywords(&[Keyword::RENAME, Keyword::TO])?;
124 let new_name = parser.consume_plain_identifier_unreserved()?;
125 AlterSequenceAction::RenameTo {
126 rename_to_span,
127 new_name,
128 }
129 }
130 Token::Ident(_, Keyword::SET) => {
131 let set_span = parser.consume_keyword(Keyword::SET)?;
132 if let Token::Ident(_, Keyword::SCHEMA) = parser.token {
133 let schema_span = parser.consume_keyword(Keyword::SCHEMA)?;
134 let new_schema = parser.consume_plain_identifier_unreserved()?;
135 AlterSequenceAction::SetSchema {
136 set_schema_span: set_span.join_span(&schema_span),
137 new_schema,
138 }
139 } else {
140 parser.expected_failure("'SCHEMA' after 'SET' in ALTER SEQUENCE")?
141 }
142 }
143 Token::Ident(_, Keyword::OWNER) => {
144 let owner_to_span = parser.consume_keywords(&[Keyword::OWNER, Keyword::TO])?;
145 let new_owner = parse_alter_owner(parser)?;
146 AlterSequenceAction::OwnerTo {
147 owner_to_span,
148 new_owner,
149 }
150 }
151 _ => {
152 let options = parse_sequence_options(parser)?;
153 if options.is_empty() {
154 parser.expected_failure("sequence options, 'RENAME TO', 'SET SCHEMA' or 'OWNER TO' after ALTER SEQUENCE")?;
155 }
156 AlterSequenceAction::Options(options)
157 }
158 };
159 Ok(AlterSequence {
160 alter_sequence_span,
161 if_exists,
162 name,
163 action,
164 })
165}