Skip to content

Commit ed9c13d

Browse files
Cover table-expression membership error boundaries
1 parent 601d7ca commit ed9c13d

1 file changed

Lines changed: 56 additions & 0 deletions

File tree

‎tests/sqlparser_common.rs‎

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20842,6 +20842,62 @@ fn parse_in_table_expression() {
2084220842
dialects.verified_stmt("SELECT a IN (SELECT b FROM u) FROM t");
2084320843
}
2084420844

20845+
/// Malformed table and table-function targets of `IN` keep their precise
20846+
/// parse errors.
20847+
#[test]
20848+
fn parse_in_table_expression_malformed_targets() {
20849+
let dialects = all_dialects_where(|d| d.supports_in_table_expression());
20850+
for (sql, expected) in [
20851+
// A dangling dot leaves the qualified name without its last part.
20852+
("SELECT a IN t.", "Expected: identifier, found: EOF"),
20853+
// A trailing comma leaves the next argument without an expression.
20854+
("SELECT a IN f(x,)", "Expected: an expression, found: )"),
20855+
// The argument list never closes its parenthesis.
20856+
("SELECT a IN f(1, 2", "Expected: ), found: EOF"),
20857+
] {
20858+
assert_eq!(
20859+
ParserError::ParserError(expected.to_string()),
20860+
dialects.parse_sql_statements(sql).unwrap_err(),
20861+
"{sql}"
20862+
);
20863+
}
20864+
}
20865+
20866+
/// Display of an `IN` table target propagates formatter errors from the
20867+
/// name and the argument list writes.
20868+
#[test]
20869+
fn display_in_table_target_propagates_formatter_errors() {
20870+
use core::fmt::{self, Write};
20871+
20872+
struct RejectingWriter(char);
20873+
20874+
impl Write for RejectingWriter {
20875+
fn write_str(&mut self, value: &str) -> fmt::Result {
20876+
if value.contains(self.0) {
20877+
Err(fmt::Error)
20878+
} else {
20879+
Ok(())
20880+
}
20881+
}
20882+
}
20883+
20884+
let plain = InTarget::Table {
20885+
name: ObjectName::from(Ident::new("t")),
20886+
args: None,
20887+
};
20888+
let mut writer = RejectingWriter('t');
20889+
assert_eq!(write!(writer, "{plain}"), Err(fmt::Error));
20890+
20891+
let function = InTarget::Table {
20892+
name: ObjectName::from(Ident::new("t")),
20893+
args: Some(vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(
20894+
Expr::value(number("1")),
20895+
))]),
20896+
};
20897+
let mut writer = RejectingWriter('1');
20898+
assert_eq!(write!(writer, "{function}"), Err(fmt::Error));
20899+
}
20900+
2084520901
#[test]
2084620902
#[cfg(feature = "visitor")]
2084720903
fn test_visit_relations_in_table_target() {

0 commit comments

Comments
 (0)