Commit 7fe764b1 authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-32973 SHOW TABLES LIKE shows temporary tables with non-matching names

* compare both db and table name
* use the correct charset
parent 4a35a3b5
......@@ -271,3 +271,26 @@ CREATE TABLE t1 (a Mariadb_schema.date);
ERROR HY000: Unknown data type: 'Mariadb_schema.date'
CREATE TABLE t1 (a mariadb_schema.date);
DROP TABLE t1;
# End of 10.3 tests
#
# MDEV-32973 SHOW TABLES LIKE shows temporary tables with non-matching names
#
create temporary table t1 (a int);
create temporary table t2 (a int);
create temporary table T1 (a int);
show tables like 't1';
Tables_in_test (t1)
t1
select table_name from information_schema.tables where table_schema='test'
and table_name='t1';
table_name
t1
show tables like '_1';
Tables_in_test (_1)
T1
t1
show tables like 't%';
Tables_in_test (t%)
t2
t1
# End of 11.2 tests
......@@ -146,3 +146,19 @@ CREATE TABLE t1 (a Mariadb_schema.date);
CREATE TABLE t1 (a mariadb_schema.date);
DROP TABLE t1;
--echo # End of 10.3 tests
--echo #
--echo # MDEV-32973 SHOW TABLES LIKE shows temporary tables with non-matching names
--echo #
create temporary table t1 (a int);
create temporary table t2 (a int);
create temporary table T1 (a int);
show tables like 't1';
select table_name from information_schema.tables where table_schema='test'
and table_name='t1';
show tables like '_1';
show tables like 't%';
--echo # End of 11.2 tests
......@@ -377,3 +377,36 @@ SHOW CREATE DATABASE db1;
Database Create Database
db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */
DROP DATABASE Db1;
USE test;
# End of 10.4 tests
#
# MDEV-32973 SHOW TABLES LIKE shows temporary tables with non-matching names
#
create temporary table t2 (a int);
create temporary table T1 (a int);
show tables;
Tables_in_test
t1
t2
show tables like 't1';
Tables_in_test (t1)
t1
show tables like 'T1';
Tables_in_test (T1)
t1
select table_name from information_schema.tables where table_schema='test'
and table_name='t1';
table_name
t1
select table_name from information_schema.tables where table_schema='test'
and table_name='T1';
table_name
t1
show tables like '_1';
Tables_in_test (_1)
t1
show tables like 't%';
Tables_in_test (t%)
t1
t2
# End of 11.2 tests
......@@ -328,3 +328,24 @@ ALTER DATABASE Db1 DEFAULT CHARACTER SET utf8;
SHOW CREATE DATABASE Db1;
SHOW CREATE DATABASE db1;
DROP DATABASE Db1;
USE test;
--echo # End of 10.4 tests
--echo #
--echo # MDEV-32973 SHOW TABLES LIKE shows temporary tables with non-matching names
--echo #
# temp tables don't preserve the letter case despite lower-case-table-names=2
create temporary table t2 (a int);
create temporary table T1 (a int);
show tables;
show tables like 't1';
show tables like 'T1';
select table_name from information_schema.tables where table_schema='test'
and table_name='t1';
select table_name from information_schema.tables where table_schema='test'
and table_name='T1';
show tables like '_1';
show tables like 't%';
--echo # End of 11.2 tests
......@@ -343,7 +343,6 @@ TEST-INFO: SLAVE: The INSERT is committed (Succeeded)
connection master;
SHOW TABLES LIKE 't2';
Tables_in_mysqltest1 (t2)
t23
connection slave;
SHOW TABLES LIKE 't2';
Tables_in_mysqltest1 (t2)
......
......@@ -5215,6 +5215,20 @@ class Warnings_only_error_handler : public Internal_error_handler
};
static bool wildcmpcs(const LEX_CSTRING &str, const LEX_CSTRING &pat)
{
return table_alias_charset->wildcmp(str.str, str.str + str.length,
pat.str, pat.str + pat.length,
'\\', '_', '%');
}
static bool strcmpcs(const LEX_CSTRING &str, const LEX_CSTRING &pat)
{
return table_alias_charset->strnncoll(str.str, str.length,
pat.str, pat.length, 0);
}
/**
@brief Fill I_S tables whose data are retrieved
from frm files and storage engine
......@@ -5346,15 +5360,20 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
{
All_tmp_tables_list::Iterator it(*open_tables_state_backup.temporary_tables);
TMP_TABLE_SHARE *share_temp;
const char *lookup_db= plan->lookup_field_vals.db_value.str;
int (*cmp)(CHARSET_INFO *, const char *, const char *)=
plan->lookup_field_vals.wild_db_value
? wild_case_compare : system_charset_info->coll->strcasecmp;
bool (*cmp_db)(const LEX_CSTRING &, const LEX_CSTRING &)=
plan->lookup_field_vals.wild_db_value ? wildcmpcs : strcmpcs;
bool (*cmp_table)(const LEX_CSTRING &, const LEX_CSTRING &)=
plan->lookup_field_vals.wild_table_value ? wildcmpcs : strcmpcs;
while ((share_temp= it++))
{
if (lookup_db)
if (plan->lookup_field_vals.db_value.str)
{
if (cmp_db(share_temp->db, plan->lookup_field_vals.db_value))
continue;
}
if (plan->lookup_field_vals.table_value.str)
{
if (cmp(system_charset_info, share_temp->db.str, lookup_db))
if (cmp_table(share_temp->table_name, plan->lookup_field_vals.table_value))
continue;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment