@@ -5202,3 +5202,40 @@ fn test_external_volume() {
52025202 "Unexpected error: {err}"
52035203 ) ;
52045204}
5205+
5206+ #[ test]
5207+ fn test_structured_object_type ( ) {
5208+ snowflake ( ) . one_statement_parses_to (
5209+ "SELECT payload::OBJECT(tags ARRAY(VARCHAR), address OBJECT(city VARCHAR NOT NULL)) FROM t" ,
5210+ "SELECT payload::OBJECT(tags Array(VARCHAR), address OBJECT(city VARCHAR NOT NULL)) FROM t" ,
5211+ ) ;
5212+
5213+ let select = snowflake ( ) . verified_only_select (
5214+ "SELECT CAST(payload AS OBJECT(city VARCHAR, zip NUMBER NOT NULL)) FROM t" ,
5215+ ) ;
5216+ let Expr :: Cast { data_type, .. } = expr_from_projection ( only ( & select. projection ) ) else {
5217+ unreachable ! ( ) ;
5218+ } ;
5219+ let DataType :: Object ( fields) = data_type else {
5220+ unreachable ! ( ) ;
5221+ } ;
5222+ assert_eq ! ( fields. len( ) , 2 ) ;
5223+ assert_eq ! ( fields[ 0 ] . name, Ident :: new( "city" ) ) ;
5224+ assert ! ( fields[ 0 ] . options. is_empty( ) ) ;
5225+ assert_eq ! ( fields[ 1 ] . name, Ident :: new( "zip" ) ) ;
5226+ assert_eq ! ( fields[ 1 ] . options. len( ) , 1 ) ;
5227+ assert_eq ! ( fields[ 1 ] . options[ 0 ] . option, ColumnOption :: NotNull ) ;
5228+
5229+ snowflake ( ) . verified_stmt ( "CREATE TABLE t (o OBJECT)" ) ;
5230+ }
5231+
5232+ #[ test]
5233+ fn test_structured_object_type_errors ( ) {
5234+ for sql in [
5235+ "CREATE TABLE t (o OBJECT(VARCHAR))" ,
5236+ "CREATE TABLE t (o OBJECT(city VARCHAR NULL))" ,
5237+ "CREATE TABLE t (o OBJECT(city VARCHAR)" ,
5238+ ] {
5239+ assert ! ( snowflake( ) . parse_sql_statements( sql) . is_err( ) , "{sql}" ) ;
5240+ }
5241+ }
0 commit comments