mirror of
https://github.com/MariaDB/server.git
synced 2025-10-27 17:08:14 +01:00
Type_handler::partition_field_append_value() erroneously
passed the address of my_collation_contextually_typed_binary
to conversion functions copy_and_convert() and my_convert().
This happened because generate_partition_syntax_for_frm()
was called from mysql_create_frm_image() in the stage when
the fields in List<Create_field> can still contain unresolved
contextual collations, like "binary" in the reported crash scenario:
ALTER TABLE t CHANGE COLUMN a a CHAR BINARY;
Fix:
1. Splitting mysql_prepare_create_table() into two parts:
- mysql_prepare_create_table_stage1() interates through
List<Create_field> and calls Create_field::prepare_stage1(),
which performs basic attribute initialization, including
context collation resolution.
- mysql_prepare_create_table_finalize() - the rest of the
old mysql_prepare_create_table() code.
2. Changing mysql_create_frm_image():
It now calls:
- mysql_prepare_create_table_stage1() in the very
beginning, before the partition related code.
- mysql_prepare_create_table_finalize() in the end,
instead of the old mysql_prepare_create_table() call
3. Adding mysql_prepare_create_table() as a wrapper
for two calls:
mysql_prepare_create_table_stage1() ||
mysql_prepare_create_table_finalize()
so the code stays unchanged in the other places
where mysql_prepare_create_table() was used.
4. Changing prototype for Type_handler::Column_definition_prepare_stage1()
Removing arguments:
- handler *file
- ulonglong table_flags
Adding a new argument instead:
- column_definition_type_t type
This allows to call Column_definition_prepare_stage1() and
therefore to call mysql_prepare_create_table_stage1()
before instantiation of a handler.
This simplifies the code, because in case of a partitioned table,
mysql_create_frm_image() creates a handler of the underlying
partition first, the frees it and created a ha_partition
instance instead.
mysql_prepare_create_table() before the fix was called with the final
(ha_partition) handler.
5. Moving parts of Column_definition_prepare_stage1() which
need a pointer to handler and table_flags to
Column_definition_prepare_stage2().
88 lines
3.4 KiB
Text
88 lines
3.4 KiB
Text
#
|
|
# Start of 10.5 tests
|
|
#
|
|
#
|
|
# MDEV-20856 Bad values in metadata views for partitions on VARBINARY
|
|
#
|
|
SET NAMES utf8;
|
|
SET @save_dbug = @@debug_dbug;
|
|
SET SESSION debug_dbug="+d,generate_partition_syntax_for_frm";
|
|
CREATE OR REPLACE TABLE t1 (a VARCHAR(10)) CHARACTER SET latin1
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN (_utf8'Ṡ'));
|
|
ERROR HY000: This partition function is not allowed
|
|
CREATE OR REPLACE TABLE t1 (a VARCHAR(10)) CHARACTER SET latin1
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN ('Ṡ'));
|
|
ERROR HY000: This partition function is not allowed
|
|
CREATE OR REPLACE TABLE t1 (a VARCHAR(10)) CHARACTER SET latin1
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN (_latin1 0xDF));
|
|
Warnings:
|
|
Note 1003 PARTITION BY LIST COLUMNS(`a`)
|
|
(PARTITION `p0` VALUES IN (_latin1 0xdf) ENGINE = MyISAM)
|
|
SELECT PARTITION_DESCRIPTION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
|
|
PARTITION_DESCRIPTION
|
|
'ß'
|
|
DROP TABLE t1;
|
|
CREATE OR REPLACE TABLE t1 (a VARCHAR(10)) CHARACTER SET latin1
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN (_utf8'ß'));
|
|
Warnings:
|
|
Note 1003 PARTITION BY LIST COLUMNS(`a`)
|
|
(PARTITION `p0` VALUES IN (_latin1 0xdf) ENGINE = MyISAM)
|
|
SELECT PARTITION_DESCRIPTION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
|
|
PARTITION_DESCRIPTION
|
|
'ß'
|
|
DROP TABLE t1;
|
|
CREATE OR REPLACE TABLE t1 (a VARCHAR(10)) CHARACTER SET latin1
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN ('ß'));
|
|
Warnings:
|
|
Note 1003 PARTITION BY LIST COLUMNS(`a`)
|
|
(PARTITION `p0` VALUES IN (_latin1 0xdf) ENGINE = MyISAM)
|
|
DROP TABLE t1;
|
|
CREATE OR REPLACE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN (_utf8'ß'));
|
|
Warnings:
|
|
Note 1003 PARTITION BY LIST COLUMNS(`a`)
|
|
(PARTITION `p0` VALUES IN (_utf8mb3 0xc39f) ENGINE = MyISAM)
|
|
SELECT PARTITION_DESCRIPTION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
|
|
PARTITION_DESCRIPTION
|
|
'ß'
|
|
DROP TABLE t1;
|
|
CREATE OR REPLACE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN ('ß'));
|
|
Warnings:
|
|
Note 1003 PARTITION BY LIST COLUMNS(`a`)
|
|
(PARTITION `p0` VALUES IN (_utf8mb3 0xc39f) ENGINE = MyISAM)
|
|
SELECT PARTITION_DESCRIPTION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
|
|
PARTITION_DESCRIPTION
|
|
'ß'
|
|
DROP TABLE t1;
|
|
CREATE OR REPLACE TABLE t1 (a VARBINARY(10)) CHARACTER SET utf8
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN (0xFF));
|
|
Warnings:
|
|
Note 1003 PARTITION BY LIST COLUMNS(`a`)
|
|
(PARTITION `p0` VALUES IN (_binary 0xff) ENGINE = MyISAM)
|
|
SELECT PARTITION_DESCRIPTION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
|
|
PARTITION_DESCRIPTION
|
|
_binary 0xff
|
|
DROP TABLE t1;
|
|
CREATE OR REPLACE TABLE t1 (a DATE) CHARACTER SET utf8
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN (FROM_DAYS(NULL)));
|
|
Warnings:
|
|
Note 1003 PARTITION BY LIST COLUMNS(`a`)
|
|
(PARTITION `p0` VALUES IN (NULL) ENGINE = MyISAM)
|
|
SELECT PARTITION_DESCRIPTION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
|
|
PARTITION_DESCRIPTION
|
|
NULL
|
|
DROP TABLE t1;
|
|
CREATE OR REPLACE TABLE t1 (a DATE) CHARACTER SET utf8
|
|
PARTITION BY LIST COLUMNS (a) (PARTITION p0 VALUES IN (FROM_DAYS(100)));
|
|
Warnings:
|
|
Note 1003 PARTITION BY LIST COLUMNS(`a`)
|
|
(PARTITION `p0` VALUES IN (_latin1 0x303030302d30302d3030) ENGINE = MyISAM)
|
|
SELECT PARTITION_DESCRIPTION FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
|
|
PARTITION_DESCRIPTION
|
|
'0000-00-00'
|
|
DROP TABLE t1;
|
|
SET debug_dbug=@save_dbug;
|
|
#
|
|
# End of 10.5 tests
|
|
#
|