Bug #109830 Update the table with sub-partition, and the result is wrong
| Submitted: | 29 Jan 2023 10:07 | Modified: | 30 Jan 2023 7:40 |
|---|---|---|---|
| Reporter: | hao chen | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | MySQL Server: DML | Severity: | S2 (Serious) |
| Version: | mysql 8.0.29 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | update partiton table | ||
[30 Jan 2023 7:40]
MySQL Verification Team
Hello hao chen, Thank you for the bug report. Imho this is not a bug. Your update query "update t4 set range_key=199 and hash_key = 6 where range_key=99" is actually interpreted and executed as "update table_name set range_key = (199 and hash_key=6) where range_key=99" For example in your very UPDATE case: mysql> select (199 and 1 = 6); +-----------------+ | (199 and 1 = 6) | +-----------------+ | 0 | +-----------------+ 1 row in set (0.00 sec) mysql> update t4 set range_key=0 where range_key=99; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t4; +-----------+----------+ | range_key | hash_key | +-----------+----------+ | 0 | 1 | +-----------+----------+ 1 row in set (0.00 sec) UPDATE syntax, please see https://dev.mysql.com/doc/refman/8.0/en/update.html So, ideally your UPDATE should be: mysql> drop table t4; Query OK, 0 rows affected (0.03 sec) mysql> create table t4( -> range_key int, -> hash_key int -> ) partition by range(range_key) -> subpartition by hash(hash_key) -> ( -> partition p1 values less than(100) -> (subpartition h1, subpartition h2), -> partition p2 values less than(200) -> (subpartition h11, subpartition h22) -> ); Query OK, 0 rows affected (0.06 sec) mysql> insert into t4 values (99, 1); Query OK, 1 row affected (0.00 sec) mysql> select * from t4; +-----------+----------+ | range_key | hash_key | +-----------+----------+ | 99 | 1 | +-----------+----------+ 1 row in set (0.00 sec) mysql> update t4 set range_key=199, hash_key = 6 where range_key=99; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t4; +-----------+----------+ | range_key | hash_key | +-----------+----------+ | 199 | 6 | +-----------+----------+ 1 row in set (0.00 sec) Also, please see Bug #82647 , Bug #7068 , Bug #19398 , Bug #26405 regards, Umesh
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.057 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: Execute the following sql in sequence, and the result of the last sql is unexpected。 create table t4( range_key int, hash_key int ) partition by range(range_key) subpartition by hash(hash_key) ( partition p1 values less than(100) (subpartition h1, subpartition h2), partition p2 values less than(200) (subpartition h11, subpartition h22) ); insert into t4 values (99, 1); select * from t4; update t4 set range_key=199 and hash_key = 6 where range_key=99; select * from t4; How to repeat: mysql> create database aa; Query OK, 1 row affected (0.01 sec) mysql> use aa; Database changed mysql> create table t4( -> range_key int, -> hash_key int -> ) partition by range(range_key) -> subpartition by hash(hash_key) -> ( -> partition p1 values less than(100) -> (subpartition h1, subpartition h2), -> partition p2 values less than(200) -> (subpartition h11, subpartition h22) -> ); Query OK, 0 rows affected (0.39 sec) mysql> insert into t4 values (99, 1); Query OK, 1 row affected (0.02 sec) mysql> select * from t4; +-----------+----------+ | range_key | hash_key | +-----------+----------+ | 99 | 1 | +-----------+----------+ 1 row in set (0.00 sec) mysql> update t4 set range_key=199 and hash_key = 6 where range_key=99; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t4; +-----------+----------+ | range_key | hash_key | +-----------+----------+ | 0 | 1 | +-----------+----------+ 1 row in set (0.00 sec) mysql> Suggested fix: The final result of executing sql should be: 【199, 6】, which is not the expected result at present。