@@ -9867,3 +9867,139 @@ fn parse_create_subscription_with_options() {
98679867 other => panic ! ( "unexpected option: {other:?}" ) ,
98689868 }
98699869}
9870+
9871+ #[ test]
9872+ fn parse_security_label_on_table ( ) {
9873+ let sql = "SECURITY LABEL FOR selinux ON TABLE public.t IS 'system_u:object_r:sepgsql_table_t:s0'" ;
9874+ let Statement :: SecurityLabel ( stmt) = pg ( ) . verified_stmt ( sql) else {
9875+ unreachable ! ( )
9876+ } ;
9877+ assert_eq ! ( stmt. provider. as_ref( ) . unwrap( ) . value, "selinux" ) ;
9878+ assert ! ( matches!( stmt. object_kind, SecurityLabelObjectKind :: Table ) ) ;
9879+ assert_eq ! ( stmt. object_name. to_string( ) , "public.t" ) ;
9880+ assert_eq ! (
9881+ stmt. label. as_ref( ) . unwrap( ) . to_string( ) ,
9882+ "'system_u:object_r:sepgsql_table_t:s0'"
9883+ ) ;
9884+ }
9885+
9886+ #[ test]
9887+ fn parse_security_label_no_provider_null ( ) {
9888+ let sql = "SECURITY LABEL ON TABLE public.t IS NULL" ;
9889+ let Statement :: SecurityLabel ( stmt) = pg ( ) . verified_stmt ( sql) else {
9890+ unreachable ! ( )
9891+ } ;
9892+ assert ! ( stmt. provider. is_none( ) ) ;
9893+ assert ! ( matches!( stmt. object_kind, SecurityLabelObjectKind :: Table ) ) ;
9894+ assert ! ( stmt. label. is_none( ) ) ;
9895+ }
9896+
9897+ #[ test]
9898+ fn parse_security_label_on_role ( ) {
9899+ let sql = "SECURITY LABEL FOR selinux ON ROLE admin IS 'system_u:object_r:sepgsql_role_t:s0'" ;
9900+ let Statement :: SecurityLabel ( stmt) = pg ( ) . verified_stmt ( sql) else {
9901+ unreachable ! ( )
9902+ } ;
9903+ assert_eq ! ( stmt. provider. as_ref( ) . unwrap( ) . value, "selinux" ) ;
9904+ assert ! ( matches!( stmt. object_kind, SecurityLabelObjectKind :: Role ) ) ;
9905+ assert_eq ! ( stmt. object_name. to_string( ) , "admin" ) ;
9906+ }
9907+
9908+ #[ test]
9909+ fn parse_security_label_on_schema ( ) {
9910+ let sql = "SECURITY LABEL ON SCHEMA myschema IS 'system_u:object_r:sepgsql_schema_t:s0'" ;
9911+ let Statement :: SecurityLabel ( stmt) = pg ( ) . verified_stmt ( sql) else {
9912+ unreachable ! ( )
9913+ } ;
9914+ assert ! ( stmt. provider. is_none( ) ) ;
9915+ assert ! ( matches!( stmt. object_kind, SecurityLabelObjectKind :: Schema ) ) ;
9916+ assert_eq ! ( stmt. object_name. to_string( ) , "myschema" ) ;
9917+ }
9918+
9919+ #[ test]
9920+ fn parse_create_user_mapping_basic ( ) {
9921+ let sql = "CREATE USER MAPPING FOR postgres SERVER my_server" ;
9922+ let Statement :: CreateUserMapping ( stmt) = pg ( ) . verified_stmt ( sql) else {
9923+ unreachable ! ( )
9924+ } ;
9925+ assert ! ( !stmt. if_not_exists) ;
9926+ assert ! ( matches!( stmt. user, UserMappingUser :: Ident ( _) ) ) ;
9927+ if let UserMappingUser :: Ident ( ident) = & stmt. user {
9928+ assert_eq ! ( ident. value, "postgres" ) ;
9929+ }
9930+ assert_eq ! ( stmt. server_name. value, "my_server" ) ;
9931+ assert ! ( stmt. options. is_none( ) ) ;
9932+ }
9933+
9934+ #[ test]
9935+ fn parse_create_user_mapping_if_not_exists_with_options ( ) {
9936+ let sql = r#"CREATE USER MAPPING IF NOT EXISTS FOR postgres SERVER my_server OPTIONS ("user" 'bob')"# ;
9937+ let Statement :: CreateUserMapping ( stmt) = pg ( ) . verified_stmt ( sql) else {
9938+ unreachable ! ( )
9939+ } ;
9940+ assert ! ( stmt. if_not_exists) ;
9941+ assert ! ( matches!( stmt. user, UserMappingUser :: Ident ( _) ) ) ;
9942+ assert_eq ! ( stmt. server_name. value, "my_server" ) ;
9943+ let opts = stmt. options . as_ref ( ) . unwrap ( ) ;
9944+ assert_eq ! ( opts. len( ) , 1 ) ;
9945+ assert_eq ! ( opts[ 0 ] . key. value, "user" ) ;
9946+ assert_eq ! ( opts[ 0 ] . value. value, "bob" ) ;
9947+ }
9948+
9949+ #[ test]
9950+ fn parse_create_user_mapping_current_user ( ) {
9951+ let sql = "CREATE USER MAPPING FOR CURRENT_USER SERVER my_server" ;
9952+ let Statement :: CreateUserMapping ( stmt) = pg ( ) . verified_stmt ( sql) else {
9953+ unreachable ! ( )
9954+ } ;
9955+ assert ! ( matches!( stmt. user, UserMappingUser :: CurrentUser ) ) ;
9956+ }
9957+
9958+ #[ test]
9959+ fn parse_create_user_mapping_public ( ) {
9960+ let sql = "CREATE USER MAPPING FOR PUBLIC SERVER my_server" ;
9961+ let Statement :: CreateUserMapping ( stmt) = pg ( ) . verified_stmt ( sql) else {
9962+ unreachable ! ( )
9963+ } ;
9964+ assert ! ( matches!( stmt. user, UserMappingUser :: Public ) ) ;
9965+ }
9966+
9967+ #[ test]
9968+ fn parse_create_tablespace_basic ( ) {
9969+ let sql = "CREATE TABLESPACE my_ts LOCATION '/mnt/data'" ;
9970+ let Statement :: CreateTablespace ( stmt) = pg ( ) . verified_stmt ( sql) else {
9971+ unreachable ! ( )
9972+ } ;
9973+ assert_eq ! ( stmt. name. value, "my_ts" ) ;
9974+ assert ! ( stmt. owner. is_none( ) ) ;
9975+ assert_eq ! ( stmt. location. to_string( ) , "'/mnt/data'" ) ;
9976+ assert ! ( stmt. with_options. is_empty( ) ) ;
9977+ }
9978+
9979+ #[ test]
9980+ fn parse_create_tablespace_with_owner ( ) {
9981+ let sql = "CREATE TABLESPACE my_ts OWNER admin LOCATION '/mnt/data'" ;
9982+ let Statement :: CreateTablespace ( stmt) = pg ( ) . verified_stmt ( sql) else {
9983+ unreachable ! ( )
9984+ } ;
9985+ assert_eq ! ( stmt. name. value, "my_ts" ) ;
9986+ assert_eq ! ( stmt. owner. as_ref( ) . unwrap( ) . value, "admin" ) ;
9987+ assert_eq ! ( stmt. location. to_string( ) , "'/mnt/data'" ) ;
9988+ }
9989+
9990+ #[ test]
9991+ fn parse_create_tablespace_with_options ( ) {
9992+ let sql = "CREATE TABLESPACE my_ts LOCATION '/mnt/data' WITH (seq_page_cost = 1.0)" ;
9993+ let Statement :: CreateTablespace ( stmt) = pg ( ) . verified_stmt ( sql) else {
9994+ unreachable ! ( )
9995+ } ;
9996+ assert_eq ! ( stmt. name. value, "my_ts" ) ;
9997+ assert_eq ! ( stmt. with_options. len( ) , 1 ) ;
9998+ match & stmt. with_options [ 0 ] {
9999+ SqlOption :: KeyValue { key, value } => {
10000+ assert_eq ! ( key. value, "seq_page_cost" ) ;
10001+ assert_eq ! ( value. to_string( ) , "1.0" ) ;
10002+ }
10003+ other => panic ! ( "unexpected option: {other:?}" ) ,
10004+ }
10005+ }
0 commit comments