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