Skip to content

Commit c9b5fde

Browse files
committed
Add validation for empty value lists in PARTITION OF syntax.
1 parent f661171 commit c9b5fde

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/parser/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8088,16 +8088,25 @@ impl<'a> Parser<'a> {
80888088
if self.parse_keyword(Keyword::IN) {
80898089
// FOR VALUES IN (expr, ...)
80908090
self.expect_token(&Token::LParen)?;
8091+
if self.peek_token() == Token::RParen {
8092+
return self.expected("at least one value", self.peek_token());
8093+
}
80918094
let values = self.parse_comma_separated(Parser::parse_expr)?;
80928095
self.expect_token(&Token::RParen)?;
80938096
Ok(ForValues::In(values))
80948097
} else if self.parse_keyword(Keyword::FROM) {
80958098
// FOR VALUES FROM (...) TO (...)
80968099
self.expect_token(&Token::LParen)?;
8100+
if self.peek_token() == Token::RParen {
8101+
return self.expected("at least one value", self.peek_token());
8102+
}
80978103
let from = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
80988104
self.expect_token(&Token::RParen)?;
80998105
self.expect_keyword(Keyword::TO)?;
81008106
self.expect_token(&Token::LParen)?;
8107+
if self.peek_token() == Token::RParen {
8108+
return self.expected("at least one value", self.peek_token());
8109+
}
81018110
let to = self.parse_comma_separated(Parser::parse_partition_bound_value)?;
81028111
self.expect_token(&Token::RParen)?;
81038112
Ok(ForValues::From { from, to })

tests/sqlparser_postgres.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8142,4 +8142,31 @@ fn parse_create_table_partition_of_errors() {
81428142
err.contains("TO"),
81438143
"Expected error about missing TO clause, got: {err}"
81448144
);
8145+
8146+
let sql = "CREATE TABLE p PARTITION OF parent FOR VALUES IN ()";
8147+
let result = pg_and_generic().parse_sql_statements(sql);
8148+
assert!(result.is_err());
8149+
let err = result.unwrap_err().to_string();
8150+
assert!(
8151+
err.contains("at least one value"),
8152+
"Expected error about empty value list in IN clause, got: {err}"
8153+
);
8154+
8155+
let sql = "CREATE TABLE p PARTITION OF parent FOR VALUES FROM () TO (10)";
8156+
let result = pg_and_generic().parse_sql_statements(sql);
8157+
assert!(result.is_err());
8158+
let err = result.unwrap_err().to_string();
8159+
assert!(
8160+
err.contains("at least one value"),
8161+
"Expected error about empty FROM list, got: {err}"
8162+
);
8163+
8164+
let sql = "CREATE TABLE p PARTITION OF parent FOR VALUES FROM (1) TO ()";
8165+
let result = pg_and_generic().parse_sql_statements(sql);
8166+
assert!(result.is_err());
8167+
let err = result.unwrap_err().to_string();
8168+
assert!(
8169+
err.contains("at least one value"),
8170+
"Expected error about empty TO list, got: {err}"
8171+
);
81458172
}

0 commit comments

Comments
 (0)