@@ -22480,11 +22480,74 @@ fn parse_revoke_role() {
2248022480 );
2248122481
2248222482 all_dialects().verified_stmt("REVOKE bypasser FROM anon RESTRICT");
22483+ all_dialects().verified_stmt("REVOKE bypasser FROM anon");
2248322484
2248422485 assert_eq!(
2248522486 all_dialects()
2248622487 .parse_sql_statements("REVOKE bypasser ON t FROM anon")
2248722488 .unwrap_err(),
2248822489 ParserError::ParserError("Expected: a privilege keyword, found: bypasser".to_string())
2248922490 );
22491+ for (sql, expected) in [
22492+ ("REVOKE bypasser FROM", "Expected: identifier, found: EOF"),
22493+ (
22494+ "REVOKE bypasser FROM anon GRANTED BY",
22495+ "Expected: identifier, found: EOF",
22496+ ),
22497+ ] {
22498+ assert_eq!(
22499+ all_dialects().parse_sql_statements(sql).unwrap_err(),
22500+ ParserError::ParserError(expected.to_string()),
22501+ "{sql}"
22502+ );
22503+ }
22504+
22505+ let dialect = GenericDialect {};
22506+ for (sql, expected) in [
22507+ (
22508+ "1 FROM anon",
22509+ "Expected: identifier, found: 1 at Line: 1, Column: 1",
22510+ ),
22511+ (
22512+ "bypasser TO anon",
22513+ "Expected: FROM, found: TO at Line: 1, Column: 10",
22514+ ),
22515+ ] {
22516+ let err = Parser::new(&dialect)
22517+ .try_with_sql(sql)
22518+ .and_then(|mut parser| parser.parse_revoke_role())
22519+ .unwrap_err();
22520+ assert_eq!(err, ParserError::ParserError(expected.to_string()), "{sql}");
22521+ }
22522+ }
22523+
22524+ #[test]
22525+ fn display_revoke_role_propagates_write_errors() {
22526+ use core::fmt::{self, Write};
22527+
22528+ struct RejectingWriter<'a>(&'a str);
22529+
22530+ impl Write for RejectingWriter<'_> {
22531+ fn write_str(&mut self, value: &str) -> fmt::Result {
22532+ if value.contains(self.0) {
22533+ Err(fmt::Error)
22534+ } else {
22535+ Ok(())
22536+ }
22537+ }
22538+ }
22539+
22540+ let statement =
22541+ all_dialects().verified_stmt("REVOKE bypasser FROM anon GRANTED BY admin CASCADE");
22542+ for rejected in [
22543+ "REVOKE ",
22544+ "bypasser",
22545+ "anon",
22546+ " GRANTED BY ",
22547+ "admin",
22548+ "CASCADE",
22549+ ] {
22550+ let mut writer = RejectingWriter(rejected);
22551+ assert_eq!(write!(writer, "{statement}"), Err(fmt::Error));
22552+ }
2249022553}
0 commit comments