From 81b437c690b723f1edf5d09e79fd8a8ace507ba6 Mon Sep 17 00:00:00 2001 From: Jussi Saurio Date: Fri, 3 Oct 2025 23:09:48 +0300 Subject: [PATCH] Don't panic if doing INSERT INTO ... SELECT rowid Closes #3567 --- core/translate/insert.rs | 8 +++++++- testing/insert.test | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/translate/insert.rs b/core/translate/insert.rs index 2740cf2c9..e46a5607d 100644 --- a/core/translate/insert.rs +++ b/core/translate/insert.rs @@ -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() diff --git a/testing/insert.test b/testing/insert.test index 1cd07bb15..4419bcafb 100755 --- a/testing/insert.test +++ b/testing/insert.test @@ -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} \ No newline at end of file