@@ -32,6 +32,118 @@ fn duckdb_and_generic() -> TestedDialects {
3232 }
3333}
3434
35+ #[ test]
36+ fn test_struct ( ) {
37+ // s STRUCT(v VARCHAR, i INTEGER)
38+ let struct_type1 = DataType :: Struct (
39+ vec ! [
40+ StructField {
41+ field_name: Some ( Ident :: new( "v" ) ) ,
42+ field_type: DataType :: Varchar ( None ) ,
43+ } ,
44+ StructField {
45+ field_name: Some ( Ident :: new( "i" ) ) ,
46+ field_type: DataType :: Integer ( None ) ,
47+ } ,
48+ ] ,
49+ StructBracketKind :: Parentheses ,
50+ ) ;
51+
52+ // basic struct
53+ let statement = duckdb ( ) . verified_stmt ( r#"CREATE TABLE t1 (s STRUCT(v VARCHAR, i INTEGER))"# ) ;
54+ assert_eq ! (
55+ column_defs( statement) ,
56+ vec![ ColumnDef {
57+ name: "s" . into( ) ,
58+ data_type: struct_type1. clone( ) ,
59+ collation: None ,
60+ options: vec![ ] ,
61+ } ]
62+ ) ;
63+
64+ // struct array
65+ let statement = duckdb ( ) . verified_stmt ( r#"CREATE TABLE t1 (s STRUCT(v VARCHAR, i INTEGER)[])"# ) ;
66+ assert_eq ! (
67+ column_defs( statement) ,
68+ vec![ ColumnDef {
69+ name: "s" . into( ) ,
70+ data_type: DataType :: Array ( ArrayElemTypeDef :: SquareBracket (
71+ Box :: new( struct_type1) ,
72+ None
73+ ) ) ,
74+ collation: None ,
75+ options: vec![ ] ,
76+ } ]
77+ ) ;
78+
79+ // s STRUCT(v VARCHAR, s STRUCT(a1 INTEGER, a2 VARCHAR))
80+ let struct_type2 = DataType :: Struct (
81+ vec ! [
82+ StructField {
83+ field_name: Some ( Ident :: new( "v" ) ) ,
84+ field_type: DataType :: Varchar ( None ) ,
85+ } ,
86+ StructField {
87+ field_name: Some ( Ident :: new( "s" ) ) ,
88+ field_type: DataType :: Struct (
89+ vec![
90+ StructField {
91+ field_name: Some ( Ident :: new( "a1" ) ) ,
92+ field_type: DataType :: Integer ( None ) ,
93+ } ,
94+ StructField {
95+ field_name: Some ( Ident :: new( "a2" ) ) ,
96+ field_type: DataType :: Varchar ( None ) ,
97+ } ,
98+ ] ,
99+ StructBracketKind :: Parentheses ,
100+ ) ,
101+ } ,
102+ ] ,
103+ StructBracketKind :: Parentheses ,
104+ ) ;
105+
106+ // nested struct
107+ let statement = duckdb ( ) . verified_stmt (
108+ r#"CREATE TABLE t1 (s STRUCT(v VARCHAR, s STRUCT(a1 INTEGER, a2 VARCHAR))[])"# ,
109+ ) ;
110+
111+ assert_eq ! (
112+ column_defs( statement) ,
113+ vec![ ColumnDef {
114+ name: "s" . into( ) ,
115+ data_type: DataType :: Array ( ArrayElemTypeDef :: SquareBracket (
116+ Box :: new( struct_type2) ,
117+ None
118+ ) ) ,
119+ collation: None ,
120+ options: vec![ ] ,
121+ } ]
122+ ) ;
123+
124+ // failing test (duckdb does not support bracket syntax)
125+ let sql_list = vec ! [
126+ r#"CREATE TABLE t1 (s STRUCT(v VARCHAR, i INTEGER)))"# ,
127+ r#"CREATE TABLE t1 (s STRUCT(v VARCHAR, i INTEGER>)"# ,
128+ r#"CREATE TABLE t1 (s STRUCT<v VARCHAR, i INTEGER>)"# ,
129+ r#"CREATE TABLE t1 (s STRUCT v VARCHAR, i INTEGER )"# ,
130+ r#"CREATE TABLE t1 (s STRUCT VARCHAR, i INTEGER )"# ,
131+ r#"CREATE TABLE t1 (s STRUCT (VARCHAR, INTEGER))"# ,
132+ ] ;
133+
134+ for sql in sql_list {
135+ duckdb ( ) . parse_sql_statements ( sql) . unwrap_err ( ) ;
136+ }
137+ }
138+
139+ /// Returns the ColumnDefinitions from a CreateTable statement
140+ fn column_defs ( statement : Statement ) -> Vec < ColumnDef > {
141+ match statement {
142+ Statement :: CreateTable ( CreateTable { columns, .. } ) => columns,
143+ _ => panic ! ( "Expected CreateTable" ) ,
144+ }
145+ }
146+
35147#[ test]
36148fn test_select_wildcard_with_exclude ( ) {
37149 let select = duckdb ( ) . verified_only_select ( "SELECT * EXCLUDE (col_a) FROM data" ) ;
0 commit comments