mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 12:56:14 +01:00 
			
		
		
		
	Also fixes MDEV-32025 Crashes in MDL_key::mdl_key_init with lower-case-table-names=2
Change overview:
- In changes made in MDEV-31948, MDEV-31982 the code path
  which originaly worked only in case of lower-case-table-names==1
  also started to work in case of lower-case-table-names==2 in a mistake.
  Restoring the original check_db_name() compatible behavior
  (but without re-using check_db_name() itself).
- MDEV-31978 erroneously added a wrong DBUG_ASSERT. Removing.
Details:
- In mysql_change_db() the database name should be lower-cased only
  in case of lower_case_table_names==1. It should not be lower-cased
  for lower_case_table_names==2. The problem was caused by MDEV-31948.
  The new code version restored the pre-MDEV-31948 behavior, which
  used check_db_name() behavior.
- Passing lower_case_table_names==1 instead of just lower_case_table_names
  to the "casedn" parameter to DBNameBuffer constructor in sql_parse.cc
  The database name should not be lower-cased for lower_case_table_names==2.
  This restores pre-MDEV-31982 behavioir which used check_db_name() here.
- Adding a new data type Lex_ident_db_normalized, it stores database
  names which are both checked and normalized to lower case
  in case lower_case_table_names==1 and lower_case_table_names==2.
- Changing the data type for the "db" parameter to Lex_ident_db_normalized in
  lock_schema_name(), lock_db_routines(), find_db_tables_and_rm_known_files().
  This is to avoid incorrectly passing a non-normalized name in the future.
- Restoring the database name normalization in mysql_create_db_internal()
  and mysql_rm_db_internal() before calling lock_schema_name().
  The problem was caused MDEV-31982.
- Adding database name normalization in mysql_alter_db_internal()
  and mysql_upgrade_db(). This fixes MDEV-32026.
- Removing a wrong assert in Create_sp_func::create_with_db() was incorrect:
    DBUG_ASSERT(Lex_ident_fs(*db).ok_for_lower_case_names());
  The database name comes to here checked, but not normalized
  to lower case with lower-case-table-names=2.
  The assert was erroneously added by MDEV-31978.
- Recording lowercase_tables2.results and lowercase_tables4.results
  according to
    MDEV-29446 Change SHOW CREATE TABLE to display default collations
  These tests are skipped on buildbot on all platforms, so this change
  was forgotten in the patch for MDEV-29446.
		
	
			
		
			
				
	
	
		
			118 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Text
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Text
		
	
	
		
			Executable file
		
	
	
	
	
#
 | 
						|
# Bug#46941 crash with lower_case_table_names=2 and
 | 
						|
#           foreign data dictionary confusion
 | 
						|
#
 | 
						|
CREATE DATABASE XY;
 | 
						|
USE XY;
 | 
						|
set @old_table_open_cache=@@table_open_cache;
 | 
						|
set global table_open_cache = 512;
 | 
						|
set global table_open_cache = @old_table_open_cache;
 | 
						|
DROP DATABASE XY;
 | 
						|
USE TEST;
 | 
						|
#
 | 
						|
# Bug55222 Mysqldump table names case bug in REFERENCES clause
 | 
						|
# InnoDB did not handle lower_case_table_names=2 for
 | 
						|
# foreign_table_names and referenced_table_names.
 | 
						|
#
 | 
						|
SHOW VARIABLES LIKE 'lower_case_table_names';
 | 
						|
Variable_name	Value
 | 
						|
lower_case_table_names	2
 | 
						|
DROP TABLE IF EXISTS `Table2`;
 | 
						|
DROP TABLE IF EXISTS `Table1`;
 | 
						|
CREATE TABLE `Table1`(c1 INT PRIMARY KEY) ENGINE=InnoDB;
 | 
						|
CREATE TABLE `Table2`(c1 INT PRIMARY KEY, c2 INT) ENGINE=InnoDB;
 | 
						|
ALTER TABLE `Table2` ADD CONSTRAINT fk1 FOREIGN KEY(c2) REFERENCES `Table1`(c1);
 | 
						|
SHOW CREATE TABLE `Table2`;
 | 
						|
Table	Table2
 | 
						|
