@@ -25,7 +25,7 @@ use std::sync::Arc;
2525use std:: vec;
2626
2727use arrow:: datatypes:: { TimeUnit :: Nanosecond , * } ;
28- use common:: MockContextProvider ;
28+ use common:: { MockContextProvider , variant_storage_type } ;
2929use datafusion_common:: {
3030 DFSchema , DataFusionError , Result , ScalarValue , assert_contains,
3131} ;
@@ -842,6 +842,45 @@ fn plan_insert_does_not_promise_ordinary_target_field_metadata() {
842842 assert ! ( dml. input. schema( ) . field( 0 ) . metadata( ) . is_empty( ) ) ;
843843}
844844
845+ #[ test]
846+ fn plan_insert_converts_tagged_array_to_variant_storage ( ) -> Result < ( ) > {
847+ let state = mock_session_state ( ) . with_scalar_function ( Arc :: new ( make_udf (
848+ "to_variant" ,
849+ vec ! [ DataType :: Utf8 ] ,
850+ variant_storage_type ( ) ,
851+ ) ) ) ;
852+ let plan = logical_plan_from_state (
853+ "INSERT INTO variant_array_target SELECT items FROM untyped_array_source" ,
854+ & SnowflakeDialect { } ,
855+ ParserOptions :: default ( ) ,
856+ state,
857+ ) ?;
858+ assert_contains ! ( plan. display_indent( ) . to_string( ) , "to_variant(" ) ;
859+ let LogicalPlan :: Dml ( dml) = & plan else {
860+ panic ! ( "expected DML plan" ) ;
861+ } ;
862+ assert_eq ! (
863+ dml. input. schema( ) . field( 0 ) . extension_type_name( ) ,
864+ Some ( "arrow.parquet.variant" )
865+ ) ;
866+ Ok ( ( ) )
867+ }
868+
869+ #[ test]
870+ fn plan_insert_does_not_convert_plain_string_to_array ( ) {
871+ let error = logical_plan_from_state (
872+ "INSERT INTO variant_array_target SELECT items FROM plain_string_source" ,
873+ & SnowflakeDialect { } ,
874+ ParserOptions :: default ( ) ,
875+ mock_session_state ( ) ,
876+ )
877+ . unwrap_err ( ) ;
878+ assert_contains ! (
879+ error. to_string( ) ,
880+ "Cannot automatically convert Utf8 to Struct"
881+ ) ;
882+ }
883+
845884#[ rstest]
846885#[ case:: duplicate_columns(
847886 "INSERT INTO test_decimal (id, price, price) VALUES (1, 2, 3), (4, 5, 6)" ,
0 commit comments