sql-bridge 0.2.0

SQL bridge for sqlx-repo
Documentation
use sql_bridge::{Error, MySqlDialect, PostgreSqlDialect, SQLiteDialect, parse};

#[test]
fn create_index_unique() {
    let input = "CREATE UNIQUE INDEX idx ON table_name (id, org)";
    let mut ast = parse(input).unwrap();
    assert!(ast.len() == 1);
    let ast = ast.pop().unwrap();

    assert_eq!(
        ast.to_sql(&MySqlDialect {}).unwrap(),
        "CREATE UNIQUE INDEX `idx` ON `table_name` (`id`, `org`)"
    );

    assert_eq!(
        ast.to_sql(&PostgreSqlDialect {}).unwrap(),
        "CREATE UNIQUE INDEX \"idx\" ON \"table_name\" (\"id\", \"org\")",
    );

    assert_eq!(
        ast.to_sql(&SQLiteDialect {}).unwrap(),
        "CREATE UNIQUE INDEX `idx` ON `table_name` (`id`, `org`)"
    );
}

#[test]
fn create_index() {
    let input = "CREATE INDEX idx ON table_name (id, org)";
    let mut ast = parse(input).unwrap();
    assert!(ast.len() == 1);
    let ast = ast.pop().unwrap();

    assert_eq!(
        ast.to_sql(&MySqlDialect {}).unwrap(),
        "CREATE INDEX `idx` ON `table_name` (`id`, `org`)"
    );

    assert_eq!(
        ast.to_sql(&PostgreSqlDialect {}).unwrap(),
        "CREATE INDEX \"idx\" ON \"table_name\" (\"id\", \"org\")",
    );

    assert_eq!(
        ast.to_sql(&SQLiteDialect {}).unwrap(),
        "CREATE INDEX `idx` ON `table_name` (`id`, `org`)"
    );
}

#[test]
fn create_index_if_not_exists() {
    let input = "CREATE INDEX IF NOT EXISTS idx ON table_name (id, org)";
    assert_eq!(
        parse(input).unwrap_err().to_string(),
        "unsupported create index: existance check"
    );
}

#[test]
fn create_index_auto_named() {
    let input = "CREATE INDEX ON table (column)";
    let error = parse(input).unwrap_err();
    assert!(matches!(error, Error::CreateIndex { reason: "nameless" }));
    assert_eq!(error.to_string(), "unsupported create index: nameless");
}

#[test]
fn create_index_concurrent() {
    let input = "CREATE INDEX CONCURRENTLY idx_name ON table_name (column_name)";
    let error = parse(input).unwrap_err();
    assert!(matches!(
        error,
        Error::CreateIndex {
            reason: "concurrent"
        }
    ));
    assert_eq!(error.to_string(), "unsupported create index: concurrent");
}

#[test]
fn create_index_using_index_method() {
    let input = "CREATE INDEX index_name ON table_name USING index_method (column_list)";
    let error = parse(input).unwrap_err();
    assert!(matches!(error, Error::CreateIndex { reason: "using" }));
    assert_eq!(error.to_string(), "unsupported create index: using");
}

#[test]
fn create_index_with_include() {
    let input = "CREATE INDEX idx_name ON table(column) INCLUDE (other_column)";
    let error = parse(input).unwrap_err();
    assert!(matches!(error, Error::CreateIndex { reason: "include" }));
    assert_eq!(error.to_string(), "unsupported create index: include");
}

#[test]
fn create_index_distinct_nulls() {
    let input = "CREATE INDEX idx_name ON table_name (col) NULLS DISTINCT";
    let error = parse(input).unwrap_err();
    assert!(matches!(
        error,
        Error::CreateIndex {
            reason: "distinct nulls"
        }
    ));
    assert_eq!(
        error.to_string(),
        "unsupported create index: distinct nulls"
    );
}

#[test]
fn create_index_with() {
    let input = "CREATE INDEX idx_name ON table_name (col) WITH (fillfactor = 70)";
    let error = parse(input).unwrap_err();
    assert!(matches!(error, Error::CreateIndex { reason: "with" }));
    assert_eq!(error.to_string(), "unsupported create index: with");
}

#[test]
fn create_index_with_predicate() {
    let input = "CREATE INDEX idx_name ON table_name(col) WHERE col > 500";
    let error = parse(input).unwrap_err();
    assert!(matches!(
        error,
        Error::CreateIndex {
            reason: "predicate"
        }
    ));
    assert_eq!(error.to_string(), "unsupported create index: predicate");
}