Skip to content

Commit ba1d3c7

Browse files
Place regression tests beside related syntax cases
1 parent 970c5bf commit ba1d3c7

1 file changed

Lines changed: 186 additions & 186 deletions

File tree

‎tests/sqlparser_postgres.rs‎

Lines changed: 186 additions & 186 deletions
Original file line numberDiff line numberDiff line change
@@ -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]
48185004
fn 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

Comments
 (0)