|
1 |
| -use readyset_sql::{ast::SqlQuery, Dialect}; |
| 1 | +use readyset_sql::{ |
| 2 | + ast::{Expr, SqlQuery}, |
| 3 | + Dialect, |
| 4 | +}; |
2 | 5 |
|
3 | 6 | #[cfg(feature = "sqlparser")]
|
4 | 7 | use readyset_sql::{
|
@@ -471,13 +474,33 @@ fn parse_readyset_query(
|
471 | 474 | }
|
472 | 475 |
|
473 | 476 | #[cfg(feature = "sqlparser")]
|
474 |
| -pub fn parse_query(dialect: Dialect, input: impl AsRef<str>) -> Result<SqlQuery, String> { |
475 |
| - let nom_result = nom_sql::parse_query(dialect, input.as_ref()); |
| 477 | +fn parse_readyset_expr( |
| 478 | + parser: &mut Parser, |
| 479 | + dialect: Dialect, |
| 480 | + _input: impl AsRef<str>, |
| 481 | +) -> Result<Expr, ReadysetParsingError> { |
| 482 | + Ok(parser.parse_expr()?.try_into_dialect(dialect)?) |
| 483 | +} |
| 484 | + |
| 485 | +#[cfg(feature = "sqlparser")] |
| 486 | +fn parse_both_inner<S, T, NP, SP>( |
| 487 | + dialect: Dialect, |
| 488 | + input: S, |
| 489 | + nom_parser: NP, |
| 490 | + sqlparser_parser: SP, |
| 491 | +) -> Result<T, String> |
| 492 | +where |
| 493 | + T: PartialEq + std::fmt::Debug, |
| 494 | + S: AsRef<str>, |
| 495 | + for<'a> NP: FnOnce(Dialect, &'a str) -> Result<T, String>, |
| 496 | + for<'a> SP: FnOnce(&mut Parser, Dialect, &'a str) -> Result<T, ReadysetParsingError>, |
| 497 | +{ |
| 498 | + let nom_result = nom_parser(dialect, input.as_ref()); |
476 | 499 | let sqlparser_dialect = sqlparser_dialect_from_readyset_dialect(dialect);
|
477 | 500 | let sqlparser_result = Parser::new(sqlparser_dialect.as_ref())
|
478 | 501 | .try_with_sql(input.as_ref())
|
479 | 502 | .map_err(Into::into)
|
480 |
| - .and_then(|mut p| parse_readyset_query(&mut p, dialect, input.as_ref())); |
| 503 | + .and_then(|mut p| sqlparser_parser(&mut p, dialect, input.as_ref())); |
481 | 504 |
|
482 | 505 | match (&nom_result, sqlparser_result) {
|
483 | 506 | (Ok(nom_ast), Ok(sqlparser_ast)) => {
|
@@ -515,7 +538,33 @@ pub fn parse_query(dialect: Dialect, input: impl AsRef<str>) -> Result<SqlQuery,
|
515 | 538 | nom_result
|
516 | 539 | }
|
517 | 540 |
|
| 541 | +#[cfg(feature = "sqlparser")] |
| 542 | +pub fn parse_query(dialect: Dialect, input: impl AsRef<str>) -> Result<SqlQuery, String> { |
| 543 | + parse_both_inner( |
| 544 | + dialect, |
| 545 | + input, |
| 546 | + |d, s| nom_sql::parse_query(d, s), |
| 547 | + |p, d, s| parse_readyset_query(p, d, s), |
| 548 | + ) |
| 549 | +} |
| 550 | + |
518 | 551 | #[cfg(not(feature = "sqlparser"))]
|
519 | 552 | pub fn parse_query(dialect: Dialect, input: impl AsRef<str>) -> Result<SqlQuery, String> {
|
520 | 553 | nom_sql::parse_query(dialect, input.as_ref())
|
521 | 554 | }
|
| 555 | + |
| 556 | +/// Parses a single expression; only intended for use in tests. |
| 557 | +#[cfg(feature = "sqlparser")] |
| 558 | +pub fn parse_expr(dialect: Dialect, input: impl AsRef<str>) -> Result<Expr, String> { |
| 559 | + parse_both_inner( |
| 560 | + dialect, |
| 561 | + input, |
| 562 | + |d, s| nom_sql::parse_expr(d, s), |
| 563 | + |p, d, s| parse_readyset_expr(p, d, s), |
| 564 | + ) |
| 565 | +} |
| 566 | + |
| 567 | +#[cfg(not(feature = "sqlparser"))] |
| 568 | +pub fn parse_expr(dialect: Dialect, input: impl AsRef<str>) -> Result<Expr, String> { |
| 569 | + nom_sql::parse_expr(dialect, input.as_ref()) |
| 570 | +} |
0 commit comments