diff --git a/core/translate/schema.rs b/core/translate/schema.rs index f7fde9f51..ce8f40f7f 100644 --- a/core/translate/schema.rs +++ b/core/translate/schema.rs @@ -40,15 +40,16 @@ pub fn translate_create_table( bail_parse_error!("TEMPORARY table not supported yet"); } - // maybe we can do better than this. if let ast::CreateTableBody::ColumnsAndConstraints { columns, .. } = &body { - for i in 0..columns.len() { - let name1 = normalize_ident(columns[i].col_name.as_str()); - for j in (i + 1)..columns.len() { - let name2 = normalize_ident(columns[j].col_name.as_str()); - if name1 == name2 { - bail_parse_error!("duplicate column name: {}", columns[i].col_name.as_str()); - } + let mut indexes = (0..columns.len()).collect::>(); + + indexes.sort_unstable_by_key(|&i| normalize_ident(columns[i].col_name.as_str())); + + for w in indexes.windows(2) { + let name1 = normalize_ident(columns[w[0]].col_name.as_str()); + let name2 = normalize_ident(columns[w[1]].col_name.as_str()); + if name1 == name2 { + bail_parse_error!("duplicate column name: {}", columns[w[0]].col_name.as_str()); } } } diff --git a/testing/create_table.test b/testing/create_table.test index e961c017f..289e0e98f 100755 --- a/testing/create_table.test +++ b/testing/create_table.test @@ -57,4 +57,12 @@ do_execsql_test_on_specific_db {:memory:} col-named-rowid { # https://github.com/tursodatabase/turso/issues/3637 do_execsql_test_in_memory_any_error create_table_duplicate_column_names { CREATE TABLE t(a, a); -} \ No newline at end of file +} + +do_execsql_test_in_memory_any_error create_table_duplicate_column_names_case_insensitive { + CREATE TABLE t(A, a); +} + +do_execsql_test_in_memory_any_error create_table_duplicate_column_names_quoted { + CREATE TABLE t("a", a); +}