(
&mut self,
)
| 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; |
no test coverage detected