@@ -5405,6 +5405,64 @@ END $$"#;
54055405 assert_eq ! ( stmts[ 0 ] , stmts_plain[ 0 ] ) ;
54065406}
54075407
5408+ /// `EXECUTE AS { CALLER | OWNER }` rights clause parses, is recoverable from
5409+ /// the AST, and round-trips through `Display`. An omitted clause is reported
5410+ /// as owner's-rights (`None`).
5411+ #[ test]
5412+ fn test_create_procedure_execute_as ( ) {
5413+ fn execute_as_of ( sql : & str ) -> Option < ProcedureExecuteAs > {
5414+ let stmts = snowflake ( )
5415+ . parse_sql_statements ( sql)
5416+ . expect ( "EXECUTE AS procedure should parse" ) ;
5417+ match & stmts[ 0 ] {
5418+ Statement :: CreateProcedure { execute_as, .. } => * execute_as,
5419+ other => panic ! ( "expected CreateProcedure, got {other:?}" ) ,
5420+ }
5421+ }
5422+
5423+ let caller = r#"CREATE OR REPLACE PROCEDURE p(a INT) RETURNS VARCHAR LANGUAGE SQL EXECUTE AS CALLER AS $$
5424+ BEGIN
5425+ RETURN 'x';
5426+ END $$"# ;
5427+ assert_eq ! ( execute_as_of( caller) , Some ( ProcedureExecuteAs :: Caller ) ) ;
5428+
5429+ let owner = r#"CREATE OR REPLACE PROCEDURE p(a INT) RETURNS VARCHAR LANGUAGE SQL EXECUTE AS OWNER AS $$
5430+ BEGIN
5431+ RETURN 'x';
5432+ END $$"# ;
5433+ assert_eq ! ( execute_as_of( owner) , Some ( ProcedureExecuteAs :: Owner ) ) ;
5434+
5435+ let omitted = r#"CREATE OR REPLACE PROCEDURE p(a INT) RETURNS VARCHAR LANGUAGE SQL AS $$
5436+ BEGIN
5437+ RETURN 'x';
5438+ END $$"# ;
5439+ assert_eq ! ( execute_as_of( omitted) , None ) ;
5440+
5441+ // A `CALLER` declaration is distinguishable from `OWNER`/omitted.
5442+ assert_ne ! ( execute_as_of( caller) , execute_as_of( owner) ) ;
5443+ assert_ne ! ( execute_as_of( caller) , execute_as_of( omitted) ) ;
5444+
5445+ // parse → Display → parse round-trips for all three forms.
5446+ for sql in [ caller, owner, omitted] {
5447+ let first = snowflake ( ) . parse_sql_statements ( sql) . unwrap ( ) ;
5448+ let rendered = first[ 0 ] . to_string ( ) ;
5449+ let second = snowflake ( )
5450+ . parse_sql_statements ( & rendered)
5451+ . expect ( "re-parse of Display output should succeed" ) ;
5452+ assert_eq ! ( first[ 0 ] , second[ 0 ] ) ;
5453+ }
5454+
5455+ // The omitted form does not gain a spurious `EXECUTE AS` rendering.
5456+ let rendered_omitted = snowflake ( ) . parse_sql_statements ( omitted) . unwrap ( ) [ 0 ] . to_string ( ) ;
5457+ assert ! ( !rendered_omitted. contains( "EXECUTE AS" ) ) ;
5458+ assert ! ( snowflake( ) . parse_sql_statements( caller) . unwrap( ) [ 0 ]
5459+ . to_string( )
5460+ . contains( "EXECUTE AS CALLER" ) ) ;
5461+ assert ! ( snowflake( ) . parse_sql_statements( owner) . unwrap( ) [ 0 ]
5462+ . to_string( )
5463+ . contains( "EXECUTE AS OWNER" ) ) ;
5464+ }
5465+
54085466/// `LET var := expr` (without data type) inside `BEGIN...END`.
54095467#[ test]
54105468fn test_scripting_let_without_type ( ) {
0 commit comments