sql-dialect-fmt-parser 1.18.0

Error-resilient, event-based recursive-descent parser building a lossless rowan CST for Snowflake SQL.
Documentation
//! Parser line-ending resilience.

use sql_dialect_fmt_test_support::parser::{
    assert_parse_clean as clean, assert_parse_roundtrip as roundtrip,
};

#[test]
fn clean_selects_with_linux_windows_and_old_mac_newlines() {
    for newline in ["\n", "\r\n", "\r"] {
        let sql = format!(
            "SELECT a,{newline}       b AS name{newline}FROM table_name{newline}WHERE a IS NOT NULL{newline}ORDER BY b DESC{newline}LIMIT 10"
        );
        clean(&sql);
    }
}

#[test]
fn mixed_newline_file_roundtrips_with_comments() {
    let sql = "/* header\r\ncomment */\rSELECT a FROM t WHERE a = 1;\n-- next\r\nSELECT b FROM u WHERE b BETWEEN 1 AND 2;\r";
    clean(sql);
}

#[test]
fn recovery_preserves_newlines_in_broken_input() {
    for sql in [
        "SELECT\r\nFROM\r\nWHERE",
        "WITH c AS\rSELECT 1\nSELECT * FROM c",
        "SELECT a FROM t WHERE a IN (\r\n  1,\r  2,\n",
    ] {
        roundtrip(sql);
    }
}

#[test]
fn long_crlf_query_is_clean_and_lossless() {
    let mut sql = String::from("SELECT\r\n");
    for i in 0..256 {
        if i > 0 {
            sql.push_str(",\r\n");
        }
        sql.push_str("    c");
        sql.push_str(&i.to_string());
        sql.push_str(" AS alias_");
        sql.push_str(&i.to_string());
    }
    sql.push_str("\r\nFROM wide_table\r\nWHERE c0 IS NOT NULL\r\nORDER BY c0\r\nLIMIT 50");

    clean(&sql);
}