mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	 4703638775
			
		
	
	
	4703638775
	
	
	
		
			
			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
 | |
| #
 |