@@ -4482,6 +4482,50 @@ fn parse_incorrect_create_function_parallel() {
44824482 assert ! ( pg( ) . parse_sql_statements( sql) . is_err( ) ) ;
44834483}
44844484
4485+ #[ test]
4486+ fn parse_create_function_c_with_module_pathname ( ) {
4487+ let sql = "CREATE FUNCTION cas_in(input cstring) RETURNS cas LANGUAGE c IMMUTABLE PARALLEL SAFE AS 'MODULE_PATHNAME', 'cas_in_wrapper'" ;
4488+ assert_eq ! (
4489+ pg_and_generic( ) . verified_stmt( sql) ,
4490+ Statement :: CreateFunction ( CreateFunction {
4491+ or_alter: false ,
4492+ or_replace: false ,
4493+ temporary: false ,
4494+ name: ObjectName :: from( vec![ Ident :: new( "cas_in" ) ] ) ,
4495+ args: Some ( vec![ OperateFunctionArg :: with_name(
4496+ "input" ,
4497+ DataType :: Custom ( ObjectName :: from( vec![ Ident :: new( "cstring" ) ] ) , vec![ ] ) ,
4498+ ) , ] ) ,
4499+ return_type: Some ( DataType :: Custom (
4500+ ObjectName :: from( vec![ Ident :: new( "cas" ) ] ) ,
4501+ vec![ ]
4502+ ) ) ,
4503+ language: Some ( "c" . into( ) ) ,
4504+ behavior: Some ( FunctionBehavior :: Immutable ) ,
4505+ called_on_null: None ,
4506+ parallel: Some ( FunctionParallel :: Safe ) ,
4507+ function_body: Some ( CreateFunctionBody :: AsBeforeOptions ( Expr :: Tuple ( vec![
4508+ Expr :: Value (
4509+ ( Value :: SingleQuotedString ( "MODULE_PATHNAME" . into( ) ) ) . with_empty_span( )
4510+ ) ,
4511+ Expr :: Value ( ( Value :: SingleQuotedString ( "cas_in_wrapper" . into( ) ) ) . with_empty_span( ) ) ,
4512+ ] ) ) ) ,
4513+ if_not_exists: false ,
4514+ using: None ,
4515+ determinism_specifier: None ,
4516+ options: None ,
4517+ remote_connection: None ,
4518+ } )
4519+ ) ;
4520+
4521+ // Test that attribute order flexibility works (IMMUTABLE before LANGUAGE)
4522+ let sql_alt_order = "CREATE FUNCTION cas_in(input cstring) RETURNS cas IMMUTABLE PARALLEL SAFE LANGUAGE c AS 'MODULE_PATHNAME', 'cas_in_wrapper'" ;
4523+ pg_and_generic ( ) . one_statement_parses_to (
4524+ sql_alt_order,
4525+ "CREATE FUNCTION cas_in(input cstring) RETURNS cas LANGUAGE c IMMUTABLE PARALLEL SAFE AS 'MODULE_PATHNAME', 'cas_in_wrapper'"
4526+ ) ;
4527+ }
4528+
44854529#[ test]
44864530fn parse_drop_function ( ) {
44874531 let sql = "DROP FUNCTION IF EXISTS test_func" ;
0 commit comments