Skip to content

Commit

Permalink
MDEV-19112 WITH clause does not work with information_schema as defau…
Browse files Browse the repository at this point in the history
…lt database

With INFORMATION_SCHEMA set as the default database the check that a table
referred in the processed query is defined in INORMATION_SCHEMA must
be postponed until all CTE names can be identified.
  • Loading branch information
igorbabaev committed Apr 5, 2019
1 parent b30fb70 commit b4a7bde
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 14 deletions.
14 changes: 14 additions & 0 deletions mysql-test/r/cte_nonrecursive.result
Expand Up @@ -1659,3 +1659,17 @@ a
2
drop view v1;
drop table t1,t2;
#
# MDEV-19112: CTE usage when information_schema is set as default db
#
with t as (select 1 as t ) select * from t;
t
1
use information_schema;
with t as (select 1 as t) select * from t;
t
1
with columns as (select 1 as t) select * from columns;
t
1
use test;
12 changes: 12 additions & 0 deletions mysql-test/t/cte_nonrecursive.test
Expand Up @@ -1168,3 +1168,15 @@ select * from v1;

drop view v1;
drop table t1,t2;

--echo #
--echo # MDEV-19112: CTE usage when information_schema is set as default db
--echo #

with t as (select 1 as t ) select * from t;

use information_schema;
with t as (select 1 as t) select * from t;
with columns as (select 1 as t) select * from columns;

use test;
24 changes: 24 additions & 0 deletions sql/sql_base.cc
Expand Up @@ -3344,6 +3344,30 @@ open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
goto end;
}
}

if (!tables->derived &&
is_infoschema_db(tables->db, tables->db_length))
{
/*
Check whether the information schema contains a table
whose name is tables->schema_table_name
*/
ST_SCHEMA_TABLE *schema_table;
schema_table= find_schema_table(thd, tables->schema_table_name);
if (!schema_table ||
(schema_table->hidden &&
((sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) == 0 ||
/*
this check is used for show columns|keys from I_S hidden table
*/
lex->sql_command == SQLCOM_SHOW_FIELDS ||
lex->sql_command == SQLCOM_SHOW_KEYS)))
{
my_error(ER_UNKNOWN_TABLE, MYF(0),
tables->schema_table_name, INFORMATION_SCHEMA_NAME.str);
DBUG_RETURN(1);
}
}
/*
If this TABLE_LIST object is a placeholder for an information_schema
table, create a temporary table to represent the information_schema
Expand Down
1 change: 1 addition & 0 deletions sql/sql_cte.cc
Expand Up @@ -1094,6 +1094,7 @@ bool TABLE_LIST::set_as_with_table(THD *thd, With_element *with_elem)
table= 0;
}
with= with_elem;
schema_table= NULL;
if (!with_elem->is_referenced() || with_elem->is_recursive)
{
derived= with_elem->spec;
Expand Down
15 changes: 1 addition & 14 deletions sql/sql_parse.cc
Expand Up @@ -8222,7 +8222,6 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
ptr->derived= table->sel;
if (!ptr->derived && is_infoschema_db(ptr->db, ptr->db_length))
{
ST_SCHEMA_TABLE *schema_table;
if (ptr->updating &&
/* Special cases which are processed by commands itself */
lex->sql_command != SQLCOM_CHECK &&
Expand All @@ -8234,20 +8233,8 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
INFORMATION_SCHEMA_NAME.str);
DBUG_RETURN(0);
}
ST_SCHEMA_TABLE *schema_table;
schema_table= find_schema_table(thd, ptr->table_name);
if (!schema_table ||
(schema_table->hidden &&
((sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) == 0 ||
/*
this check is used for show columns|keys from I_S hidden table
*/
lex->sql_command == SQLCOM_SHOW_FIELDS ||
lex->sql_command == SQLCOM_SHOW_KEYS)))
{
my_error(ER_UNKNOWN_TABLE, MYF(0),
ptr->table_name, INFORMATION_SCHEMA_NAME.str);
DBUG_RETURN(0);
}
ptr->schema_table_name= ptr->table_name;
ptr->schema_table= schema_table;
}
Expand Down

0 comments on commit b4a7bde

Please sign in to comment.