@@ -2341,3 +2341,198 @@ fn parse_mssql_merge_with_output() {
23412341 OUTPUT $action, deleted.ProductID INTO dsi.temp_products";
23422342 ms_and_generic ( ) . verified_stmt ( stmt) ;
23432343}
2344+
2345+ #[ test]
2346+ fn parse_create_trigger ( ) {
2347+ let create_trigger = r#"
2348+ CREATE TRIGGER reminder1
2349+ ON Sales.Customer
2350+ AFTER INSERT, UPDATE
2351+ AS RAISERROR ('Notify Customer Relations', 16, 10);
2352+ "# ;
2353+ let create_stmt = ms ( ) . one_statement_parses_to ( create_trigger, "" ) ;
2354+ assert_eq ! (
2355+ create_stmt,
2356+ Statement :: CreateTrigger {
2357+ or_replace: false ,
2358+ is_constraint: false ,
2359+ name: ObjectName :: from( vec![ Ident :: new( "reminder1" ) ] ) ,
2360+ period: TriggerPeriod :: After ,
2361+ events: vec![
2362+ TriggerEvent :: Insert ,
2363+ TriggerEvent :: Update ( vec![ ] ) ,
2364+ ] ,
2365+ table_name: ObjectName :: from( vec![ Ident :: new( "Sales" ) , Ident :: new( "Customer" ) ] ) ,
2366+ referenced_table_name: None ,
2367+ referencing: vec![ ] ,
2368+ trigger_object: TriggerObject :: Statement ,
2369+ include_each: false ,
2370+ condition: None ,
2371+ exec_body: None ,
2372+ statements: vec![ Statement :: RaisError {
2373+ message: Box :: new( Expr :: Value (
2374+ ( Value :: SingleQuotedString ( "Notify Customer Relations" . to_string( ) ) ) . with_empty_span( )
2375+ ) ) ,
2376+ severity: Box :: new( Expr :: Value (
2377+ ( Value :: Number ( "16" . parse( ) . unwrap( ) , false ) ) . with_empty_span( )
2378+ ) ) ,
2379+ state: Box :: new( Expr :: Value (
2380+ ( Value :: Number ( "10" . parse( ) . unwrap( ) , false ) ) . with_empty_span( )
2381+ ) ) ,
2382+ arguments: vec![ ] ,
2383+ options: vec![ ] ,
2384+ } ] ,
2385+ characteristics: None ,
2386+ }
2387+ ) ;
2388+
2389+ let multi_statement_trigger = r#"
2390+ CREATE TRIGGER some_trigger ON some_table FOR INSERT
2391+ AS
2392+ BEGIN
2393+ RAISERROR('Trigger fired', 10, 1);
2394+ END
2395+ "# ;
2396+ let create_stmt = ms ( ) . one_statement_parses_to ( multi_statement_trigger, "" ) ;
2397+ assert_eq ! (
2398+ create_stmt,
2399+ Statement :: CreateTrigger {
2400+ or_replace: false ,
2401+ is_constraint: false ,
2402+ name: ObjectName :: from( vec![ Ident :: new( "some_trigger" ) ] ) ,
2403+ period: TriggerPeriod :: For ,
2404+ events: vec![ TriggerEvent :: Insert ] ,
2405+ table_name: ObjectName :: from( vec![ Ident :: new( "some_table" ) ] ) ,
2406+ referenced_table_name: None ,
2407+ referencing: vec![ ] ,
2408+ trigger_object: TriggerObject :: Statement ,
2409+ include_each: false ,
2410+ condition: None ,
2411+ exec_body: None ,
2412+ statements: vec![ Statement :: RaisError {
2413+ message: Box :: new( Expr :: Value (
2414+ ( Value :: SingleQuotedString ( "Trigger fired" . to_string( ) ) ) . with_empty_span( )
2415+ ) ) ,
2416+ severity: Box :: new( Expr :: Value (
2417+ ( Value :: Number ( "10" . parse( ) . unwrap( ) , false ) ) . with_empty_span( )
2418+ ) ) ,
2419+ state: Box :: new( Expr :: Value (
2420+ ( Value :: Number ( "1" . parse( ) . unwrap( ) , false ) ) . with_empty_span( )
2421+ ) ) ,
2422+ arguments: vec![ ] ,
2423+ options: vec![ ] ,
2424+ } ] ,
2425+ characteristics: None ,
2426+ }
2427+ ) ;
2428+
2429+ let create_trigger_with_return = r#"
2430+ CREATE TRIGGER some_trigger ON some_table FOR INSERT
2431+ AS
2432+ BEGIN
2433+ RETURN;
2434+ END
2435+ "# ;
2436+ let create_stmt = ms ( ) . one_statement_parses_to ( create_trigger_with_return, "" ) ;
2437+ assert_eq ! (
2438+ create_stmt,
2439+ Statement :: CreateTrigger {
2440+ or_replace: false ,
2441+ is_constraint: false ,
2442+ name: ObjectName :: from( vec![ Ident :: new( "some_trigger" ) ] ) ,
2443+ period: TriggerPeriod :: For ,
2444+ events: vec![ TriggerEvent :: Insert ] ,
2445+ table_name: ObjectName :: from( vec![ Ident :: new( "some_table" ) ] ) ,
2446+ referenced_table_name: None ,
2447+ referencing: vec![ ] ,
2448+ trigger_object: TriggerObject :: Statement ,
2449+ include_each: false ,
2450+ condition: None ,
2451+ exec_body: None ,
2452+ statements: vec![ Statement :: Return ( ReturnStatement {
2453+ value: None ,
2454+ } ) ] ,
2455+ characteristics: None ,
2456+ }
2457+ ) ;
2458+
2459+ let create_trigger_with_conditional = r#"
2460+ CREATE TRIGGER some_trigger ON some_table FOR INSERT
2461+ AS
2462+ BEGIN
2463+ IF 1=2
2464+ BEGIN
2465+ RAISERROR('Trigger fired', 10, 1);
2466+ END
2467+
2468+ RETURN;
2469+ END
2470+ "# ;
2471+ let create_stmt = ms ( ) . one_statement_parses_to ( create_trigger_with_conditional, "" ) ;
2472+ assert_eq ! (
2473+ create_stmt,
2474+ Statement :: CreateTrigger {
2475+ or_replace: false ,
2476+ is_constraint: false ,
2477+ name: ObjectName :: from( vec![ Ident :: new( "some_trigger" ) ] ) ,
2478+ period: TriggerPeriod :: For ,
2479+ events: vec![ TriggerEvent :: Insert ] ,
2480+ table_name: ObjectName :: from( vec![ Ident :: new( "some_table" ) ] ) ,
2481+ referenced_table_name: None ,
2482+ referencing: vec![ ] ,
2483+ trigger_object: TriggerObject :: Statement ,
2484+ include_each: false ,
2485+ condition: None ,
2486+ exec_body: None ,
2487+ statements: vec![
2488+ Statement :: If ( IfStatement {
2489+ if_block: ConditionalStatementBlock {
2490+ start_token: AttachedToken ( TokenWithSpan :: wrap( sqlparser:: tokenizer:: Token :: Word ( sqlparser:: tokenizer:: Word {
2491+ value: "IF" . to_string( ) ,
2492+ quote_style: None ,
2493+ keyword: Keyword :: IF
2494+ } ) ) ) ,
2495+ condition: Some ( Expr :: BinaryOp {
2496+ left: Box :: new( Expr :: Value ( Value :: Number ( "1" . to_string( ) , false ) . with_empty_span( ) ) ) ,
2497+ op: sqlparser:: ast:: BinaryOperator :: Eq ,
2498+ right: Box :: new( Expr :: Value ( Value :: Number ( "2" . to_string( ) , false ) . with_empty_span( ) ) ) ,
2499+ } ) ,
2500+ then_token: None ,
2501+ conditional_statements: ConditionalStatements :: BeginEnd {
2502+ begin_token: AttachedToken ( TokenWithSpan :: wrap( sqlparser:: tokenizer:: Token :: Word ( sqlparser:: tokenizer:: Word {
2503+ value: "BEGIN" . to_string( ) ,
2504+ quote_style: None ,
2505+ keyword: Keyword :: BEGIN
2506+ } ) ) ) ,
2507+ statements: vec![ Statement :: RaisError {
2508+ message: Box :: new( Expr :: Value (
2509+ ( Value :: SingleQuotedString ( "Trigger fired" . to_string( ) ) ) . with_empty_span( )
2510+ ) ) ,
2511+ severity: Box :: new( Expr :: Value (
2512+ ( Value :: Number ( "10" . parse( ) . unwrap( ) , false ) ) . with_empty_span( )
2513+ ) ) ,
2514+ state: Box :: new( Expr :: Value (
2515+ ( Value :: Number ( "1" . parse( ) . unwrap( ) , false ) ) . with_empty_span( )
2516+ ) ) ,
2517+ arguments: vec![ ] ,
2518+ options: vec![ ] ,
2519+ } ] ,
2520+ end_token: AttachedToken ( TokenWithSpan :: wrap( sqlparser:: tokenizer:: Token :: Word ( sqlparser:: tokenizer:: Word {
2521+ value: "END" . to_string( ) ,
2522+ quote_style: None ,
2523+ keyword: Keyword :: END
2524+ } ) ) ) ,
2525+ } ,
2526+ } ,
2527+ elseif_blocks: vec![ ] ,
2528+ else_block: None ,
2529+ end_token: None ,
2530+ } ) ,
2531+ Statement :: Return ( ReturnStatement {
2532+ value: None
2533+ } ) ,
2534+ ] ,
2535+ characteristics: None ,
2536+ }
2537+ ) ;
2538+ }
0 commit comments