Skip to content

Commit b14a0c7

Browse files
authored
Merge branch 'main' into limit_fix_test
2 parents 15b55b9 + 3af1e5b commit b14a0c7

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

src/query/service/src/sql/planner/binder/ddl/table.rs

+25-6
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,9 @@ impl<'a> Binder {
376376
)
377377
})
378378
.collect();
379-
(DataSchemaRefExt::create(fields), vec![])
379+
let schema = DataSchemaRefExt::create(fields);
380+
Self::validate_create_table_schema(&schema)?;
381+
(schema, vec![])
380382
}
381383
(Some(source), Some(query)) => {
382384
// e.g. `CREATE TABLE t (i INT) AS SELECT * from old_t` with columns speicified
@@ -396,10 +398,9 @@ impl<'a> Binder {
396398
.collect();
397399
let source_fields = source_schema.fields().clone();
398400
let source_fields = self.concat_fields(source_fields, query_fields);
399-
(
400-
DataSchemaRefExt::create(source_fields.to_vec()),
401-
source_coments,
402-
)
401+
let schema = DataSchemaRefExt::create(source_fields);
402+
Self::validate_create_table_schema(&schema)?;
403+
(schema, source_coments)
403404
}
404405
_ => Err(ErrorCode::BadArguments(
405406
"Incorrect CREATE query: required list of column descriptions or AS section or SELECT..",
@@ -784,7 +785,9 @@ impl<'a> Binder {
784785
fields.push(field);
785786
fields_comments.push(column.comment.clone().unwrap_or_default());
786787
}
787-
Ok((DataSchemaRefExt::create(fields), fields_comments))
788+
let schema = DataSchemaRefExt::create(fields);
789+
Self::validate_create_table_schema(&schema)?;
790+
Ok((schema, fields_comments))
788791
}
789792
CreateTableSource::Like {
790793
catalog,
@@ -806,6 +809,22 @@ impl<'a> Binder {
806809
}
807810
}
808811

812+
/// Validate the schema of the table to be created.
813+
fn validate_create_table_schema(schema: &DataSchemaRef) -> Result<()> {
814+
// Check if there are duplicated column names
815+
let mut name_set = HashSet::new();
816+
for field in schema.fields() {
817+
if !name_set.insert(field.name().clone()) {
818+
return Err(ErrorCode::BadArguments(format!(
819+
"Duplicated column name: {}",
820+
field.name()
821+
)));
822+
}
823+
}
824+
825+
Ok(())
826+
}
827+
809828
fn insert_table_option_with_validation(
810829
&self,
811830
options: &mut BTreeMap<String, String>,

tests/logictest/suites/base/05_ddl/05_0000_ddl_create_tables

+14
Original file line numberDiff line numberDiff line change
@@ -218,3 +218,17 @@ DROP DATABASE db2;
218218
statement error 1002
219219
CREATE TABLE system.test(a INT);
220220

221+
statement ok
222+
drop table if exists t;
223+
224+
statement error Duplicated column name
225+
create table t(a int, a int);
226+
227+
statement error Duplicated column name
228+
create table t(a int, A int);
229+
230+
statement error Duplicated column name
231+
create table t("A" int, "A" int);
232+
233+
statement error Duplicated column name
234+
create table t as select number, number from numbers(1);

0 commit comments

Comments
 (0)