@@ -9867,3 +9867,112 @@ fn parse_create_subscription_with_options() {
98679867 other => panic ! ( "unexpected option: {other:?}" ) ,
98689868 }
98699869}
9870+
9871+ #[ test]
9872+ fn parse_create_statistics_basic ( ) {
9873+ let sql = "CREATE STATISTICS public.s ON a, b FROM public.t" ;
9874+ let Statement :: CreateStatistics ( stmt) = pg ( ) . verified_stmt ( sql) else {
9875+ unreachable ! ( )
9876+ } ;
9877+ assert ! ( !stmt. if_not_exists) ;
9878+ assert_eq ! ( stmt. name. to_string( ) , "public.s" ) ;
9879+ assert ! ( stmt. kinds. is_empty( ) ) ;
9880+ assert_eq ! ( stmt. on. len( ) , 2 ) ;
9881+ assert_eq ! ( stmt. from. to_string( ) , "public.t" ) ;
9882+ }
9883+
9884+ #[ test]
9885+ fn parse_create_statistics_if_not_exists_with_kinds ( ) {
9886+ let sql = "CREATE STATISTICS IF NOT EXISTS mystat (ndistinct, dependencies, mcv) ON col1, col2 FROM mytable" ;
9887+ let Statement :: CreateStatistics ( stmt) = pg ( ) . verified_stmt ( sql) else {
9888+ unreachable ! ( )
9889+ } ;
9890+ assert ! ( stmt. if_not_exists) ;
9891+ assert_eq ! ( stmt. name. to_string( ) , "mystat" ) ;
9892+ assert_eq ! (
9893+ stmt. kinds,
9894+ vec![
9895+ StatisticsKind :: NDistinct ,
9896+ StatisticsKind :: Dependencies ,
9897+ StatisticsKind :: Mcv ,
9898+ ]
9899+ ) ;
9900+ assert_eq ! ( stmt. on. len( ) , 2 ) ;
9901+ }
9902+
9903+ #[ test]
9904+ fn parse_create_access_method_index ( ) {
9905+ let sql = "CREATE ACCESS METHOD my_am TYPE INDEX HANDLER bthandler" ;
9906+ let Statement :: CreateAccessMethod ( stmt) = pg ( ) . verified_stmt ( sql) else {
9907+ unreachable ! ( )
9908+ } ;
9909+ assert_eq ! ( stmt. name. value, "my_am" ) ;
9910+ assert_eq ! ( stmt. method_type, AccessMethodType :: Index ) ;
9911+ assert_eq ! ( stmt. handler. to_string( ) , "bthandler" ) ;
9912+ }
9913+
9914+ #[ test]
9915+ fn parse_create_access_method_table ( ) {
9916+ let sql = "CREATE ACCESS METHOD my_tam TYPE TABLE HANDLER heap_tableam_handler" ;
9917+ let Statement :: CreateAccessMethod ( stmt) = pg ( ) . verified_stmt ( sql) else {
9918+ unreachable ! ( )
9919+ } ;
9920+ assert_eq ! ( stmt. name. value, "my_tam" ) ;
9921+ assert_eq ! ( stmt. method_type, AccessMethodType :: Table ) ;
9922+ assert_eq ! ( stmt. handler. to_string( ) , "heap_tableam_handler" ) ;
9923+ }
9924+
9925+ #[ test]
9926+ fn parse_create_event_trigger_basic ( ) {
9927+ let sql = "CREATE EVENT TRIGGER myet ON ddl_command_start EXECUTE FUNCTION public.handler()" ;
9928+ let Statement :: CreateEventTrigger ( stmt) = pg ( ) . verified_stmt ( sql) else {
9929+ unreachable ! ( )
9930+ } ;
9931+ assert_eq ! ( stmt. name. value, "myet" ) ;
9932+ assert_eq ! ( stmt. event, EventTriggerEvent :: DdlCommandStart ) ;
9933+ assert ! ( stmt. when_tags. is_none( ) ) ;
9934+ assert_eq ! ( stmt. execute. to_string( ) , "public.handler" ) ;
9935+ assert ! ( !stmt. is_procedure) ;
9936+ }
9937+
9938+ #[ test]
9939+ fn parse_create_event_trigger_with_when_tags ( ) {
9940+ let sql = "CREATE EVENT TRIGGER myet ON ddl_command_end WHEN TAG IN ('CREATE TABLE', 'ALTER TABLE') EXECUTE FUNCTION abort_any_command()" ;
9941+ let Statement :: CreateEventTrigger ( stmt) = pg ( ) . verified_stmt ( sql) else {
9942+ unreachable ! ( )
9943+ } ;
9944+ assert_eq ! ( stmt. event, EventTriggerEvent :: DdlCommandEnd ) ;
9945+ let tags = stmt. when_tags . unwrap ( ) ;
9946+ assert_eq ! ( tags. len( ) , 2 ) ;
9947+ assert_eq ! ( tags[ 0 ] . to_string( ) , "'CREATE TABLE'" ) ;
9948+ assert_eq ! ( tags[ 1 ] . to_string( ) , "'ALTER TABLE'" ) ;
9949+ }
9950+
9951+ #[ test]
9952+ fn parse_create_transform_basic ( ) {
9953+ let sql = "CREATE TRANSFORM FOR INT LANGUAGE sql (FROM SQL WITH FUNCTION f1(internal), TO SQL WITH FUNCTION f2(INT))" ;
9954+ let Statement :: CreateTransform ( stmt) = pg ( ) . verified_stmt ( sql) else {
9955+ unreachable ! ( )
9956+ } ;
9957+ assert ! ( !stmt. or_replace) ;
9958+ assert_eq ! ( stmt. type_name. to_string( ) , "INT" ) ;
9959+ assert_eq ! ( stmt. language. value, "sql" ) ;
9960+ assert_eq ! ( stmt. elements. len( ) , 2 ) ;
9961+ assert ! ( stmt. elements[ 0 ] . is_from) ;
9962+ assert_eq ! ( stmt. elements[ 0 ] . function. to_string( ) , "f1" ) ;
9963+ assert ! ( !stmt. elements[ 1 ] . is_from) ;
9964+ assert_eq ! ( stmt. elements[ 1 ] . function. to_string( ) , "f2" ) ;
9965+ }
9966+
9967+ #[ test]
9968+ fn parse_create_or_replace_transform ( ) {
9969+ let sql = "CREATE OR REPLACE TRANSFORM FOR BIGINT LANGUAGE plpgsql (FROM SQL WITH FUNCTION int8recv(internal))" ;
9970+ let Statement :: CreateTransform ( stmt) = pg ( ) . verified_stmt ( sql) else {
9971+ unreachable ! ( )
9972+ } ;
9973+ assert ! ( stmt. or_replace) ;
9974+ assert_eq ! ( stmt. type_name. to_string( ) , "BIGINT" ) ;
9975+ assert_eq ! ( stmt. language. value, "plpgsql" ) ;
9976+ assert_eq ! ( stmt. elements. len( ) , 1 ) ;
9977+ assert ! ( stmt. elements[ 0 ] . is_from) ;
9978+ }
0 commit comments