mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-28343: sys.create_synonym_db fails with ER_VIEW_SELECT_TMPTABLE when schema contains temporary tables
- MDEV-28342 raised the error in case temporary table shadows base table - Now we are allowed to shadow base tables with temporary tables and `sys.create_synonym_db()` can easily check for existance of temporary table and ignore view creation, since it is not supported to create view from temporary table. Reviewed-by: <monty@mariadb.org>, <vicentiu@mariadb.org>
This commit is contained in:
committed by
Sergei Golubchik
parent
91bfc76fe1
commit
1fb4828b28
@@ -61,6 +61,37 @@ create table t (b int);
|
|||||||
create table b(a int);
|
create table b(a int);
|
||||||
create temporary table b (a int);
|
create temporary table b (a int);
|
||||||
call sys.create_synonym_db('db','db_copy');
|
call sys.create_synonym_db('db','db_copy');
|
||||||
ERROR HY000: Table`db`.`b`shadows base table. View cannot be created! Terminating!
|
summary
|
||||||
|
Created 2 views in the `db_copy` database
|
||||||
|
use db_copy;
|
||||||
|
show tables;
|
||||||
|
Tables_in_db_copy
|
||||||
|
a
|
||||||
|
t
|
||||||
drop database db;
|
drop database db;
|
||||||
drop database db_copy;
|
drop database db_copy;
|
||||||
|
# MDEV-28343: sys.create_synonym_db fails with ER_VIEW_SELECT_TMPTABLE
|
||||||
|
# when schema contains temporary tables
|
||||||
|
#
|
||||||
|
create database mytestdb;
|
||||||
|
use mytestdb;
|
||||||
|
create table t (b int);
|
||||||
|
create temporary table tmp (a int);
|
||||||
|
call sys.create_synonym_db('mytestdb','db_syn1');
|
||||||
|
summary
|
||||||
|
Created 1 view in the `db_syn1` database
|
||||||
|
use db_syn1;
|
||||||
|
show tables;
|
||||||
|
Tables_in_db_syn1
|
||||||
|
t
|
||||||
|
drop database db_syn1;
|
||||||
|
use mytestdb;
|
||||||
|
create temporary table t (b int);
|
||||||
|
call sys.create_synonym_db('mytestdb','db_syn1');
|
||||||
|
summary
|
||||||
|
Created 0 views in the `db_syn1` database
|
||||||
|
use db_syn1;
|
||||||
|
show tables;
|
||||||
|
Tables_in_db_syn1
|
||||||
|
drop database mytestdb;
|
||||||
|
drop database db_syn1;
|
||||||
|
@@ -62,8 +62,34 @@ create table a(a int);
|
|||||||
create table t (b int);
|
create table t (b int);
|
||||||
create table b(a int);
|
create table b(a int);
|
||||||
create temporary table b (a int);
|
create temporary table b (a int);
|
||||||
--error ER_SIGNAL_EXCEPTION
|
|
||||||
call sys.create_synonym_db('db','db_copy');
|
call sys.create_synonym_db('db','db_copy');
|
||||||
|
|
||||||
|
use db_copy;
|
||||||
|
show tables;
|
||||||
|
|
||||||
drop database db;
|
drop database db;
|
||||||
drop database db_copy;
|
drop database db_copy;
|
||||||
|
--echo # MDEV-28343: sys.create_synonym_db fails with ER_VIEW_SELECT_TMPTABLE
|
||||||
|
--echo # when schema contains temporary tables
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create database mytestdb;
|
||||||
|
use mytestdb;
|
||||||
|
create table t (b int);
|
||||||
|
# This temporary table will not be created as an view in synonym db
|
||||||
|
create temporary table tmp (a int);
|
||||||
|
call sys.create_synonym_db('mytestdb','db_syn1');
|
||||||
|
use db_syn1;
|
||||||
|
show tables;
|
||||||
|
drop database db_syn1;
|
||||||
|
|
||||||
|
use mytestdb;
|
||||||
|
# This temporary table will shadow the base table and no views will be created
|
||||||
|
create temporary table t (b int);
|
||||||
|
call sys.create_synonym_db('mytestdb','db_syn1');
|
||||||
|
|
||||||
|
use db_syn1;
|
||||||
|
show tables;
|
||||||
|
|
||||||
|
drop database mytestdb;
|
||||||
|
drop database db_syn1;
|
||||||
|
@@ -98,7 +98,9 @@ BEGIN
|
|||||||
DECLARE v_table VARCHAR(64);
|
DECLARE v_table VARCHAR(64);
|
||||||
DECLARE v_views_created INT DEFAULT 0;
|
DECLARE v_views_created INT DEFAULT 0;
|
||||||
DECLARE v_table_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY') DEFAULT '';
|
DECLARE v_table_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY') DEFAULT '';
|
||||||
DECLARE v_temp_table TEXT;
|
|
||||||
|
DECLARE db_doesnt_exist CONDITION FOR SQLSTATE '42000';
|
||||||
|
DECLARE db_name_exists CONDITION FOR SQLSTATE 'HY000';
|
||||||
|
|
||||||
DECLARE c_table_names CURSOR FOR
|
DECLARE c_table_names CURSOR FOR
|
||||||
SELECT TABLE_NAME
|
SELECT TABLE_NAME
|
||||||
@@ -142,22 +144,9 @@ BEGIN
|
|||||||
IF v_done THEN
|
IF v_done THEN
|
||||||
LEAVE c_table_names;
|
LEAVE c_table_names;
|
||||||
END IF;
|
END IF;
|
||||||
|
-- Check the table type, don't support temporary since cannot create the view
|
||||||
-- Check does temporary table shadows the base table. If it is so, terminate.
|
|
||||||
CALL sys.table_exists(in_db_name, v_table, v_table_exists);
|
CALL sys.table_exists(in_db_name, v_table, v_table_exists);
|
||||||
IF (v_table_exists = 'TEMPORARY') THEN
|
IF (v_table_exists <> 'TEMPORARY') THEN
|
||||||
SET v_temp_table =
|
|
||||||
CONCAT(
|
|
||||||
'Table',
|
|
||||||
sys.quote_identifier(in_db_name),
|
|
||||||
'.',
|
|
||||||
sys.quote_identifier(v_table),
|
|
||||||
'shadows base table. View cannot be created! Terminating!');
|
|
||||||
SIGNAL SQLSTATE 'HY000'
|
|
||||||
SET MESSAGE_TEXT = v_temp_table;
|
|
||||||
LEAVE c_table_names;
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
SET @create_view_stmt = CONCAT(
|
SET @create_view_stmt = CONCAT(
|
||||||
'CREATE SQL SECURITY INVOKER VIEW ',
|
'CREATE SQL SECURITY INVOKER VIEW ',
|
||||||
sys.quote_identifier(in_synonym),
|
sys.quote_identifier(in_synonym),
|
||||||
@@ -173,6 +162,7 @@ BEGIN
|
|||||||
DEALLOCATE PREPARE create_view_stmt;
|
DEALLOCATE PREPARE create_view_stmt;
|
||||||
|
|
||||||
SET v_views_created = v_views_created + 1;
|
SET v_views_created = v_views_created + 1;
|
||||||
|
END IF;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
CLOSE c_table_names;
|
CLOSE c_table_names;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user