summaryrefslogtreecommitdiff
path: root/sql/sql_show.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_show.cc')
-rw-r--r--sql/sql_show.cc92
1 files changed, 61 insertions, 31 deletions
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 3a42715b721..7ddc7f8ab24 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -5154,6 +5154,7 @@ public:
int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
{
+ DBUG_ENTER("get_all_tables");
LEX *lex= thd->lex;
TABLE *table= tables->table;
TABLE_LIST table_acl_check;
@@ -5171,7 +5172,29 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
uint table_open_method= tables->table_open_method;
bool can_deadlock;
MEM_ROOT tmp_mem_root;
- DBUG_ENTER("get_all_tables");
+ /*
+ We're going to open FRM files for tables.
+ In case of VIEWs that contain stored function calls,
+ these stored functions will be parsed and put to the SP cache.
+
+ Suppose we have a view containing a stored function call:
+ CREATE VIEW v1 AS SELECT f1() AS c1;
+ and now we're running:
+ SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=f1();
+ If a parallel thread invalidates the cache,
+ e.g. by creating or dropping some stored routine,
+ the SELECT query will re-parse f1() when processing "v1"
+ and replace the outdated cached version of f1() to a new one.
+ But the old version of f1() is referenced from the m_sp member
+ of the Item_func_sp instances used in the WHERE condition.
+ We cannot destroy it. To avoid such clashes, let's remember
+ all old routines into a temporary SP cache collection
+ and process tables with a new empty temporary SP cache collection.
+ Then restore to the old SP cache collection at the end.
+ */
+ Sp_caches old_sp_caches;
+
+ old_sp_caches.sp_caches_swap(*thd);
bzero(&tmp_mem_root, sizeof(tmp_mem_root));
@@ -5347,6 +5370,13 @@ err:
thd->restore_backup_open_tables_state(&open_tables_state_backup);
free_root(&tmp_mem_root, 0);
+ /*
+ Now restore to the saved SP cache collection
+ and clear the temporary SP cache collection.
+ */
+ old_sp_caches.sp_caches_swap(*thd);
+ old_sp_caches.sp_caches_clear();
+
DBUG_RETURN(error);
}
@@ -9054,7 +9084,7 @@ ST_FIELD_INFO columns_fields_info[]=
Column("ORDINAL_POSITION", ULonglong(), NOT_NULL, OPEN_FRM_ONLY),
Column("COLUMN_DEFAULT", Longtext(MAX_FIELD_VARCHARLENGTH),
NULLABLE, "Default",OPEN_FRM_ONLY),
- Column("IS_NULLABLE", Yesno(), NOT_NULL, "Null", OPEN_FRM_ONLY),
+ Column("IS_NULLABLE", Yes_or_empty(), NOT_NULL, "Null", OPEN_FRM_ONLY),
Column("DATA_TYPE", Name(), NOT_NULL, OPEN_FRM_ONLY),
Column("CHARACTER_MAXIMUM_LENGTH",ULonglong(), NULLABLE, OPEN_FRM_ONLY),
Column("CHARACTER_OCTET_LENGTH", ULonglong(), NULLABLE, OPEN_FRM_ONLY),
@@ -9091,8 +9121,8 @@ ST_FIELD_INFO collation_fields_info[]=
Column("COLLATION_NAME", CSName(), NOT_NULL, "Collation"),
Column("CHARACTER_SET_NAME", CSName(), NOT_NULL, "Charset"),
Column("ID", SLonglong(MY_INT32_NUM_DECIMAL_DIGITS), NOT_NULL, "Id"),
- Column("IS_DEFAULT", Yesno(), NOT_NULL, "Default"),
- Column("IS_COMPILED", Yesno(), NOT_NULL, "Compiled"),
+ Column("IS_DEFAULT", Yes_or_empty(), NOT_NULL, "Default"),
+ Column("IS_COMPILED", Yes_or_empty(), NOT_NULL, "Compiled"),
Column("SORTLEN", SLonglong(3), NOT_NULL, "Sortlen"),
CEnd()
};
@@ -9100,10 +9130,10 @@ ST_FIELD_INFO collation_fields_info[]=
ST_FIELD_INFO applicable_roles_fields_info[]=
{
- Column("GRANTEE", Userhost(), NOT_NULL),
+ Column("GRANTEE", Userhost(), NOT_NULL),
Column("ROLE_NAME", Varchar(USERNAME_CHAR_LENGTH), NOT_NULL),
- Column("IS_GRANTABLE", Yesno(), NOT_NULL),
- Column("IS_DEFAULT", Yesno(), NULLABLE),
+ Column("IS_GRANTABLE", Yes_or_empty(), NOT_NULL),
+ Column("IS_DEFAULT", Yes_or_empty(), NULLABLE),
CEnd()
};
@@ -9247,7 +9277,7 @@ ST_FIELD_INFO view_fields_info[]=
Column("TABLE_NAME", Name(), NOT_NULL, OPEN_FRM_ONLY),
Column("VIEW_DEFINITION", Longtext(65535), NOT_NULL, OPEN_FRM_ONLY),
Column("CHECK_OPTION", Varchar(8), NOT_NULL, OPEN_FRM_ONLY),
- Column("IS_UPDATABLE", Yesno(), NOT_NULL, OPEN_FULL_TABLE),
+ Column("IS_UPDATABLE", Yes_or_empty(), NOT_NULL, OPEN_FULL_TABLE),
Column("DEFINER", Definer(), NOT_NULL, OPEN_FRM_ONLY),
Column("SECURITY_TYPE", Varchar(7), NOT_NULL, OPEN_FRM_ONLY),
Column("CHARACTER_SET_CLIENT", CSName(), NOT_NULL, OPEN_FRM_ONLY),
@@ -9259,46 +9289,46 @@ ST_FIELD_INFO view_fields_info[]=
ST_FIELD_INFO user_privileges_fields_info[]=
{
- Column("GRANTEE", Userhost(), NOT_NULL),
- Column("TABLE_CATALOG", Catalog(), NOT_NULL),
- Column("PRIVILEGE_TYPE", Name(), NOT_NULL),
- Column("IS_GRANTABLE", Yesno(), NOT_NULL),
+ Column("GRANTEE", Userhost(), NOT_NULL),
+ Column("TABLE_CATALOG", Catalog(), NOT_NULL),
+ Column("PRIVILEGE_TYPE", Name(), NOT_NULL),
+ Column("IS_GRANTABLE", Yes_or_empty(), NOT_NULL),
CEnd()
};
ST_FIELD_INFO schema_privileges_fields_info[]=
{
- Column("GRANTEE", Userhost(), NOT_NULL),
- Column("TABLE_CATALOG", Catalog(), NOT_NULL),
- Column("TABLE_SCHEMA", Name(), NOT_NULL),
- Column("PRIVILEGE_TYPE", Name(), NOT_NULL),
- Column("IS_GRANTABLE", Yesno(), NOT_NULL),
+ Column("GRANTEE", Userhost(), NOT_NULL),
+ Column("TABLE_CATALOG", Catalog(), NOT_NULL),
+ Column("TABLE_SCHEMA", Name(), NOT_NULL),
+ Column("PRIVILEGE_TYPE", Name(), NOT_NULL),
+ Column("IS_GRANTABLE", Yes_or_empty(), NOT_NULL),
CEnd()
};
ST_FIELD_INFO table_privileges_fields_info[]=
{
- Column("GRANTEE", Userhost(), NOT_NULL),
- Column("TABLE_CATALOG", Catalog(), NOT_NULL),
- Column("TABLE_SCHEMA", Name(), NOT_NULL),
- Column("TABLE_NAME", Name(), NOT_NULL),
- Column("PRIVILEGE_TYPE", Name(), NOT_NULL),
- Column("IS_GRANTABLE", Yesno(), NOT_NULL),
+ Column("GRANTEE", Userhost(), NOT_NULL),
+ Column("TABLE_CATALOG", Catalog(), NOT_NULL),
+ Column("TABLE_SCHEMA", Name(), NOT_NULL),
+ Column("TABLE_NAME", Name(), NOT_NULL),
+ Column("PRIVILEGE_TYPE", Name(), NOT_NULL),
+ Column("IS_GRANTABLE", Yes_or_empty(), NOT_NULL),
CEnd()
};
ST_FIELD_INFO column_privileges_fields_info[]=
{
- Column("GRANTEE", Userhost(), NOT_NULL),
- Column("TABLE_CATALOG", Catalog(), NOT_NULL),
- Column("TABLE_SCHEMA", Name(), NOT_NULL),
- Column("TABLE_NAME", Name(), NOT_NULL),
- Column("COLUMN_NAME", Name(), NOT_NULL),
- Column("PRIVILEGE_TYPE", Name(), NOT_NULL),
- Column("IS_GRANTABLE", Yesno(), NOT_NULL),
+ Column("GRANTEE", Userhost(), NOT_NULL),
+ Column("TABLE_CATALOG", Catalog(), NOT_NULL),
+ Column("TABLE_SCHEMA", Name(), NOT_NULL),
+ Column("TABLE_NAME", Name(), NOT_NULL),
+ Column("COLUMN_NAME", Name(), NOT_NULL),
+ Column("PRIVILEGE_TYPE", Name(), NOT_NULL),
+ Column("IS_GRANTABLE", Yes_or_empty(), NOT_NULL),
CEnd()
};
@@ -9439,7 +9469,7 @@ ST_FIELD_INFO sysvars_fields_info[]=
Column("NUMERIC_MAX_VALUE", Varchar(MY_INT64_NUM_DECIMAL_DIGITS), NULLABLE),
Column("NUMERIC_BLOCK_SIZE", Varchar(MY_INT64_NUM_DECIMAL_DIGITS), NULLABLE),
Column("ENUM_VALUE_LIST", Longtext(65535), NULLABLE),
- Column("READ_ONLY", Yesno(), NOT_NULL),
+ Column("READ_ONLY", Yes_or_empty(), NOT_NULL),
Column("COMMAND_LINE_ARGUMENT",Name(), NULLABLE),
Column("GLOBAL_VALUE_PATH", Varchar(2048), NULLABLE),
CEnd()