Create Table	CREATE TABLE `Table2` (
 | 
						|
  `c1` int(11) NOT NULL,
 | 
						|
  `c2` int(11) DEFAULT NULL,
 | 
						|
  PRIMARY KEY (`c1`),
 | 
						|
  KEY `fk1` (`c2`),
 | 
						|
  CONSTRAINT `fk1` FOREIGN KEY (`c2`) REFERENCES `Table1` (`c1`)
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA='test';
 | 
						|
CONSTRAINT_CATALOG	def
 | 
						|
CONSTRAINT_SCHEMA	test
 | 
						|
CONSTRAINT_NAME	fk1
 | 
						|
UNIQUE_CONSTRAINT_CATALOG	def
 | 
						|
UNIQUE_CONSTRAINT_SCHEMA	test
 | 
						|
UNIQUE_CONSTRAINT_NAME	PRIMARY
 | 
						|
MATCH_OPTION	NONE
 | 
						|
UPDATE_RULE	RESTRICT
 | 
						|
DELETE_RULE	RESTRICT
 | 
						|
TABLE_NAME	Table2
 | 
						|
REFERENCED_TABLE_NAME	Table1
 | 
						|
DROP TABLE `Table2`;
 | 
						|
DROP TABLE `Table1`;
 | 
						|
DROP TABLE IF EXISTS Product_Order;
 | 
						|
DROP TABLE IF EXISTS Product;
 | 
						|
DROP TABLE IF EXISTS Customer;
 | 
						|
CREATE TABLE Product (Category INT NOT NULL, Id INT NOT NULL,
 | 
						|
Price DECIMAL, PRIMARY KEY(Category, Id)) ENGINE=InnoDB;
 | 
						|
CREATE TABLE Customer (Id INT NOT NULL, PRIMARY KEY (Id)) ENGINE=InnoDB;
 | 
						|
CREATE TABLE Product_Order (No INT NOT NULL AUTO_INCREMENT,
 | 
						|
Product_Category INT NOT NULL,
 | 
						|
Product_Id INT NOT NULL,
 | 
						|
Customer_Id INT NOT NULL,
 | 
						|
PRIMARY KEY(No),
 | 
						|
INDEX (Product_Category, Product_Id),
 | 
						|
FOREIGN KEY (Product_Category, Product_Id)
 | 
						|
REFERENCES Product(Category, Id) ON UPDATE CASCADE ON DELETE RESTRICT,
 | 
						|
INDEX (Customer_Id),
 | 
						|
FOREIGN KEY (Customer_Id)
 | 
						|
REFERENCES Customer(Id)
 | 
						|
) ENGINE=INNODB;
 | 
						|
SHOW CREATE TABLE Product_Order;
 | 
						|
Table	Product_Order
 | 
						|
Create Table	CREATE TABLE `Product_Order` (
 | 
						|
  `No` int(11) NOT NULL AUTO_INCREMENT,
 | 
						|
  `Product_Category` int(11) NOT NULL,
 | 
						|
  `Product_Id` int(11) NOT NULL,
 | 
						|
  `Customer_Id` int(11) NOT NULL,
 | 
						|
  PRIMARY KEY (`No`),
 | 
						|
  KEY `Product_Category` (`Product_Category`,`Product_Id`),
 | 
						|
  KEY `Customer_Id` (`Customer_Id`),
 | 
						|
  CONSTRAINT `product_order_ibfk_1` FOREIGN KEY (`Product_Category`, `Product_Id`) REFERENCES `Product` (`Category`, `Id`) ON UPDATE CASCADE,
 | 
						|
  CONSTRAINT `product_order_ibfk_2` FOREIGN KEY (`Customer_Id`) REFERENCES `Customer` (`Id`)
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
SHOW CREATE TABLE Product;
 | 
						|
Table	Product
 | 
						|
Create Table	CREATE TABLE `Product` (
 | 
						|
  `Category` int(11) NOT NULL,
 | 
						|
  `Id` int(11) NOT NULL,
 | 
						|
  `Price` decimal(10,0) DEFAULT NULL,
 | 
						|
  PRIMARY KEY (`Category`,`Id`)
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
SHOW CREATE TABLE Customer;
 | 
						|
Table	Customer
 | 
						|
Create Table	CREATE TABLE `Customer` (
 | 
						|
  `Id` int(11) NOT NULL,
 | 
						|
  PRIMARY KEY (`Id`)
 | 
						|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 | 
						|
SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA='test';
 | 
						|
CONSTRAINT_CATALOG	def
 | 
						|
CONSTRAINT_SCHEMA	test
 | 
						|
CONSTRAINT_NAME	product_order_ibfk_1
 | 
						|
UNIQUE_CONSTRAINT_CATALOG	def
 | 
						|
UNIQUE_CONSTRAINT_SCHEMA	test
 | 
						|
UNIQUE_CONSTRAINT_NAME	PRIMARY
 | 
						|
MATCH_OPTION	NONE
 | 
						|
UPDATE_RULE	CASCADE
 | 
						|
DELETE_RULE	RESTRICT
 | 
						|
TABLE_NAME	Product_Order
 | 
						|
REFERENCED_TABLE_NAME	Product
 | 
						|
CONSTRAINT_CATALOG	def
 | 
						|
CONSTRAINT_SCHEMA	test
 | 
						|
CONSTRAINT_NAME	product_order_ibfk_2
 | 
						|
UNIQUE_CONSTRAINT_CATALOG	def
 | 
						|
UNIQUE_CONSTRAINT_SCHEMA	test
 | 
						|
UNIQUE_CONSTRAINT_NAME	PRIMARY
 | 
						|
MATCH_OPTION	NONE
 | 
						|
UPDATE_RULE	RESTRICT
 | 
						|
DELETE_RULE	RESTRICT
 | 
						|
TABLE_NAME	Product_Order
 | 
						|
REFERENCED_TABLE_NAME	Customer
 | 
						|
DROP TABLE Product_Order;
 | 
						|
DROP TABLE Product;
 | 
						|
DROP TABLE Customer;
 |