Don't panic if doing INSERT INTO ... SELECT rowid

Closes #3567
This commit is contained in:
Jussi Saurio
2025-10-03 23:09:48 +03:00
parent 1b42f77300
commit 81b437c690
2 changed files with 28 additions and 1 deletions

View File

@@ -8,7 +8,7 @@ use turso_parser::ast::{
use crate::error::{
SQLITE_CONSTRAINT_NOTNULL, SQLITE_CONSTRAINT_PRIMARYKEY, SQLITE_CONSTRAINT_UNIQUE,
};
use crate::schema::{self, Index, Table};
use crate::schema::{self, Affinity, Index, Table};
use crate::translate::emitter::{
emit_cdc_insns, emit_cdc_patch_record, prepare_cdc_if_necessary, OperationMode,
};
@@ -322,6 +322,12 @@ pub fn translate_insert(
.iter()
.map(|col_name| {
let column_name = normalize_ident(col_name.as_str());
if ROWID_STRS
.iter()
.any(|s| s.eq_ignore_ascii_case(&column_name))
{
return Affinity::Integer.aff_mask();
}
table
.get_column_by_name(&column_name)
.unwrap()

View File

@@ -658,3 +658,24 @@ do_execsql_test_on_specific_db {:memory:} insert-select-nested-subquery {
SELECT * FROM t;
} {1
1}
# Regression test for: https://github.com/tursodatabase/turso/issues/3567 (used to panic, now returns unique constraint error)
do_execsql_test_in_memory_any_error insert-rowid-select-rowid {
CREATE TABLE t(a);
INSERT INTO t VALUES (1);
INSERT INTO t(rowid) SELECT rowid FROM t;
}
do_execsql_test_in_memory_any_error insert-rowidalias-select-rowid {
CREATE TABLE t(a INTEGER PRIMARY KEY);
INSERT INTO t VALUES (1);
INSERT INTO t(a) SELECT rowid FROM t;
}
do_execsql_test_on_specific_db {:memory:} insert-rowid-select-rowid-success {
CREATE TABLE t(a);
INSERT INTO t VALUES (2);
INSERT INTO t(a) SELECT rowid FROM t;
SELECT * FROM t;
} {2
1}