@@ -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")]
2084720903fn test_visit_relations_in_table_target() {
0 commit comments