mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-21695 Server crashes in TABLE::evaluate_update_default_function upon UPDATE on temporary table
copy_data_between_tables() sets to->s->default_fields to 0, as a part of the code disabling ON UPDATE actions for all old fields (so ON UPDATE is enable only for new fields during copying). After the actual copying, copy_data_between_tables() did not restore to->s->default_fields to the original value. As a result, the TABLE_SHARE to->s was left in a wrong state after copy_data_between_tables() and further open_table_from_share() using this TABLE_SHARE did not populate TABLE::default_field, which further made TABLE::evaluate_update_default_function() crash on access to NULL pointer. Fix: Changing copy_data_between_tables() to restore to->s->default_fields to its original value after the copying loop.
This commit is contained in:
@ -584,3 +584,21 @@ ALTER TABLE t1 CHANGE no_such_col1 col1 BIGINT NULL;
|
||||
ERROR 42S22: Unknown column 'no_such_col1' in 't1'
|
||||
TRUNCATE TABLE t1;
|
||||
DROP TEMPORARY TABLE t1;
|
||||
#
|
||||
# MDEV-21695 Server crashes in TABLE::evaluate_update_default_function upon UPDATE on temporary table
|
||||
#
|
||||
SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30');
|
||||
CREATE TEMPORARY TABLE t1 (a DATETIME ON UPDATE CURRENT_TIMESTAMP);
|
||||
ALTER TABLE t1 ADD b INT;
|
||||
INSERT INTO t1 (b) VALUES (1),(2);
|
||||
ALTER TABLE t1 CHANGE COLUMN x xx INT;
|
||||
ERROR 42S22: Unknown column 'x' in 't1'
|
||||
UPDATE t1 SET b = 3;
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
2001-01-01 10:20:30 3
|
||||
2001-01-01 10:20:30 3
|
||||
DROP TEMPORARY TABLE t1;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
|
Reference in New Issue
Block a user