orql 0.1.0

A toy SQL parser for a subset of the Oracle dialect.
Documentation
//! Parses and validates some "real world", external SQL statements.

use crate::parser::parse_with_metadata;

/// From <https://github.com/apache/datafusion-sqlparser-rs/blob/main/sqlparser_bench/benches/sqlparser_bench.rs>
#[test]
fn test_sqlparser_select() {
    assert_sql!(
        stmt("SELECT * FROM my_table WHERE 1 = 1"),
        "SELECT * FROM my_table WHERE 1 = 1"
    );
}

/// From <https://github.com/apache/datafusion-sqlparser-rs/blob/main/sqlparser_bench/benches/sqlparser_bench.rs>
#[test]
fn test_sqlparser_with_query() {
    assert_sql!(
        stmt(
            r#"WITH derived AS (
            SELECT MAX(a) AS max_a,
                   COUNT(b) AS b_num,
                   user_id
            FROM MY_TABLE
            GROUP BY user_id
        )
        SELECT * FROM my_table
        LEFT JOIN derived USING (user_id)"#
        ),
        "\
WITH derived AS (\
   SELECT MAX(a) AS max_a, \
          COUNT(b) AS b_num, \
          user_id \
   FROM MY_TABLE \
   GROUP BY user_id) \
SELECT * FROM my_table \
  LEFT JOIN derived USING (user_id)"
    );
}

#[test]
fn test_sqlparser_large_statement() {
    let large_statement = {
        let expressions = (0..1000)
            .map(|n| format!("FN_{n}(COL_{n})"))
            .collect::<Vec<_>>()
            .join(", ");
        let tables = (0..1000)
            .map(|n| format!("TABLE_{n}"))
            .collect::<Vec<_>>()
            .join(" CROSS JOIN ");
        let where_condition = (0..1000)
            .map(|n| format!("COL_{n} = {n}"))
            .collect::<Vec<_>>()
            .join(" OR ");
        let order_condition = (0..1000)
            .map(|n| format!("COL_{n} DESC"))
            .collect::<Vec<_>>()
            .join(", ");
        format!(
            "SELECT {expressions} FROM {tables} WHERE {where_condition} ORDER BY {order_condition}"
        )
    };
    if let Err(e) = parse_with_metadata(&large_statement) {
        panic!("parse error: {e}");
    }
}