Skip to content

Commit db5901d

Browse files
Tests: Cover role-revoke errors and Display propagation
1 parent cd1ac7f commit db5901d

1 file changed

Lines changed: 63 additions & 0 deletions

File tree

‎tests/sqlparser_common.rs‎

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)