@@ -3516,20 +3516,312 @@ fn test_table_sample() {
35163516}
35173517
35183518#[ test]
3519- fn test_subquery_sample ( ) {
3520- // Test SAMPLE clause on subqueries (derived tables)
3521- snowflake_and_generic ( ) . verified_stmt ( "SELECT * FROM (SELECT * FROM mytable) SAMPLE (10)" ) ;
3522- snowflake_and_generic ( )
3523- . verified_stmt ( "SELECT * FROM (SELECT * FROM mytable) SAMPLE (10000 ROWS)" ) ;
3524- snowflake_and_generic ( )
3525- . verified_stmt ( "SELECT * FROM (SELECT * FROM mytable) AS t SAMPLE (50 PERCENT)" ) ;
3526- // Nested subquery with SAMPLE
3527- snowflake_and_generic ( ) . verified_stmt (
3528- "SELECT * FROM (SELECT * FROM (SELECT report_from FROM mytable) SAMPLE (10000 ROWS)) AS anon_1" ,
3519+ fn test_multi_table_insert_unconditional ( ) {
3520+ // Basic unconditional multi-table insert
3521+ // See: https://docs.snowflake.com/en/sql-reference/sql/insert-multi-table
3522+ snowflake ( ) . verified_stmt ( "INSERT ALL INTO t1 SELECT n1, n2, n3 FROM src" ) ;
3523+
3524+ // Multiple INTO clauses
3525+ snowflake ( ) . verified_stmt ( "INSERT ALL INTO t1 INTO t2 SELECT n1, n2, n3 FROM src" ) ;
3526+
3527+ // With column list
3528+ snowflake ( ) . verified_stmt ( "INSERT ALL INTO t1 (c1, c2, c3) SELECT n1, n2, n3 FROM src" ) ;
3529+
3530+ // With VALUES clause
3531+ snowflake ( )
3532+ . verified_stmt ( "INSERT ALL INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT) SELECT n1, n2, n3 FROM src" ) ;
3533+
3534+ // Complex example from Snowflake docs
3535+ snowflake ( ) . verified_stmt (
3536+ "INSERT ALL INTO t1 INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT) INTO t2 (c1, c2, c3) INTO t2 VALUES (n3, n2, n1) SELECT n1, n2, n3 FROM src"
35293537 ) ;
3530- // SAMPLE with SEED on subquery
3531- snowflake_and_generic ( )
3532- . verified_stmt ( "SELECT * FROM (SELECT * FROM mytable) SAMPLE (10) SEED (42)" ) ;
3538+
3539+ // With OVERWRITE
3540+ snowflake ( ) . verified_stmt ( "INSERT OVERWRITE ALL INTO t1 INTO t2 SELECT n1, n2, n3 FROM src" ) ;
3541+ }
3542+
3543+ #[ test]
3544+ fn test_multi_table_insert_conditional ( ) {
3545+ // Basic conditional multi-table insert with WHEN clause
3546+ // See: https://docs.snowflake.com/en/sql-reference/sql/insert-multi-table
3547+ snowflake ( ) . verified_stmt (
3548+ "INSERT ALL WHEN n1 > 100 THEN INTO t1 SELECT n1 FROM src"
3549+ ) ;
3550+
3551+ // Multiple WHEN clauses
3552+ snowflake ( ) . verified_stmt (
3553+ "INSERT ALL WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t2 SELECT n1 FROM src"
3554+ ) ;
3555+
3556+ // WHEN with multiple INTO clauses
3557+ snowflake ( ) . verified_stmt (
3558+ "INSERT ALL WHEN n1 > 10 THEN INTO t1 INTO t2 SELECT n1 FROM src"
3559+ ) ;
3560+
3561+ // With ELSE clause
3562+ snowflake ( ) . verified_stmt (
3563+ "INSERT ALL WHEN n1 > 100 THEN INTO t1 ELSE INTO t2 SELECT n1 FROM src"
3564+ ) ;
3565+
3566+ // Complex conditional insert from Snowflake docs
3567+ snowflake ( ) . verified_stmt (
3568+ "INSERT ALL WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t1 INTO t2 ELSE INTO t2 SELECT n1 FROM src"
3569+ ) ;
3570+
3571+ // INSERT FIRST - only first matching WHEN clause executes
3572+ snowflake ( ) . verified_stmt (
3573+ "INSERT FIRST WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t1 INTO t2 ELSE INTO t2 SELECT n1 FROM src"
3574+ ) ;
3575+
3576+ // With OVERWRITE
3577+ snowflake ( ) . verified_stmt (
3578+ "INSERT OVERWRITE ALL WHEN n1 > 100 THEN INTO t1 ELSE INTO t2 SELECT n1 FROM src"
3579+ ) ;
3580+
3581+ // WHEN with always-true condition
3582+ snowflake ( ) . verified_stmt (
3583+ "INSERT ALL WHEN 1 = 1 THEN INTO t1 SELECT n1 FROM src"
3584+ ) ;
3585+ }
3586+
3587+ #[ test]
3588+ fn test_multi_table_insert_with_values ( ) {
3589+ // INTO clause with VALUES using column references
3590+ snowflake ( ) . verified_stmt (
3591+ "INSERT ALL INTO t1 VALUES (n1, n2) SELECT n1, n2 FROM src"
3592+ ) ;
3593+
3594+ // INTO clause with VALUES using DEFAULT
3595+ snowflake ( ) . verified_stmt (
3596+ "INSERT ALL INTO t1 (c1, c2, c3) VALUES (n1, n2, DEFAULT) SELECT n1, n2 FROM src"
3597+ ) ;
3598+
3599+ // INTO clause with VALUES using NULL
3600+ snowflake ( ) . verified_stmt (
3601+ "INSERT ALL INTO t1 (c1, c2, c3) VALUES (n1, NULL, n2) SELECT n1, n2 FROM src"
3602+ ) ;
3603+
3604+ // Positional alias in VALUES
3605+ snowflake ( ) . verified_stmt (
3606+ "INSERT ALL INTO t1 VALUES ($1, $2) SELECT 1, 50 AS an_alias"
3607+ ) ;
3608+ }
3609+
3610+ /// Unit tests for multi-table INSERT AST structure validation
3611+ #[ test]
3612+ fn test_multi_table_insert_ast_unconditional ( ) {
3613+ // Test basic unconditional multi-table insert AST
3614+ let sql = "INSERT ALL INTO t1 INTO t2 (c1, c2) SELECT n1, n2 FROM src" ;
3615+ let stmt = snowflake ( ) . verified_stmt ( sql) ;
3616+
3617+ match stmt {
3618+ Statement :: Insert ( Insert {
3619+ insert_first,
3620+ overwrite,
3621+ multi_table_into_clauses,
3622+ multi_table_when_clauses,
3623+ multi_table_else_clause,
3624+ source,
3625+ ..
3626+ } ) => {
3627+ // Should be INSERT ALL (not FIRST)
3628+ assert ! ( !insert_first) ;
3629+ assert ! ( !overwrite) ;
3630+
3631+ // Should have 2 INTO clauses
3632+ assert_eq ! ( multi_table_into_clauses. len( ) , 2 ) ;
3633+
3634+ // First INTO clause: INTO t1
3635+ assert_eq ! ( multi_table_into_clauses[ 0 ] . table_name. to_string( ) , "t1" ) ;
3636+ assert ! ( multi_table_into_clauses[ 0 ] . columns. is_empty( ) ) ;
3637+ assert ! ( multi_table_into_clauses[ 0 ] . values. is_none( ) ) ;
3638+
3639+ // Second INTO clause: INTO t2 (c1, c2)
3640+ assert_eq ! ( multi_table_into_clauses[ 1 ] . table_name. to_string( ) , "t2" ) ;
3641+ assert_eq ! ( multi_table_into_clauses[ 1 ] . columns. len( ) , 2 ) ;
3642+ assert_eq ! ( multi_table_into_clauses[ 1 ] . columns[ 0 ] . to_string( ) , "c1" ) ;
3643+ assert_eq ! ( multi_table_into_clauses[ 1 ] . columns[ 1 ] . to_string( ) , "c2" ) ;
3644+ assert ! ( multi_table_into_clauses[ 1 ] . values. is_none( ) ) ;
3645+
3646+ // No WHEN clauses for unconditional insert
3647+ assert ! ( multi_table_when_clauses. is_empty( ) ) ;
3648+ assert ! ( multi_table_else_clause. is_none( ) ) ;
3649+
3650+ // Should have source query
3651+ assert ! ( source. is_some( ) ) ;
3652+ }
3653+ _ => panic ! ( "Expected INSERT statement" ) ,
3654+ }
3655+ }
3656+
3657+ #[ test]
3658+ fn test_multi_table_insert_ast_with_values ( ) {
3659+ // Test INTO clause with VALUES
3660+ let sql = "INSERT ALL INTO t1 (c1, c2, c3) VALUES (n1, n2, DEFAULT) SELECT n1, n2 FROM src" ;
3661+ let stmt = snowflake ( ) . verified_stmt ( sql) ;
3662+
3663+ match stmt {
3664+ Statement :: Insert ( Insert {
3665+ multi_table_into_clauses,
3666+ ..
3667+ } ) => {
3668+ assert_eq ! ( multi_table_into_clauses. len( ) , 1 ) ;
3669+
3670+ let into_clause = & multi_table_into_clauses[ 0 ] ;
3671+ assert_eq ! ( into_clause. table_name. to_string( ) , "t1" ) ;
3672+ assert_eq ! ( into_clause. columns. len( ) , 3 ) ;
3673+
3674+ // Check VALUES clause
3675+ let values = into_clause. values . as_ref ( ) . expect ( "Expected VALUES clause" ) ;
3676+ assert_eq ! ( values. values. len( ) , 3 ) ;
3677+
3678+ // First value: n1 (expression)
3679+ match & values. values [ 0 ] {
3680+ MultiTableInsertValue :: Expr ( expr) => {
3681+ assert_eq ! ( expr. to_string( ) , "n1" ) ;
3682+ }
3683+ _ => panic ! ( "Expected Expr" ) ,
3684+ }
3685+
3686+ // Second value: n2 (expression)
3687+ match & values. values [ 1 ] {
3688+ MultiTableInsertValue :: Expr ( expr) => {
3689+ assert_eq ! ( expr. to_string( ) , "n2" ) ;
3690+ }
3691+ _ => panic ! ( "Expected Expr" ) ,
3692+ }
3693+
3694+ // Third value: DEFAULT
3695+ match & values. values [ 2 ] {
3696+ MultiTableInsertValue :: Default => { }
3697+ _ => panic ! ( "Expected DEFAULT" ) ,
3698+ }
3699+ }
3700+ _ => panic ! ( "Expected INSERT statement" ) ,
3701+ }
3702+ }
3703+
3704+ #[ test]
3705+ fn test_multi_table_insert_ast_conditional ( ) {
3706+ // Test conditional multi-table insert with WHEN clauses
3707+ let sql = "INSERT ALL WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t2 INTO t3 ELSE INTO t4 SELECT n1 FROM src" ;
3708+ let stmt = snowflake ( ) . verified_stmt ( sql) ;
3709+
3710+ match stmt {
3711+ Statement :: Insert ( Insert {
3712+ insert_first,
3713+ multi_table_into_clauses,
3714+ multi_table_when_clauses,
3715+ multi_table_else_clause,
3716+ ..
3717+ } ) => {
3718+ // Should be INSERT ALL (not FIRST)
3719+ assert ! ( !insert_first) ;
3720+
3721+ // Unconditional INTO clauses should be empty for conditional insert
3722+ assert ! ( multi_table_into_clauses. is_empty( ) ) ;
3723+
3724+ // Should have 2 WHEN clauses
3725+ assert_eq ! ( multi_table_when_clauses. len( ) , 2 ) ;
3726+
3727+ // First WHEN clause: WHEN n1 > 100 THEN INTO t1
3728+ assert_eq ! ( multi_table_when_clauses[ 0 ] . condition. to_string( ) , "n1 > 100" ) ;
3729+ assert_eq ! ( multi_table_when_clauses[ 0 ] . into_clauses. len( ) , 1 ) ;
3730+ assert_eq ! ( multi_table_when_clauses[ 0 ] . into_clauses[ 0 ] . table_name. to_string( ) , "t1" ) ;
3731+
3732+ // Second WHEN clause: WHEN n1 > 10 THEN INTO t2 INTO t3
3733+ assert_eq ! ( multi_table_when_clauses[ 1 ] . condition. to_string( ) , "n1 > 10" ) ;
3734+ assert_eq ! ( multi_table_when_clauses[ 1 ] . into_clauses. len( ) , 2 ) ;
3735+ assert_eq ! ( multi_table_when_clauses[ 1 ] . into_clauses[ 0 ] . table_name. to_string( ) , "t2" ) ;
3736+ assert_eq ! ( multi_table_when_clauses[ 1 ] . into_clauses[ 1 ] . table_name. to_string( ) , "t3" ) ;
3737+
3738+ // ELSE clause: ELSE INTO t4
3739+ let else_clause = multi_table_else_clause. expect ( "Expected ELSE clause" ) ;
3740+ assert_eq ! ( else_clause. len( ) , 1 ) ;
3741+ assert_eq ! ( else_clause[ 0 ] . table_name. to_string( ) , "t4" ) ;
3742+ }
3743+ _ => panic ! ( "Expected INSERT statement" ) ,
3744+ }
3745+ }
3746+
3747+ #[ test]
3748+ fn test_multi_table_insert_ast_first ( ) {
3749+ // Test INSERT FIRST vs INSERT ALL
3750+ let sql = "INSERT FIRST WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t2 SELECT n1 FROM src" ;
3751+ let stmt = snowflake ( ) . verified_stmt ( sql) ;
3752+
3753+ match stmt {
3754+ Statement :: Insert ( Insert {
3755+ insert_first,
3756+ multi_table_when_clauses,
3757+ ..
3758+ } ) => {
3759+ // Should be INSERT FIRST
3760+ assert ! ( insert_first) ;
3761+ assert_eq ! ( multi_table_when_clauses. len( ) , 2 ) ;
3762+ }
3763+ _ => panic ! ( "Expected INSERT statement" ) ,
3764+ }
3765+ }
3766+
3767+ #[ test]
3768+ fn test_multi_table_insert_ast_overwrite ( ) {
3769+ // Test INSERT OVERWRITE ALL
3770+ let sql = "INSERT OVERWRITE ALL INTO t1 INTO t2 SELECT n1 FROM src" ;
3771+ let stmt = snowflake ( ) . verified_stmt ( sql) ;
3772+
3773+ match stmt {
3774+ Statement :: Insert ( Insert {
3775+ overwrite,
3776+ insert_first,
3777+ multi_table_into_clauses,
3778+ ..
3779+ } ) => {
3780+ assert ! ( overwrite) ;
3781+ assert ! ( !insert_first) ;
3782+ assert_eq ! ( multi_table_into_clauses. len( ) , 2 ) ;
3783+ }
3784+ _ => panic ! ( "Expected INSERT statement" ) ,
3785+ }
3786+ }
3787+
3788+ #[ test]
3789+ fn test_multi_table_insert_ast_complex_values ( ) {
3790+ // Test complex VALUES with expressions
3791+ let sql = "INSERT ALL INTO t1 VALUES (n1 + n2, n3 * 2, DEFAULT) SELECT n1, n2, n3 FROM src" ;
3792+ let stmt = snowflake ( ) . verified_stmt ( sql) ;
3793+
3794+ match stmt {
3795+ Statement :: Insert ( Insert {
3796+ multi_table_into_clauses,
3797+ ..
3798+ } ) => {
3799+ assert_eq ! ( multi_table_into_clauses. len( ) , 1 ) ;
3800+
3801+ let values = multi_table_into_clauses[ 0 ] . values . as_ref ( ) . expect ( "Expected VALUES" ) ;
3802+ assert_eq ! ( values. values. len( ) , 3 ) ;
3803+
3804+ // First value: n1 + n2 (binary expression)
3805+ match & values. values [ 0 ] {
3806+ MultiTableInsertValue :: Expr ( Expr :: BinaryOp { op, .. } ) => {
3807+ assert_eq ! ( * op, BinaryOperator :: Plus ) ;
3808+ }
3809+ _ => panic ! ( "Expected BinaryOp expression" ) ,
3810+ }
3811+
3812+ // Second value: n3 * 2 (binary expression)
3813+ match & values. values [ 1 ] {
3814+ MultiTableInsertValue :: Expr ( Expr :: BinaryOp { op, .. } ) => {
3815+ assert_eq ! ( * op, BinaryOperator :: Multiply ) ;
3816+ }
3817+ _ => panic ! ( "Expected BinaryOp expression" ) ,
3818+ }
3819+
3820+ // Third value: DEFAULT
3821+ assert ! ( matches!( & values. values[ 2 ] , MultiTableInsertValue :: Default ) ) ;
3822+ }
3823+ _ => panic ! ( "Expected INSERT statement" ) ,
3824+ }
35333825}
35343826
35353827#[ test]
0 commit comments