diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 0ee15fd91..61d715b83 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -6412,7 +6412,7 @@ pub fn op_new_rowid( NewRowid { cursor, rowid_reg, - .. + prev_largest_reg, }, insn ); @@ -6455,6 +6455,11 @@ pub fn op_new_rowid( return_if_io!(cursor.rowid()) }; + if *prev_largest_reg > 0 { + state.registers[*prev_largest_reg] = + Register::Value(Value::Integer(current_max.unwrap_or(0))); + } + match current_max { Some(rowid) if rowid < MAX_ROWID => { // Can use sequential diff --git a/testing/autoincr.test b/testing/autoincr.test index cb28e8c5d..9b69b36a2 100755 --- a/testing/autoincr.test +++ b/testing/autoincr.test @@ -174,4 +174,17 @@ do_execsql_test_on_specific_db {:memory:} autoinc-conflict-on-nothing { INSERT INTO t (k) VALUES ('a') ON CONFLICT DO NOTHING; INSERT INTO t (k) VALUES ('b'); SELECT * FROM t ORDER BY id; -} {1|a 2|a 4|b} \ No newline at end of file +} {1|a 2|a 4|b} + +# https://github.com/tursodatabase/turso/issues/3664 +do_execsql_test_on_specific_db {:memory:} autoinc-skips-manually-updated-pk { + CREATE TABLE t(a INTEGER PRIMARY KEY AUTOINCREMENT); + INSERT INTO t DEFAULT VALUES; + select * from sqlite_sequence; + UPDATE t SET a = a + 1; + SELECT * FROM sqlite_sequence; + INSERT INTO t DEFAULT VALUES; + SELECT * FROM sqlite_sequence; +} {t|1 +t|1 +t|3}