Merge 'Don't allow duplicate columns and get column type as passed ' from Pavan Nambi

fixes #3231
```zsh

❯ sqlite3
SQLite version 3.50.4 2025-07-30 19:33:53
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>   CREATE TABLE t1 (a);
    ALTER TABLE t1 ADD COLUMN a;
Parse error: duplicate column name: a
sqlite>   ALTER TABLE t1 ADD COLUMN name varchar(255);
    SELECT sql FROM sqlite_schema WHERE name = 't1';
CREATE TABLE t1 (a, name varchar(255))
sqlite>
```
```zsh
turso>
turso>  CREATE TABLE t1 (a);
    ALTER TABLE t1 ADD COLUMN a;
  x Parse error: duplicate column name: a

turso>  ALTER TABLE t1 ADD COLUMN name varchar(255);
    SELECT sql FROM sqlite_schema WHERE name = 't1';
┌─────────────────────────────────────────┐
│ sql                                     │
├─────────────────────────────────────────┤
│ CREATE TABLE t1 (a, name varchar (255)) │
└─────────────────────────────────────────┘
turso>
```

Reviewed-by: Pere Diaz Bou <pere-altea@homail.com>

Closes #3249
This commit is contained in:
Jussi Saurio
2025-09-24 09:04:08 +03:00
committed by GitHub
2 changed files with 18 additions and 0 deletions

View File

@@ -207,6 +207,13 @@ pub fn translate_alter_table(
}
}
let new_column_name = column.name.as_ref().unwrap();
if btree.get_column(new_column_name).is_some() {
return Err(LimboError::ParseError(
"duplicate column name: ".to_string() + new_column_name,
));
}
// TODO: All quoted ids will be quoted with `[]`, we should store some info from the parsed AST
btree.columns.push(column.clone());

View File

@@ -133,6 +133,17 @@ do_execsql_test_in_memory_any_error fail-alter-table-drop-unique-column-constrai
ALTER TABLE t DROP b;
}
# refer https://github.com/tursodatabase/turso/issues/3231
do_execsql_test_in_memory_any_error fail-alter-table-add-duplicate-column {
CREATE TABLE t1 (a);
ALTER TABLE t1 ADD COLUMN a;
}
do_execsql_test_in_memory_any_error fail-alter-table-add-duplicate-column-case-insensitive {
CREATE TABLE t1 (a);
ALTER TABLE t1 ADD COLUMN A;
}
do_execsql_test_in_memory_any_error fail-alter-table-drop-primary-key-column {
CREATE TABLE t (a PRIMARY KEY, b);
ALTER TABLE t DROP a;