use crate::{
QualifiedName, Span, Spanned, Statement,
create_option::CreateOption,
keywords::Keyword,
parser::{ParseError, Parser},
qualified_name::parse_qualified_name_unreserved,
statement::parse_compound_query,
};
use alloc::vec::Vec;
#[derive(Clone, Debug)]
pub struct CreateView<'a> {
pub create_span: Span,
pub create_options: Vec<CreateOption<'a>>,
pub view_span: Span,
pub if_not_exists: Option<Span>,
pub name: QualifiedName<'a>,
pub as_span: Span,
pub select: Statement<'a>,
}
impl<'a> Spanned for CreateView<'a> {
fn span(&self) -> Span {
self.create_span
.join_span(&self.create_options)
.join_span(&self.view_span)
.join_span(&self.if_not_exists)
.join_span(&self.name)
.join_span(&self.as_span)
.join_span(&self.select)
}
}
pub(crate) fn parse_create_view<'a>(
parser: &mut Parser<'a, '_>,
create_span: Span,
create_options: Vec<CreateOption<'a>>,
) -> Result<CreateView<'a>, ParseError> {
let view_span = parser.consume_keyword(Keyword::VIEW)?;
let if_not_exists = if let Some(if_) = parser.skip_keyword(Keyword::IF) {
Some(
parser
.consume_keywords(&[Keyword::NOT, Keyword::EXISTS])?
.join_span(&if_),
)
} else {
None
};
let name = parse_qualified_name_unreserved(parser)?;
let as_span = parser.consume_keyword(Keyword::AS)?;
let select = parse_compound_query(parser)?;
Ok(CreateView {
create_span,
create_options,
view_span,
if_not_exists,
name,
as_span,
select,
})
}