|
17 | 17 |
|
18 | 18 | #[cfg(not(feature = "std"))] |
19 | 19 | use alloc::boxed::Box; |
20 | | -#[cfg(not(feature = "std"))] |
21 | | -use alloc::format; |
22 | | -#[cfg(not(feature = "std"))] |
23 | | -use alloc::vec::Vec; |
24 | 20 |
|
25 | 21 | use crate::{ |
26 | | - ast::{ |
27 | | - BinaryOperator, Expr, Ident, LockTable, LockTableType, SqlOption, Statement, StorageType, |
28 | | - TablespaceOption, Value, |
29 | | - }, |
| 22 | + ast::{BinaryOperator, Expr, LockTable, LockTableType, Statement}, |
30 | 23 | dialect::Dialect, |
31 | 24 | keywords::Keyword, |
32 | 25 | parser::{Parser, ParserError}, |
33 | | - tokenizer::{Token, Word}, |
34 | 26 | }; |
35 | 27 |
|
36 | 28 | use super::keywords; |
@@ -153,280 +145,6 @@ impl Dialect for MySqlDialect { |
153 | 145 | fn supports_comma_separated_set_assignments(&self) -> bool { |
154 | 146 | true |
155 | 147 | } |
156 | | - /// Dialect-specific table/view option parser override |
157 | | - /// |
158 | | - /// This method is called to parse the next table/view option. |
159 | | - /// |
160 | | - /// If `None` is returned, falls back to the default behavior. |
161 | | - /// <https://dev.mysql.com/doc/refman/8.4/en/create-table.html> |
162 | | - fn parse_plain_option(&self, parser: &mut Parser) -> Result<Option<SqlOption>, ParserError> { |
163 | | - //Some consts |
164 | | - const COMPRESSION_OPTS: [&str; 3] = ["ZLIB", "LZ4", "NONE"]; |
165 | | - const INSERT_METHODS_OPTS: [&str; 3] = ["NO", "FIRST", "LAST"]; |
166 | | - |
167 | | - let keyword = match parser.parse_one_of_keywords(&[ |
168 | | - Keyword::INSERT_METHOD, |
169 | | - Keyword::KEY_BLOCK_SIZE, |
170 | | - Keyword::ROW_FORMAT, |
171 | | - Keyword::DATA, |
172 | | - Keyword::INDEX, |
173 | | - Keyword::PACK_KEYS, |
174 | | - Keyword::STATS_AUTO_RECALC, |
175 | | - Keyword::STATS_PERSISTENT, |
176 | | - Keyword::STATS_SAMPLE_PAGES, |
177 | | - Keyword::DELAY_KEY_WRITE, |
178 | | - Keyword::COMPRESSION, |
179 | | - Keyword::ENCRYPTION, |
180 | | - Keyword::MAX_ROWS, |
181 | | - Keyword::MIN_ROWS, |
182 | | - Keyword::AUTOEXTEND_SIZE, |
183 | | - Keyword::AVG_ROW_LENGTH, |
184 | | - Keyword::CHECKSUM, |
185 | | - Keyword::CONNECTION, |
186 | | - Keyword::ENGINE_ATTRIBUTE, |
187 | | - Keyword::PASSWORD, |
188 | | - Keyword::SECONDARY_ENGINE_ATTRIBUTE, |
189 | | - Keyword::START, |
190 | | - Keyword::TABLESPACE, |
191 | | - Keyword::UNION, |
192 | | - ]) { |
193 | | - Some(keyword) => keyword, |
194 | | - None => return Ok(None), |
195 | | - }; |
196 | | - |
197 | | - //Optional equal sign |
198 | | - let _ = parser.consume_token(&Token::Eq); |
199 | | - let value = parser.next_token(); |
200 | | - let span = value.span; |
201 | | - |
202 | | - match (keyword, value.token) { |
203 | | - //Handled in common code |
204 | | - // ENGINE [=] engine_name |
205 | | - // AUTO_INCREMENT [=] value |
206 | | - // [DEFAULT] CHARACTER SET [=] charset_name |
207 | | - // [DEFAULT] COLLATE [=] collation_name |
208 | | - |
209 | | - // KEY_BLOCK_SIZE [=] value |
210 | | - (Keyword::KEY_BLOCK_SIZE, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
211 | | - key: Ident::new("KEY_BLOCK_SIZE"), |
212 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
213 | | - })), |
214 | | - |
215 | | - // ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT} |
216 | | - (Keyword::ROW_FORMAT, Token::Word(w)) => Ok(Some(SqlOption::KeyValue { |
217 | | - key: Ident::new("ROW_FORMAT"), |
218 | | - value: Expr::Identifier(Ident::with_span(span, w.value)), |
219 | | - })), |
220 | | - |
221 | | - // {DATA | INDEX} DIRECTORY [=] 'absolute path to directory' |
222 | | - (Keyword::DATA, Token::Word(w)) if w.keyword == Keyword::DIRECTORY => { |
223 | | - let _ = parser.consume_token(&Token::Eq); |
224 | | - |
225 | | - let next_token = parser.next_token(); |
226 | | - |
227 | | - if let Token::SingleQuotedString(s) = next_token.token { |
228 | | - Ok(Some(SqlOption::KeyValue { |
229 | | - key: Ident::new("DATA DIRECTORY"), |
230 | | - value: Expr::value(Value::SingleQuotedString(s)), |
231 | | - })) |
232 | | - } else { |
233 | | - parser.expected("Token::SingleQuotedString", next_token)? |
234 | | - } |
235 | | - } |
236 | | - (Keyword::INDEX, Token::Word(w)) if w.keyword == Keyword::DIRECTORY => { |
237 | | - let _ = parser.consume_token(&Token::Eq); |
238 | | - let next_token = parser.next_token(); |
239 | | - |
240 | | - if let Token::SingleQuotedString(s) = next_token.token { |
241 | | - Ok(Some(SqlOption::KeyValue { |
242 | | - key: Ident::new("INDEX DIRECTORY"), |
243 | | - value: Expr::value(Value::SingleQuotedString(s)), |
244 | | - })) |
245 | | - } else { |
246 | | - parser.expected("Token::SingleQuotedString", next_token)? |
247 | | - } |
248 | | - } |
249 | | - |
250 | | - // PACK_KEYS [=] {0 | 1 | DEFAULT} |
251 | | - (Keyword::PACK_KEYS, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
252 | | - key: Ident::new("PACK_KEYS"), |
253 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
254 | | - })), |
255 | | - |
256 | | - (Keyword::PACK_KEYS, Token::Word(s)) if s.value.to_uppercase() == "DEFAULT" => { |
257 | | - Ok(Some(SqlOption::KeyValue { |
258 | | - key: Ident::new("PACK_KEYS"), |
259 | | - value: Expr::value(Value::SingleQuotedString(s.value)), |
260 | | - })) |
261 | | - } |
262 | | - |
263 | | - // STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1} |
264 | | - (Keyword::STATS_AUTO_RECALC, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
265 | | - key: Ident::new("STATS_AUTO_RECALC"), |
266 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
267 | | - })), |
268 | | - |
269 | | - (Keyword::STATS_AUTO_RECALC, Token::Word(s)) if s.value.to_uppercase() == "DEFAULT" => { |
270 | | - Ok(Some(SqlOption::KeyValue { |
271 | | - key: Ident::new("STATS_AUTO_RECALC"), |
272 | | - value: Expr::value(Value::SingleQuotedString(s.value)), |
273 | | - })) |
274 | | - } |
275 | | - |
276 | | - //STATS_PERSISTENT [=] {DEFAULT | 0 | 1} |
277 | | - (Keyword::STATS_PERSISTENT, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
278 | | - key: Ident::new("STATS_PERSISTENT"), |
279 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
280 | | - })), |
281 | | - |
282 | | - (Keyword::STATS_PERSISTENT, Token::Word(s)) if s.value.to_uppercase() == "DEFAULT" => { |
283 | | - Ok(Some(SqlOption::KeyValue { |
284 | | - key: Ident::new("STATS_PERSISTENT"), |
285 | | - value: Expr::value(Value::SingleQuotedString(s.value)), |
286 | | - })) |
287 | | - } |
288 | | - |
289 | | - // STATS_SAMPLE_PAGES [=] value |
290 | | - (Keyword::STATS_SAMPLE_PAGES, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
291 | | - key: Ident::new("STATS_SAMPLE_PAGES"), |
292 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
293 | | - })), |
294 | | - |
295 | | - // DELAY_KEY_WRITE [=] {0 | 1} |
296 | | - (Keyword::DELAY_KEY_WRITE, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
297 | | - key: Ident::new("DELAY_KEY_WRITE"), |
298 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
299 | | - })), |
300 | | - |
301 | | - // COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'} |
302 | | - (Keyword::COMPRESSION, Token::SingleQuotedString(s)) |
303 | | - if COMPRESSION_OPTS.contains(&s.to_uppercase().as_str()) => |
304 | | - { |
305 | | - Ok(Some(SqlOption::KeyValue { |
306 | | - key: Ident::new("COMPRESSION"), |
307 | | - value: Expr::value(Value::SingleQuotedString(s)), |
308 | | - })) |
309 | | - } |
310 | | - |
311 | | - // ENCRYPTION [=] {'Y' | 'N'} |
312 | | - (Keyword::ENCRYPTION, Token::SingleQuotedString(s)) => Ok(Some(SqlOption::KeyValue { |
313 | | - key: Ident::new("ENCRYPTION"), |
314 | | - value: Expr::value(Value::SingleQuotedString(s)), |
315 | | - })), |
316 | | - |
317 | | - // MAX_ROWS [=] value |
318 | | - (Keyword::MAX_ROWS, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
319 | | - key: Ident::new("MAX_ROWS"), |
320 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
321 | | - })), |
322 | | - |
323 | | - // MIN_ROWS [=] value |
324 | | - (Keyword::MIN_ROWS, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
325 | | - key: Ident::new("MIN_ROWS"), |
326 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
327 | | - })), |
328 | | - |
329 | | - // AUTOEXTEND_SIZE [=] value |
330 | | - (Keyword::AUTOEXTEND_SIZE, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
331 | | - key: Ident::new("AUTOEXTEND_SIZE"), |
332 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
333 | | - })), |
334 | | - |
335 | | - // AVG_ROW_LENGTH [=] value |
336 | | - (Keyword::AVG_ROW_LENGTH, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
337 | | - key: Ident::new("AVG_ROW_LENGTH"), |
338 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
339 | | - })), |
340 | | - |
341 | | - // CHECKSUM [=] {0 | 1} |
342 | | - (Keyword::CHECKSUM, Token::Number(n, l)) => Ok(Some(SqlOption::KeyValue { |
343 | | - key: Ident::new("CHECKSUM"), |
344 | | - value: Expr::value(Value::Number(Parser::parse(n, value.span.start)?, l)), |
345 | | - })), |
346 | | - |
347 | | - // CONNECTION [=] 'connect_string' |
348 | | - (Keyword::CONNECTION, Token::SingleQuotedString(s)) => Ok(Some(SqlOption::KeyValue { |
349 | | - key: Ident::new("CONNECTION"), |
350 | | - value: Expr::value(Value::SingleQuotedString(s)), |
351 | | - })), |
352 | | - |
353 | | - // ENGINE_ATTRIBUTE [=] 'string' |
354 | | - (Keyword::ENGINE_ATTRIBUTE, Token::SingleQuotedString(s)) => { |
355 | | - Ok(Some(SqlOption::KeyValue { |
356 | | - key: Ident::new("ENGINE_ATTRIBUTE"), |
357 | | - value: Expr::value(Value::SingleQuotedString(s)), |
358 | | - })) |
359 | | - } |
360 | | - |
361 | | - // PASSWORD [=] 'string' |
362 | | - (Keyword::PASSWORD, Token::SingleQuotedString(s)) => Ok(Some(SqlOption::KeyValue { |
363 | | - key: Ident::new("PASSWORD"), |
364 | | - value: Expr::value(Value::SingleQuotedString(s)), |
365 | | - })), |
366 | | - |
367 | | - // SECONDARY_ENGINE_ATTRIBUTE [=] 'string' |
368 | | - (Keyword::SECONDARY_ENGINE_ATTRIBUTE, Token::SingleQuotedString(s)) => { |
369 | | - Ok(Some(SqlOption::KeyValue { |
370 | | - key: Ident::new("SECONDARY_ENGINE_ATTRIBUTE"), |
371 | | - value: Expr::value(Value::SingleQuotedString(s)), |
372 | | - })) |
373 | | - } |
374 | | - |
375 | | - // START TRANSACTION |
376 | | - (Keyword::START, Token::Word(w)) if w.keyword == Keyword::TRANSACTION => { |
377 | | - Ok(Some(SqlOption::Ident(Ident::new("START TRANSACTION")))) |
378 | | - } |
379 | | - |
380 | | - // INSERT_METHOD [=] { NO | FIRST | LAST } |
381 | | - (Keyword::INSERT_METHOD, Token::Word(w)) |
382 | | - if INSERT_METHODS_OPTS.contains(&w.value.to_uppercase().as_ref()) => |
383 | | - { |
384 | | - Ok(Some(SqlOption::KeyValue { |
385 | | - key: Ident::new("INSERT_METHOD"), |
386 | | - value: Expr::Identifier(Ident::new(w.value)), |
387 | | - })) |
388 | | - } |
389 | | - |
390 | | - // TABLESPACE tablespace_name [STORAGE DISK] | [TABLESPACE tablespace_name] STORAGE MEMORY |
391 | | - (Keyword::TABLESPACE, Token::Word(Word { value: name, .. })) |
392 | | - | (Keyword::TABLESPACE, Token::SingleQuotedString(name)) => { |
393 | | - let storage = match parser.parse_keyword(Keyword::STORAGE) { |
394 | | - true => { |
395 | | - let _ = parser.consume_token(&Token::Eq); |
396 | | - let storage_token = parser.next_token(); |
397 | | - match &storage_token.token { |
398 | | - Token::Word(w) => match w.value.to_uppercase().as_str() { |
399 | | - "DISK" => Some(StorageType::Disk), |
400 | | - "MEMORY" => Some(StorageType::Memory), |
401 | | - _ => parser |
402 | | - .expected("Storage type (DISK or MEMORY)", storage_token)?, |
403 | | - }, |
404 | | - _ => parser.expected("Token::Word", storage_token)?, |
405 | | - } |
406 | | - } |
407 | | - false => None, |
408 | | - }; |
409 | | - |
410 | | - Ok(Some(SqlOption::TableSpace(TablespaceOption { |
411 | | - name, |
412 | | - storage, |
413 | | - }))) |
414 | | - } |
415 | | - |
416 | | - // UNION [=] (tbl_name[,tbl_name]...) |
417 | | - (Keyword::UNION, Token::LParen) => { |
418 | | - let tables: Vec<Ident> = |
419 | | - parser.parse_comma_separated0(Parser::parse_identifier, Token::RParen)?; |
420 | | - parser.expect_token(&Token::RParen)?; |
421 | | - |
422 | | - Ok(Some(SqlOption::Union(tables))) |
423 | | - } |
424 | | - |
425 | | - _ => Err(ParserError::ParserError(format!( |
426 | | - "Table option {keyword:?} does not have a matching value" |
427 | | - ))), |
428 | | - } |
429 | | - } |
430 | 148 | } |
431 | 149 |
|
432 | 150 | /// `LOCK TABLES` |
|
0 commit comments