MCPcopy Create free account
hub / github.com/MaterializeInc/materialize / parse_create_table_from_source

Method parse_create_table_from_source

src/sql-parser/src/parser.rs:5109–5185  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

5107 }
5108
5109 fn parse_create_table_from_source(&mut self) -> Result<Statement<Raw>, ParserError> {
5110 if self.parse_keyword(TEMP) || self.parse_keyword(TEMPORARY) {
5111 return parser_err!(
5112 self,
5113 self.peek_prev_pos(),
5114 "temporary tables FROM SOURCE are not supported"
5115 );
5116 }
5117 self.expect_keyword(TABLE)?;
5118 let if_not_exists = self.parse_if_not_exists()?;
5119 let table_name = self.parse_item_name()?;
5120
5121 if self.parse_keywords(&[FROM, WEBHOOK]) {
5122 // Webhook Source, which works differently than all other sources.
5123 return self.parse_create_webhook_source(table_name, if_not_exists, None, true);
5124 }
5125
5126 let (columns, constraints) = self.parse_table_from_source_columns()?;
5127
5128 self.expect_keywords(&[FROM, SOURCE])?;
5129
5130 let source = self.parse_raw_name()?;
5131
5132 let external_reference = if self.consume_token(&Token::LParen) {
5133 self.expect_keyword(REFERENCE)?;
5134 let _ = self.consume_token(&Token::Eq);
5135 let external_reference = self.parse_item_name()?;
5136 self.expect_token(&Token::RParen)?;
5137 Some(external_reference)
5138 } else {
5139 None
5140 };
5141
5142 let format = match self.parse_one_of_keywords(&[KEY, FORMAT]) {
5143 Some(KEY) => {
5144 self.expect_keyword(FORMAT)?;
5145 let key = self.parse_format()?;
5146 self.expect_keywords(&[VALUE, FORMAT])?;
5147 let value = self.parse_format()?;
5148 Some(FormatSpecifier::KeyValue { key, value })
5149 }
5150 Some(FORMAT) => Some(FormatSpecifier::Bare(self.parse_format()?)),
5151 Some(_) => unreachable!("parse_one_of_keywords returns None for this"),
5152 None => None,
5153 };
5154 let include_metadata = self.parse_source_include_metadata()?;
5155
5156 let envelope = if self.parse_keyword(ENVELOPE) {
5157 Some(self.parse_source_envelope()?)
5158 } else {
5159 None
5160 };
5161
5162 let with_options = if self.parse_keyword(WITH) {
5163 self.expect_token(&Token::LParen)?;
5164 let options = self.parse_comma_separated(Parser::parse_table_from_source_option)?;
5165 self.expect_token(&Token::RParen)?;
5166 options

Callers 1

parse_createMethod · 0.80

Calls 15

parse_keywordMethod · 0.80
expect_keywordMethod · 0.80
parse_if_not_existsMethod · 0.80
parse_item_nameMethod · 0.80
parse_keywordsMethod · 0.80
expect_keywordsMethod · 0.80
parse_raw_nameMethod · 0.80
consume_tokenMethod · 0.80
expect_tokenMethod · 0.80
parse_one_of_keywordsMethod · 0.80

Tested by

no test coverage detected