From c9b5fde29a7ea0b4d6cd069d2c3d1b1afacea85f Mon Sep 17 00:00:00 2001 From: Filipe Guerreiro Date: Tue, 23 Dec 2025 09:45:32 +0900 Subject: [PATCH] Add validation for empty value lists in PARTITION OF syntax. --- src/parser/mod.rs | 9 +++++++++ tests/sqlparser_postgres.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index d85f96af..9a88cc47 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -8088,16 +8088,25 @@ impl<'a> Parser<'a> { if self.parse_keyword(Keyword::IN) { // FOR VALUES IN (expr, ...) self.expect_token(&Token::LParen)?; + if self.peek_token() == Token::RParen { + return self.expected("at least one value", self.peek_token()); + } let values = self.parse_comma_separated(Parser::parse_expr)?; self.expect_token(&Token::RParen)?; Ok(ForValues::In(values)) } else if self.parse_keyword(Keyword::FROM) { // FOR VALUES FROM (...) TO (...) self.expect_token(&Token::LParen)?; + if self.peek_token() == Token::RParen { + return self.expected("at least one value", self.peek_token()); + } let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?; self.expect_token(&Token::RParen)?; self.expect_keyword(Keyword::TO)?; self.expect_token(&Token::LParen)?; + if self.peek_token() == Token::RParen { + return self.expected("at least one value", self.peek_token()); + } let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?; self.expect_token(&Token::RParen)?; Ok(ForValues::From { from, to }) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 3669196d..6974d07a 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -8142,4 +8142,31 @@ fn parse_create_table_partition_of_errors() { err.contains("TO"), "Expected error about missing TO clause, got: {err}" ); + + let sql = "CREATE TABLE p PARTITION OF parent FOR VALUES IN ()"; + let result = pg_and_generic().parse_sql_statements(sql); + assert!(result.is_err()); + let err = result.unwrap_err().to_string(); + assert!( + err.contains("at least one value"), + "Expected error about empty value list in IN clause, got: {err}" + ); + + let sql = "CREATE TABLE p PARTITION OF parent FOR VALUES FROM () TO (10)"; + let result = pg_and_generic().parse_sql_statements(sql); + assert!(result.is_err()); + let err = result.unwrap_err().to_string(); + assert!( + err.contains("at least one value"), + "Expected error about empty FROM list, got: {err}" + ); + + let sql = "CREATE TABLE p PARTITION OF parent FOR VALUES FROM (1) TO ()"; + let result = pg_and_generic().parse_sql_statements(sql); + assert!(result.is_err()); + let err = result.unwrap_err().to_string(); + assert!( + err.contains("at least one value"), + "Expected error about empty TO list, got: {err}" + ); }