Hi Sergei, On 11/16/2017 08:27 AM, Sergei Golubchik wrote:
Hi, Alexander!
On Nov 15, Alexander Barkov wrote:
diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 512bf29..740e508 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -2221,6 +2239,8 @@ int partition_info::fix_parser_data(THD *thd) part_elem= it++; List_iterator<part_elem_value> list_val_it(part_elem->list_val_list); num_elements= part_elem->list_val_list.elements; + if (!num_elements && error_if_requires_values()) + DBUG_RETURN(true);
I thought the parser was supposed to ensure that VALUES was used where needed, so there should be no need to do additional checks here.
Why does the parser allow invalid syntax?
Unlike, CREATE TABLE, there's nothing we can do during parsing for ALTER TABLE. This syntax is generally valid, e.g. for HASH partitioning: ALTER TABLE t1 REORGANIZE PARTITION p1 INTO ( PARTITION p2, PARTITION p3 ); It's not valid only for RANGE or LIST partitioning. The current partition type becomes known only after parsing. So I extended partition_info::fix_parser_data() to validate the value list, depending on the partitioning type.
DBUG_ASSERT(part_type == RANGE_PARTITION ? num_elements == 1U : TRUE); for (j= 0; j < num_elements; j++)
Regards, Sergei Chief Architect MariaDB and security@mariadb.org