@@ -376,7 +376,9 @@ impl<'a> Binder {
376
376
)
377
377
} )
378
378
. collect ( ) ;
379
- ( DataSchemaRefExt :: create ( fields) , vec ! [ ] )
379
+ let schema = DataSchemaRefExt :: create ( fields) ;
380
+ Self :: validate_create_table_schema ( & schema) ?;
381
+ ( schema, vec ! [ ] )
380
382
}
381
383
( Some ( source) , Some ( query) ) => {
382
384
// e.g. `CREATE TABLE t (i INT) AS SELECT * from old_t` with columns speicified
@@ -396,10 +398,9 @@ impl<'a> Binder {
396
398
. collect ( ) ;
397
399
let source_fields = source_schema. fields ( ) . clone ( ) ;
398
400
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)
403
404
}
404
405
_ => Err ( ErrorCode :: BadArguments (
405
406
"Incorrect CREATE query: required list of column descriptions or AS section or SELECT.." ,
@@ -784,7 +785,9 @@ impl<'a> Binder {
784
785
fields. push ( field) ;
785
786
fields_comments. push ( column. comment . clone ( ) . unwrap_or_default ( ) ) ;
786
787
}
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) )
788
791
}
789
792
CreateTableSource :: Like {
790
793
catalog,
@@ -806,6 +809,22 @@ impl<'a> Binder {
806
809
}
807
810
}
808
811
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
+
809
828
fn insert_table_option_with_validation (
810
829
& self ,
811
830
options : & mut BTreeMap < String , String > ,
0 commit comments