@@ -425,3 +425,171 @@ fn load_dump_with_invalid_sql() {
425425
426426 sim. run ( ) . unwrap ( ) ;
427427}
428+
429+ #[ test]
430+ fn load_dump_with_trigger ( ) {
431+ const DUMP : & str = r#"
432+ BEGIN TRANSACTION;
433+ CREATE TABLE test (x);
434+ CREATE TRIGGER simple_trigger
435+ AFTER INSERT ON test
436+ BEGIN
437+ INSERT INTO test VALUES (999);
438+ END;
439+ INSERT INTO test VALUES (1);
440+ COMMIT;"# ;
441+
442+ let mut sim = Builder :: new ( )
443+ . simulation_duration ( Duration :: from_secs ( 1000 ) )
444+ . build ( ) ;
445+ let tmp = tempdir ( ) . unwrap ( ) ;
446+ let tmp_path = tmp. path ( ) . to_path_buf ( ) ;
447+
448+ std:: fs:: write ( tmp_path. join ( "dump.sql" ) , DUMP ) . unwrap ( ) ;
449+
450+ make_primary ( & mut sim, tmp. path ( ) . to_path_buf ( ) ) ;
451+
452+ sim. client ( "client" , async move {
453+ let client = Client :: new ( ) ;
454+
455+ let resp = client
456+ . post (
457+ "http://primary:9090/v1/namespaces/debug_test/create" ,
458+ json ! ( { "dump_url" : format!( "file:{}" , tmp_path. join( "dump.sql" ) . display( ) ) } ) ,
459+ )
460+ . await
461+ . unwrap ( ) ;
462+ assert_eq ! ( resp. status( ) , StatusCode :: OK ) ;
463+
464+ let db = Database :: open_remote_with_connector ( "http://debug_test.primary:8080" , "" , TurmoilConnector ) ?;
465+ let conn = db. connect ( ) ?;
466+
467+ // Original INSERT: 1, Trigger INSERT: 999 = 2 total rows
468+ let mut rows = conn. query ( "SELECT COUNT(*) FROM test" , ( ) ) . await ?;
469+ let row = rows. next ( ) . await ?. unwrap ( ) ;
470+ assert_eq ! ( row. get:: <i64 >( 0 ) ?, 2 ) ;
471+
472+ Ok ( ( ) )
473+ } ) ;
474+
475+ sim. run ( ) . unwrap ( ) ;
476+ }
477+
478+ #[ test]
479+ fn load_dump_with_case_trigger ( ) {
480+ const DUMP : & str = r#"
481+ BEGIN TRANSACTION;
482+ CREATE TABLE test (id INTEGER, rate REAL DEFAULT 0.0);
483+ CREATE TRIGGER case_trigger
484+ AFTER INSERT ON test
485+ BEGIN
486+ UPDATE test
487+ SET rate =
488+ CASE
489+ WHEN NEW.id = 1
490+ THEN 0.1
491+ ELSE 0.0
492+ END
493+ WHERE id = NEW.id;
494+ END;
495+
496+ INSERT INTO test (id) VALUES (1);
497+ COMMIT;"# ;
498+
499+ let mut sim = Builder :: new ( )
500+ . simulation_duration ( Duration :: from_secs ( 1000 ) )
501+ . build ( ) ;
502+ let tmp = tempdir ( ) . unwrap ( ) ;
503+ let tmp_path = tmp. path ( ) . to_path_buf ( ) ;
504+
505+ std:: fs:: write ( tmp_path. join ( "dump.sql" ) , DUMP ) . unwrap ( ) ;
506+
507+ make_primary ( & mut sim, tmp. path ( ) . to_path_buf ( ) ) ;
508+
509+ sim. client ( "client" , async move {
510+ let client = Client :: new ( ) ;
511+
512+ let resp = client
513+ . post (
514+ "http://primary:9090/v1/namespaces/case_test/create" ,
515+ json ! ( { "dump_url" : format!( "file:{}" , tmp_path. join( "dump.sql" ) . display( ) ) } ) ,
516+ )
517+ . await
518+ . unwrap ( ) ;
519+ assert_eq ! ( resp. status( ) , StatusCode :: OK ) ;
520+
521+ let db = Database :: open_remote_with_connector ( "http://case_test.primary:8080" , "" , TurmoilConnector ) ?;
522+ let conn = db. connect ( ) ?;
523+
524+ let mut rows = conn. query ( "SELECT id, rate FROM test" , ( ) ) . await ?;
525+ let row = rows. next ( ) . await ?. unwrap ( ) ;
526+ assert_eq ! ( row. get:: <i64 >( 0 ) ?, 1 ) ;
527+ assert ! ( ( row. get:: <f64 >( 1 ) ? - 0.1 ) . abs( ) < 0.001 ) ;
528+
529+ Ok ( ( ) )
530+ } ) ;
531+
532+ sim. run ( ) . unwrap ( ) ;
533+ }
534+
535+ #[ test]
536+ fn load_dump_with_nested_case ( ) {
537+ const DUMP : & str = r#"
538+ BEGIN TRANSACTION;
539+ CREATE TABLE orders (id INTEGER, amount REAL, status TEXT);
540+ CREATE TRIGGER nested_trigger
541+ AFTER UPDATE ON orders
542+ BEGIN
543+ UPDATE orders
544+ SET amount =
545+ CASE
546+ WHEN NEW.status = 'completed'
547+ THEN
548+ CASE
549+ WHEN OLD.id = 1
550+ THEN OLD.amount * 0.9
551+ ELSE OLD.amount * 0.8
552+ END
553+ ELSE OLD.amount
554+ END
555+ WHERE id = NEW.id;
556+ END;
557+
558+ INSERT INTO orders (id, amount, status) VALUES (1, 100.0, 'pending');
559+ COMMIT;"# ;
560+
561+ let mut sim = Builder :: new ( )
562+ . simulation_duration ( Duration :: from_secs ( 1000 ) )
563+ . build ( ) ;
564+ let tmp = tempdir ( ) . unwrap ( ) ;
565+ let tmp_path = tmp. path ( ) . to_path_buf ( ) ;
566+
567+ std:: fs:: write ( tmp_path. join ( "dump.sql" ) , DUMP ) . unwrap ( ) ;
568+
569+ make_primary ( & mut sim, tmp. path ( ) . to_path_buf ( ) ) ;
570+
571+ sim. client ( "client" , async move {
572+ let client = Client :: new ( ) ;
573+
574+ let resp = client
575+ . post (
576+ "http://primary:9090/v1/namespaces/nested_test/create" ,
577+ json ! ( { "dump_url" : format!( "file:{}" , tmp_path. join( "dump.sql" ) . display( ) ) } ) ,
578+ )
579+ . await
580+ . unwrap ( ) ;
581+ assert_eq ! ( resp. status( ) , StatusCode :: OK ) ;
582+
583+ let db = Database :: open_remote_with_connector ( "http://nested_test.primary:8080" , "" , TurmoilConnector ) ?;
584+ let conn = db. connect ( ) ?;
585+
586+ conn. execute ( "UPDATE orders SET status = 'completed' WHERE id = 1" , ( ) ) . await ?;
587+ let mut rows = conn. query ( "SELECT amount FROM orders WHERE id = 1" , ( ) ) . await ?;
588+ let row = rows. next ( ) . await ?. unwrap ( ) ;
589+ assert ! ( ( row. get:: <f64 >( 0 ) ? - 90.0 ) . abs( ) < 0.001 ) ;
590+
591+ Ok ( ( ) )
592+ } ) ;
593+
594+ sim. run ( ) . unwrap ( ) ;
595+ }
0 commit comments