@@ -4814,6 +4814,192 @@ fn parse_alter_user() {
48144814 ) ;
48154815}
48164816
4817+ #[ test]
4818+ fn parse_alter_default_privileges ( ) {
4819+ // What `pg_dump -s` emits for a default ACL.
4820+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT SELECT ON TABLES TO app_user" ) ;
4821+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES TO app" ) ;
4822+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES FOR ROLE a, b IN SCHEMA s1, s2 GRANT SELECT, INSERT ON TABLES TO app WITH GRANT OPTION" ) ;
4823+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT ALL PRIVILEGES ON SEQUENCES TO app" ) ;
4824+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO app" ) ;
4825+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON ROUTINES TO app" ) ;
4826+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT USAGE ON TYPES TO app" ) ;
4827+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT USAGE, CREATE ON SCHEMAS TO app" ) ;
4828+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES REVOKE SELECT ON TABLES FROM app" ) ;
4829+ pg ( ) . verified_stmt (
4830+ "ALTER DEFAULT PRIVILEGES REVOKE GRANT OPTION FOR ALL ON TABLES FROM app CASCADE" ,
4831+ ) ;
4832+ // `FOR USER` normalises to `FOR ROLE`.
4833+ pg ( ) . one_statement_parses_to (
4834+ "ALTER DEFAULT PRIVILEGES FOR USER bob GRANT SELECT ON TABLES TO app" ,
4835+ "ALTER DEFAULT PRIVILEGES FOR ROLE bob GRANT SELECT ON TABLES TO app" ,
4836+ ) ;
4837+
4838+ // Options keep the order written.
4839+ for ( sql, options) in [
4840+ (
4841+ "ALTER DEFAULT PRIVILEGES IN SCHEMA s FOR ROLE r GRANT SELECT ON TABLES TO app" ,
4842+ vec ! [
4843+ DefaultPrivilegesOption :: InSchema ( vec![ ObjectName :: from( Ident :: new( "s" ) ) ] ) ,
4844+ DefaultPrivilegesOption :: ForRole ( vec![ Ident :: new( "r" ) ] ) ,
4845+ ] ,
4846+ ) ,
4847+ (
4848+ "ALTER DEFAULT PRIVILEGES FOR ROLE r IN SCHEMA s GRANT SELECT ON TABLES TO app" ,
4849+ vec ! [
4850+ DefaultPrivilegesOption :: ForRole ( vec![ Ident :: new( "r" ) ] ) ,
4851+ DefaultPrivilegesOption :: InSchema ( vec![ ObjectName :: from( Ident :: new( "s" ) ) ] ) ,
4852+ ] ,
4853+ ) ,
4854+ ] {
4855+ let mut stmts = pg ( ) . parse_sql_statements ( sql) . unwrap ( ) ;
4856+ match stmts. pop ( ) . unwrap ( ) {
4857+ Statement :: AlterDefaultPrivileges ( stmt) => assert_eq ! ( stmt. options, options, "{sql}" ) ,
4858+ _ => unreachable ! ( ) ,
4859+ }
4860+ }
4861+ // Reversed option order round-trips unchanged.
4862+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES IN SCHEMA public FOR ROLE postgres GRANT SELECT ON TABLES TO app_user" ) ;
4863+ // `LARGE OBJECTS` is a valid object type for both `GRANT` and `REVOKE`.
4864+ pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT SELECT, UPDATE ON LARGE OBJECTS TO app" ) ;
4865+ pg ( ) . verified_stmt (
4866+ "ALTER DEFAULT PRIVILEGES REVOKE GRANT OPTION FOR SELECT ON LARGE OBJECTS FROM app CASCADE" ,
4867+ ) ;
4868+ // Repeated options are rejected.
4869+ assert_eq ! (
4870+ pg( ) . parse_sql_statements(
4871+ "ALTER DEFAULT PRIVILEGES FOR ROLE a FOR ROLE b GRANT SELECT ON TABLES TO app"
4872+ )
4873+ . unwrap_err( ) ,
4874+ ParserError :: ParserError ( "FOR ROLE specified more than once" . to_string( ) ) ,
4875+ ) ;
4876+ assert_eq ! (
4877+ pg( ) . parse_sql_statements(
4878+ "ALTER DEFAULT PRIVILEGES IN SCHEMA s IN SCHEMA t GRANT SELECT ON TABLES TO app"
4879+ )
4880+ . unwrap_err( ) ,
4881+ ParserError :: ParserError ( "IN SCHEMA specified more than once" . to_string( ) ) ,
4882+ ) ;
4883+
4884+ // `TABLES` is a keyword only here, so a table named `tables` still parses.
4885+ pg ( ) . verified_stmt ( "GRANT SELECT ON TABLES TO app" ) ;
4886+ assert_eq ! (
4887+ pg( ) . parse_sql_statements( "ALTER DEFAULT PRIVILEGES FOR ROLE a" )
4888+ . unwrap_err( ) ,
4889+ ParserError :: ParserError ( "Expected: GRANT or REVOKE, found: EOF" . to_string( ) ) ,
4890+ ) ;
4891+ }
4892+
4893+ #[ test]
4894+ fn parse_alter_default_privileges_rejects_malformed_statements ( ) {
4895+ for ( sql, expected) in [
4896+ (
4897+ "ALTER DEFAULT PRIVILEGES FOR ALL GRANT SELECT ON TABLES TO app" ,
4898+ "Expected: one of ROLE or USER, found: ALL" ,
4899+ ) ,
4900+ (
4901+ "ALTER DEFAULT PRIVILEGES FOR ROLE" ,
4902+ "Expected: identifier, found: EOF" ,
4903+ ) ,
4904+ (
4905+ "ALTER DEFAULT PRIVILEGES IN SCHEMA" ,
4906+ "Expected: identifier, found: EOF" ,
4907+ ) ,
4908+ (
4909+ "ALTER DEFAULT PRIVILEGES GRANT ON TABLES TO app" ,
4910+ "Expected: a privilege keyword, found: ON" ,
4911+ ) ,
4912+ (
4913+ "ALTER DEFAULT PRIVILEGES GRANT SELECT TO app" ,
4914+ "Expected: ON, found: TO" ,
4915+ ) ,
4916+ (
4917+ "ALTER DEFAULT PRIVILEGES GRANT SELECT ON INDEXES TO app" ,
4918+ "Expected: TABLES, SEQUENCES, FUNCTIONS, ROUTINES, TYPES, SCHEMAS or LARGE OBJECTS, found: INDEXES" ,
4919+ ) ,
4920+ (
4921+ "ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES" ,
4922+ "Expected: TO, found: EOF" ,
4923+ ) ,
4924+ (
4925+ "ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES TO" ,
4926+ "Expected: identifier, found: EOF" ,
4927+ ) ,
4928+ ] {
4929+ assert_eq ! (
4930+ pg( ) . parse_sql_statements( sql) . unwrap_err( ) ,
4931+ ParserError :: ParserError ( expected. to_string( ) ) ,
4932+ ) ;
4933+ }
4934+ }
4935+
4936+ #[ test]
4937+ fn display_alter_default_privileges_propagates_write_errors ( ) {
4938+ use core:: fmt:: { self , Write } ;
4939+
4940+ struct RejectingWriter ( & ' static str ) ;
4941+
4942+ impl Write for RejectingWriter {
4943+ fn write_str ( & mut self , value : & str ) -> fmt:: Result {
4944+ if value. contains ( self . 0 ) {
4945+ Err ( fmt:: Error )
4946+ } else {
4947+ Ok ( ( ) )
4948+ }
4949+ }
4950+ }
4951+
4952+ let grant = pg ( ) . verified_stmt (
4953+ "ALTER DEFAULT PRIVILEGES FOR ROLE r IN SCHEMA s GRANT SELECT ON TABLES TO g WITH GRANT OPTION" ,
4954+ ) ;
4955+ for rejected in [ "D" , "r" , "g" , "W" ] {
4956+ let mut writer = RejectingWriter ( rejected) ;
4957+ assert_eq ! ( write!( writer, "{grant}" ) , Err ( fmt:: Error ) ) ;
4958+ }
4959+
4960+ let revoke = pg ( ) . verified_stmt (
4961+ "ALTER DEFAULT PRIVILEGES REVOKE GRANT OPTION FOR SELECT ON TABLES FROM g CASCADE" ,
4962+ ) ;
4963+ for rejected in [ "K" , "N" , "g" , "CASCADE" ] {
4964+ let mut writer = RejectingWriter ( rejected) ;
4965+ assert_eq ! ( write!( writer, "{revoke}" ) , Err ( fmt:: Error ) ) ;
4966+ }
4967+ }
4968+
4969+ #[ test]
4970+ fn parse_alter_default_privileges_spans ( ) {
4971+ for ( sql, start, end) in [
4972+ (
4973+ "ALTER DEFAULT PRIVILEGES FOR ROLE r IN SCHEMA s GRANT SELECT ON TABLES TO g" ,
4974+ 35 ,
4975+ 76 ,
4976+ ) ,
4977+ (
4978+ "ALTER DEFAULT PRIVILEGES REVOKE SELECT ON TABLES FROM g" ,
4979+ 55 ,
4980+ 56 ,
4981+ ) ,
4982+ (
4983+ "ALTER DEFAULT PRIVILEGES FOR ROLE r GRANT SELECT ON TABLES TO PUBLIC" ,
4984+ 35 ,
4985+ 36 ,
4986+ ) ,
4987+ ] {
4988+ let statements = Parser :: parse_sql ( & PostgreSqlDialect { } , sql) . unwrap ( ) ;
4989+ assert_eq ! (
4990+ statements[ 0 ] . span( ) ,
4991+ Span :: new( Location :: new( 1 , start) , Location :: new( 1 , end) ) ,
4992+ "span for {sql}"
4993+ ) ;
4994+ }
4995+ let sql = "ALTER DEFAULT PRIVILEGES REVOKE SELECT ON TABLES FROM 'bob'@'localhost'" ;
4996+ let statements = Parser :: parse_sql ( & sqlparser:: dialect:: GenericDialect { } , sql) . unwrap ( ) ;
4997+ assert_eq ! (
4998+ statements[ 0 ] . span( ) ,
4999+ Span :: new( Location :: new( 1 , 55 ) , Location :: new( 1 , 72 ) )
5000+ ) ;
5001+ }
5002+
48175003#[ test]
48185004fn parse_delimited_identifiers ( ) {
48195005 // check that quoted identifiers in any position remain quoted after serialization
@@ -10265,189 +10451,3 @@ fn parse_geometric_typed_literal_error_propagates() {
1026510451 ParserError :: ParserError ( "Expected: a value, found: (" . to_string( ) )
1026610452 ) ;
1026710453}
10268-
10269- #[ test]
10270- fn parse_alter_default_privileges ( ) {
10271- // What `pg_dump -s` emits for a default ACL.
10272- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES FOR ROLE postgres IN SCHEMA public GRANT SELECT ON TABLES TO app_user" ) ;
10273- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES TO app" ) ;
10274- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES FOR ROLE a, b IN SCHEMA s1, s2 GRANT SELECT, INSERT ON TABLES TO app WITH GRANT OPTION" ) ;
10275- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT ALL PRIVILEGES ON SEQUENCES TO app" ) ;
10276- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON FUNCTIONS TO app" ) ;
10277- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT EXECUTE ON ROUTINES TO app" ) ;
10278- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT USAGE ON TYPES TO app" ) ;
10279- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT USAGE, CREATE ON SCHEMAS TO app" ) ;
10280- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES REVOKE SELECT ON TABLES FROM app" ) ;
10281- pg ( ) . verified_stmt (
10282- "ALTER DEFAULT PRIVILEGES REVOKE GRANT OPTION FOR ALL ON TABLES FROM app CASCADE" ,
10283- ) ;
10284- // `FOR USER` normalises to `FOR ROLE`.
10285- pg ( ) . one_statement_parses_to (
10286- "ALTER DEFAULT PRIVILEGES FOR USER bob GRANT SELECT ON TABLES TO app" ,
10287- "ALTER DEFAULT PRIVILEGES FOR ROLE bob GRANT SELECT ON TABLES TO app" ,
10288- ) ;
10289-
10290- // Options keep the order written.
10291- for ( sql, options) in [
10292- (
10293- "ALTER DEFAULT PRIVILEGES IN SCHEMA s FOR ROLE r GRANT SELECT ON TABLES TO app" ,
10294- vec ! [
10295- DefaultPrivilegesOption :: InSchema ( vec![ ObjectName :: from( Ident :: new( "s" ) ) ] ) ,
10296- DefaultPrivilegesOption :: ForRole ( vec![ Ident :: new( "r" ) ] ) ,
10297- ] ,
10298- ) ,
10299- (
10300- "ALTER DEFAULT PRIVILEGES FOR ROLE r IN SCHEMA s GRANT SELECT ON TABLES TO app" ,
10301- vec ! [
10302- DefaultPrivilegesOption :: ForRole ( vec![ Ident :: new( "r" ) ] ) ,
10303- DefaultPrivilegesOption :: InSchema ( vec![ ObjectName :: from( Ident :: new( "s" ) ) ] ) ,
10304- ] ,
10305- ) ,
10306- ] {
10307- let mut stmts = pg ( ) . parse_sql_statements ( sql) . unwrap ( ) ;
10308- match stmts. pop ( ) . unwrap ( ) {
10309- Statement :: AlterDefaultPrivileges ( stmt) => assert_eq ! ( stmt. options, options, "{sql}" ) ,
10310- _ => unreachable ! ( ) ,
10311- }
10312- }
10313- // Reversed option order round-trips unchanged.
10314- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES IN SCHEMA public FOR ROLE postgres GRANT SELECT ON TABLES TO app_user" ) ;
10315- // `LARGE OBJECTS` is a valid object type for both `GRANT` and `REVOKE`.
10316- pg ( ) . verified_stmt ( "ALTER DEFAULT PRIVILEGES GRANT SELECT, UPDATE ON LARGE OBJECTS TO app" ) ;
10317- pg ( ) . verified_stmt (
10318- "ALTER DEFAULT PRIVILEGES REVOKE GRANT OPTION FOR SELECT ON LARGE OBJECTS FROM app CASCADE" ,
10319- ) ;
10320- // Repeated options are rejected.
10321- assert_eq ! (
10322- pg( ) . parse_sql_statements(
10323- "ALTER DEFAULT PRIVILEGES FOR ROLE a FOR ROLE b GRANT SELECT ON TABLES TO app"
10324- )
10325- . unwrap_err( ) ,
10326- ParserError :: ParserError ( "FOR ROLE specified more than once" . to_string( ) ) ,
10327- ) ;
10328- assert_eq ! (
10329- pg( ) . parse_sql_statements(
10330- "ALTER DEFAULT PRIVILEGES IN SCHEMA s IN SCHEMA t GRANT SELECT ON TABLES TO app"
10331- )
10332- . unwrap_err( ) ,
10333- ParserError :: ParserError ( "IN SCHEMA specified more than once" . to_string( ) ) ,
10334- ) ;
10335-
10336- // `TABLES` is a keyword only here, so a table named `tables` still parses.
10337- pg ( ) . verified_stmt ( "GRANT SELECT ON TABLES TO app" ) ;
10338- assert_eq ! (
10339- pg( ) . parse_sql_statements( "ALTER DEFAULT PRIVILEGES FOR ROLE a" )
10340- . unwrap_err( ) ,
10341- ParserError :: ParserError ( "Expected: GRANT or REVOKE, found: EOF" . to_string( ) ) ,
10342- ) ;
10343- }
10344-
10345- #[ test]
10346- fn parse_alter_default_privileges_rejects_malformed_statements ( ) {
10347- for ( sql, expected) in [
10348- (
10349- "ALTER DEFAULT PRIVILEGES FOR ALL GRANT SELECT ON TABLES TO app" ,
10350- "Expected: one of ROLE or USER, found: ALL" ,
10351- ) ,
10352- (
10353- "ALTER DEFAULT PRIVILEGES FOR ROLE" ,
10354- "Expected: identifier, found: EOF" ,
10355- ) ,
10356- (
10357- "ALTER DEFAULT PRIVILEGES IN SCHEMA" ,
10358- "Expected: identifier, found: EOF" ,
10359- ) ,
10360- (
10361- "ALTER DEFAULT PRIVILEGES GRANT ON TABLES TO app" ,
10362- "Expected: a privilege keyword, found: ON" ,
10363- ) ,
10364- (
10365- "ALTER DEFAULT PRIVILEGES GRANT SELECT TO app" ,
10366- "Expected: ON, found: TO" ,
10367- ) ,
10368- (
10369- "ALTER DEFAULT PRIVILEGES GRANT SELECT ON INDEXES TO app" ,
10370- "Expected: TABLES, SEQUENCES, FUNCTIONS, ROUTINES, TYPES, SCHEMAS or LARGE OBJECTS, found: INDEXES" ,
10371- ) ,
10372- (
10373- "ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES" ,
10374- "Expected: TO, found: EOF" ,
10375- ) ,
10376- (
10377- "ALTER DEFAULT PRIVILEGES GRANT SELECT ON TABLES TO" ,
10378- "Expected: identifier, found: EOF" ,
10379- ) ,
10380- ] {
10381- assert_eq ! (
10382- pg( ) . parse_sql_statements( sql) . unwrap_err( ) ,
10383- ParserError :: ParserError ( expected. to_string( ) ) ,
10384- ) ;
10385- }
10386- }
10387-
10388- #[ test]
10389- fn display_alter_default_privileges_propagates_write_errors ( ) {
10390- use core:: fmt:: { self , Write } ;
10391-
10392- struct RejectingWriter ( & ' static str ) ;
10393-
10394- impl Write for RejectingWriter {
10395- fn write_str ( & mut self , value : & str ) -> fmt:: Result {
10396- if value. contains ( self . 0 ) {
10397- Err ( fmt:: Error )
10398- } else {
10399- Ok ( ( ) )
10400- }
10401- }
10402- }
10403-
10404- let grant = pg ( ) . verified_stmt (
10405- "ALTER DEFAULT PRIVILEGES FOR ROLE r IN SCHEMA s GRANT SELECT ON TABLES TO g WITH GRANT OPTION" ,
10406- ) ;
10407- for rejected in [ "D" , "r" , "g" , "W" ] {
10408- let mut writer = RejectingWriter ( rejected) ;
10409- assert_eq ! ( write!( writer, "{grant}" ) , Err ( fmt:: Error ) ) ;
10410- }
10411-
10412- let revoke = pg ( ) . verified_stmt (
10413- "ALTER DEFAULT PRIVILEGES REVOKE GRANT OPTION FOR SELECT ON TABLES FROM g CASCADE" ,
10414- ) ;
10415- for rejected in [ "K" , "N" , "g" , "CASCADE" ] {
10416- let mut writer = RejectingWriter ( rejected) ;
10417- assert_eq ! ( write!( writer, "{revoke}" ) , Err ( fmt:: Error ) ) ;
10418- }
10419- }
10420-
10421- #[ test]
10422- fn parse_alter_default_privileges_spans ( ) {
10423- for ( sql, start, end) in [
10424- (
10425- "ALTER DEFAULT PRIVILEGES FOR ROLE r IN SCHEMA s GRANT SELECT ON TABLES TO g" ,
10426- 35 ,
10427- 76 ,
10428- ) ,
10429- (
10430- "ALTER DEFAULT PRIVILEGES REVOKE SELECT ON TABLES FROM g" ,
10431- 55 ,
10432- 56 ,
10433- ) ,
10434- (
10435- "ALTER DEFAULT PRIVILEGES FOR ROLE r GRANT SELECT ON TABLES TO PUBLIC" ,
10436- 35 ,
10437- 36 ,
10438- ) ,
10439- ] {
10440- let statements = Parser :: parse_sql ( & PostgreSqlDialect { } , sql) . unwrap ( ) ;
10441- assert_eq ! (
10442- statements[ 0 ] . span( ) ,
10443- Span :: new( Location :: new( 1 , start) , Location :: new( 1 , end) ) ,
10444- "span for {sql}"
10445- ) ;
10446- }
10447- let sql = "ALTER DEFAULT PRIVILEGES REVOKE SELECT ON TABLES FROM 'bob'@'localhost'" ;
10448- let statements = Parser :: parse_sql ( & sqlparser:: dialect:: GenericDialect { } , sql) . unwrap ( ) ;
10449- assert_eq ! (
10450- statements[ 0 ] . span( ) ,
10451- Span :: new( Location :: new( 1 , 55 ) , Location :: new( 1 , 72 ) )
10452- ) ;
10453- }
0 commit comments