Skip to content

Commit

Permalink
Add some tests for INSERT without target columns and edge cases
Browse files Browse the repository at this point in the history
  • Loading branch information
gruuya committed Jan 26, 2023
1 parent 4d9844f commit cc6b0e0
Showing 1 changed file with 44 additions and 31 deletions.
75 changes: 44 additions & 31 deletions datafusion/sql/tests/integration_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,13 +165,56 @@ fn plan_insert() {
"insert into person (id, first_name, last_name) values (1, 'Alan', 'Turing')";
let plan = r#"
Dml: op=[Insert] table=[person]
Projection: CAST(column1 AS id AS UInt32), column2 AS first_name, column3 AS last_name
Projection: CAST(column1 AS UInt32) AS id, column2 AS first_name, column3 AS last_name
Values: (Int64(1), Utf8("Alan"), Utf8("Turing"))
"#
.trim();
quick_test(sql, plan);
}

#[test]
fn plan_insert_no_target_columns() {
let sql = "INSERT INTO test_decimal VALUES (1, 2), (3, 4)";
let plan = r#"
Dml: op=[Insert] table=[test_decimal]
Projection: CAST(column1 AS Int32) AS id, CAST(column2 AS Decimal128(10, 2)) AS price
Values: (Int64(1), Int64(2)), (Int64(3), Int64(4))
"#
.trim();
quick_test(sql, plan);
}

#[rstest]
#[case::duplicate_columns(
"INSERT INTO test_decimal (id, price, price) VALUES (1, 2, 3), (4, 5, 6)",
"Schema error: Schema contains duplicate unqualified field name 'price'"
)]
#[case::type_mismatch(
"INSERT INTO test_decimal SELECT '2022-01-01', to_timestamp('2022-01-01T12:00:00')",
"Error during planning: Cannot automatically convert Timestamp(Nanosecond, None) to Decimal128(10, 2)"
)]
#[case::target_column_count_mismatch(
"INSERT INTO person (id, first_name, last_name) VALUES ($1, $2)",
"Error during planning: Column count doesn't match insert query!"
)]
#[case::source_column_count_mismatch(
"INSERT INTO person VALUES ($1, $2)",
"Error during planning: Column count doesn't match insert query!"
)]
#[case::extra_placeholder(
"INSERT INTO person (id, first_name, last_name) VALUES ($1, $2, $3, $4)",
"Error during planning: Placeholder $4 refers to a non existent column"
)]
#[case::placeholder_type_unresolved(
"INSERT INTO person (id, first_name, last_name) VALUES ($2, $4, $6)",
"Error during planning: Placeholder type could not be resolved"
)]
#[test]
fn test_insert_schema_errors(#[case] sql: &str, #[case] error: &str) {
let err = logical_plan(sql).unwrap_err();
assert_eq!(err.to_string(), error)
}

#[test]
fn plan_update() {
let sql = "update person set last_name='Kay' where id=1";
Expand Down Expand Up @@ -3443,36 +3486,6 @@ Dml: op=[Insert] table=[person]
prepare_stmt_replace_params_quick_test(plan, param_values, expected_plan);
}

#[test]
#[should_panic(expected = "Placeholder $4 refers to a non existent column")]
fn test_prepare_statement_insert_infer_gt() {
let sql = "insert into person (id, first_name, last_name) values ($1, $2, $3, $4)";

let expected_plan = r#""#.trim();
let expected_dt = "[Int32]";
let _ = prepare_stmt_quick_test(sql, expected_plan, expected_dt);
}

#[test]
#[should_panic(expected = "value: Plan(\"Column count doesn't match insert query!\")")]
fn test_prepare_statement_insert_infer_lt() {
let sql = "insert into person (id, first_name, last_name) values ($1, $2)";

let expected_plan = r#""#.trim();
let expected_dt = "[Int32]";
let _ = prepare_stmt_quick_test(sql, expected_plan, expected_dt);
}

#[test]
#[should_panic(expected = "value: Plan(\"Placeholder type could not be resolved\")")]
fn test_prepare_statement_insert_infer_gap() {
let sql = "insert into person (id, first_name, last_name) values ($2, $4, $6)";

let expected_plan = r#""#.trim();
let expected_dt = "[Int32]";
let _ = prepare_stmt_quick_test(sql, expected_plan, expected_dt);
}

#[test]
fn test_prepare_statement_to_plan_one_param() {
let sql = "PREPARE my_plan(INT) AS SELECT id, age FROM person WHERE age = $1";
Expand Down

0 comments on commit cc6b0e0

Please sign in to comment.