mirror of
https://github.com/aljazceru/turso.git
synced 2026-01-13 21:24:19 +01:00
Merge 'Fix error handling on provided insert column count mismatch' from Jussi Saurio
Closes #3875 Closes #3907
This commit is contained in:
@@ -1059,6 +1059,20 @@ fn init_source_emission<'a>(
|
||||
body: InsertBody,
|
||||
columns: &'a [ast::Name],
|
||||
) -> Result<ProgramBuilder> {
|
||||
let required_column_count = if columns.is_empty() {
|
||||
table.columns().len()
|
||||
} else {
|
||||
columns.len()
|
||||
};
|
||||
if !values.is_empty() {
|
||||
// If we had a single tuple in VALUES, it was inserted into the values vector parameter.
|
||||
if values.len() != required_column_count {
|
||||
crate::bail_parse_error!(
|
||||
"{} values for {required_column_count} columns",
|
||||
values.len()
|
||||
);
|
||||
}
|
||||
}
|
||||
let (num_values, cursor_id) = match body {
|
||||
InsertBody::Select(select, _) => {
|
||||
// Simple common case of INSERT INTO <table> VALUES (...) without compounds.
|
||||
@@ -1088,6 +1102,12 @@ fn init_source_emission<'a>(
|
||||
program.incr_nesting();
|
||||
let result =
|
||||
translate_select(select, resolver, program, query_destination, connection)?;
|
||||
if result.num_result_cols != required_column_count {
|
||||
crate::bail_parse_error!(
|
||||
"{} values for {required_column_count} columns",
|
||||
result.num_result_cols,
|
||||
);
|
||||
}
|
||||
program = result.program;
|
||||
program.decr_nesting();
|
||||
|
||||
|
||||
@@ -798,3 +798,70 @@ do_execsql_test_on_specific_db {:memory:} ignore-intra-statement-dups {
|
||||
SELECT a,b FROM t ORDER BY a;
|
||||
} {5|first
|
||||
6|x}
|
||||
|
||||
# Tests for incorrect provided column count
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-values-too-few {
|
||||
CREATE TABLE t(a, b, c);
|
||||
INSERT INTO t VALUES (1, 2);
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-values-too-many {
|
||||
CREATE TABLE t(a, b);
|
||||
INSERT INTO t VALUES (1, 2, 3);
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-values-specified-columns-too-few {
|
||||
CREATE TABLE t(a, b, c);
|
||||
INSERT INTO t(a, b, c) VALUES (1, 2);
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-values-specified-columns-too-many {
|
||||
CREATE TABLE t(a, b);
|
||||
INSERT INTO t(a, b) VALUES (1, 2, 3);
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-select-named-too-few {
|
||||
CREATE TABLE src(x, y);
|
||||
INSERT INTO src VALUES (1, 2);
|
||||
CREATE TABLE dst(a, b, c);
|
||||
INSERT INTO dst SELECT x, y FROM src;
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-select-named-too-many {
|
||||
CREATE TABLE src(x, y, z);
|
||||
INSERT INTO src VALUES (1, 2, 3);
|
||||
CREATE TABLE dst(a, b);
|
||||
INSERT INTO dst SELECT x, y, z FROM src;
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-select-star-too-few {
|
||||
CREATE TABLE src(x, y);
|
||||
INSERT INTO src VALUES (1, 2);
|
||||
CREATE TABLE dst(a, b, c);
|
||||
INSERT INTO dst SELECT * FROM src;
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-select-star-too-many {
|
||||
CREATE TABLE src(x, y, z);
|
||||
INSERT INTO src VALUES (1, 2, 3);
|
||||
CREATE TABLE dst(a, b);
|
||||
INSERT INTO dst SELECT * FROM src;
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-specified-columns-select-mismatch {
|
||||
CREATE TABLE src(x, y, z);
|
||||
INSERT INTO src VALUES (1, 2, 3);
|
||||
CREATE TABLE dst(a, b, c, d);
|
||||
INSERT INTO dst(a, b) SELECT x, y, z FROM src;
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-partial-columns-values-too-few {
|
||||
CREATE TABLE t(a, b, c);
|
||||
INSERT INTO t(b, c) VALUES (2);
|
||||
}
|
||||
|
||||
do_execsql_test_in_memory_any_error wrong-column-count-partial-columns-values-too-many {
|
||||
CREATE TABLE t(a, b, c);
|
||||
INSERT INTO t(a) VALUES (1, 2);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user