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

Method parse_table_from_source_columns

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

Source from the content-addressed store, hash-verified

5253 }
5254
5255 fn parse_table_from_source_columns(
5256 &mut self,
5257 ) -> Result<(TableFromSourceColumns<Raw>, Vec<TableConstraint<Raw>>), ParserError> {
5258 let mut constraints = vec![];
5259
5260 if !self.consume_token(&Token::LParen) {
5261 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5262 }
5263 if self.consume_token(&Token::RParen) {
5264 // Tables with zero columns are a PostgreSQL extension.
5265 return Ok((TableFromSourceColumns::NotSpecified, constraints));
5266 }
5267
5268 let mut column_names = vec![];
5269 let mut column_defs = vec![];
5270 loop {
5271 if let Some(constraint) = self.parse_optional_table_constraint()? {
5272 constraints.push(constraint);
5273 } else if let Some(column_name) = self.consume_identifier()? {
5274 let next_token = self.peek_token();
5275 match next_token {
5276 Some(Token::Comma) | Some(Token::RParen) => {
5277 column_names.push(column_name);
5278 }
5279 _ => {
5280 let data_type = self.parse_data_type()?;
5281 let collation = if self.parse_keyword(COLLATE) {
5282 Some(self.parse_item_name()?)
5283 } else {
5284 None
5285 };
5286 let mut options = vec![];
5287 loop {
5288 match self.peek_token() {
5289 None | Some(Token::Comma) | Some(Token::RParen) => break,
5290 _ => options.push(self.parse_column_option_def()?),
5291 }
5292 }
5293
5294 column_defs.push(ColumnDef {
5295 name: column_name,
5296 data_type,
5297 collation,
5298 options,
5299 });
5300 }
5301 }
5302 } else {
5303 return self.expected(
5304 self.peek_pos(),
5305 "column name or constraint definition",
5306 self.peek_token(),
5307 );
5308 }
5309 if self.consume_token(&Token::Comma) {
5310 // Continue.
5311 } else if self.consume_token(&Token::RParen) {
5312 break;

Callers 1

Calls 12

consume_tokenMethod · 0.80
consume_identifierMethod · 0.80
peek_tokenMethod · 0.80
parse_data_typeMethod · 0.80
parse_keywordMethod · 0.80
parse_item_nameMethod · 0.80
expectedMethod · 0.80
peek_posMethod · 0.80
pushMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected