Commit fb3d3bd5 authored by unknown's avatar unknown

fill_schema_table_from_frm() function uses get_table_share() function

which is faster than open_table_def() func.
This patch fixes the porblem with information_schema test timeout.


sql/unireg.h:
  added description of flags
parent 3f8a904f
......@@ -2952,49 +2952,70 @@ static int fill_schema_table_from_frm(THD *thd,TABLE *table,
LEX_STRING *table_name,
enum enum_schema_tables schema_table_idx)
{
TABLE_SHARE share;
TABLE_SHARE *share;
TABLE tbl;
TABLE_LIST table_list;
char path[FN_REFLEN];
uint res;
uint res= 0;
int error;
char key[MAX_DBKEY_LENGTH];
uint key_length;
bzero((char*) &table_list, sizeof(TABLE_LIST));
bzero((char*) &tbl, sizeof(TABLE));
(void) build_table_filename(path, sizeof(path), db_name->str,
table_name->str, "", 0);
init_tmp_table_share(&share, "", 0, "", path);
if (!(res= open_table_def(thd, &share, OPEN_VIEW)))
table_list.table_name= table_name->str;
table_list.db= db_name->str;
key_length= create_table_def_key(thd, key, &table_list, 0);
pthread_mutex_lock(&LOCK_open);
share= get_table_share(thd, &table_list, key,
key_length, OPEN_VIEW, &error);
if (!share)
{
share.tmp_table= NO_TMP_TABLE;
tbl.s= &share;
table_list.table= &tbl;
if (schema_table->i_s_requested_object & OPEN_TABLE_FROM_SHARE)
res= 0;
goto err;
}
if (share->is_view)
{
if (schema_table->i_s_requested_object & OPEN_TABLE_ONLY)
{
if (share.is_view ||
open_table_from_share(thd, &share, table_name->str, 0,
(READ_KEYINFO | COMPUTE_TYPES |
EXTRA_RECORD | OPEN_FRM_FILE_ONLY),
thd->open_options, &tbl, FALSE))
{
share.tmp_table= INTERNAL_TMP_TABLE;
free_table_share(&share);
return (share.is_view &&
!(schema_table->i_s_requested_object &
~(OPEN_TABLE_FROM_SHARE|OPTIMIZE_I_S_TABLE)));
}
/* skip view processing */
res= 0;
goto err1;
}
else if (schema_table->i_s_requested_object & OPEN_VIEW_FULL)
{
/*
tell get_all_tables() to fall back to
open_normal_and_derived_tables()
*/
res= 1;
goto err1;
}
table_list.view= (st_lex*) share.is_view;
}
if (share->is_view ||
!open_table_from_share(thd, share, table_name->str, 0,
(READ_KEYINFO | COMPUTE_TYPES |
EXTRA_RECORD | OPEN_FRM_FILE_ONLY),
thd->open_options, &tbl, FALSE))
{
tbl.s= share;
table_list.table= &tbl;
table_list.view= (st_lex*) share->is_view;
res= schema_table->process_table(thd, &table_list, table,
res, db_name, table_name);
share.tmp_table= INTERNAL_TMP_TABLE;
if (schema_table->i_s_requested_object & OPEN_TABLE_FROM_SHARE)
closefrm(&tbl, true);
else
free_table_share(&share);
closefrm(&tbl, true);
goto err;
}
if (res)
thd->clear_error();
return 0;
err1:
release_table_share(share, RELEASE_NORMAL);
err:
pthread_mutex_unlock(&LOCK_open);
thd->clear_error();
return res;
}
......@@ -6398,7 +6419,7 @@ ST_SCHEMA_TABLE schema_tables[]=
create_schema_table, fill_schema_coll_charset_app, 0, 0, -1, -1, 0, 0},
{"COLUMNS", columns_fields_info, create_schema_table,
get_all_tables, make_columns_old_format, get_schema_column_record, 1, 2, 0,
OPEN_TABLE_FROM_SHARE|OPTIMIZE_I_S_TABLE},
OPTIMIZE_I_S_TABLE|OPEN_VIEW_FULL},
{"COLUMN_PRIVILEGES", column_privileges_fields_info, create_schema_table,
fill_schema_column_privileges, 0, 0, -1, -1, 0, 0},
{"ENGINES", engines_fields_info, create_schema_table,
......@@ -6437,7 +6458,7 @@ ST_SCHEMA_TABLE schema_tables[]=
fill_variables, make_old_format, 0, -1, -1, 0, 0},
{"STATISTICS", stat_fields_info, create_schema_table,
get_all_tables, make_old_format, get_schema_stat_record, 1, 2, 0,
OPEN_TABLE_ONLY|OPEN_TABLE_FROM_SHARE|OPTIMIZE_I_S_TABLE},
OPEN_TABLE_ONLY|OPTIMIZE_I_S_TABLE},
{"STATUS", variables_fields_info, create_schema_table, fill_status,
make_old_format, 0, -1, -1, 1, 0},
{"TABLES", tables_fields_info, create_schema_table,
......
......@@ -153,11 +153,40 @@
#define OPEN_VIEW 8192 /* Allow open on view */
#define OPEN_VIEW_NO_PARSE 16384 /* Open frm only if it's a view,
but do not parse view itself */
#define OPEN_FRM_FILE_ONLY 32768 /* Open frm file only */
#define OPEN_TABLE_ONLY OPEN_FRM_FILE_ONLY*2 /* Open view only */
#define OPEN_VIEW_ONLY OPEN_TABLE_ONLY*2 /* Open table only */
#define OPEN_TABLE_FROM_SHARE OPEN_VIEW_ONLY*2 /* For I_S tables*/
#define OPTIMIZE_I_S_TABLE OPEN_TABLE_FROM_SHARE*2 /* For I_S tables*/
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine
The flag means that we need to open FRM file only to get necessary data.
*/
#define OPEN_FRM_FILE_ONLY 32768
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine
The flag means that we need to process tables only to get necessary data.
Views are not processed.
*/
#define OPEN_TABLE_ONLY OPEN_FRM_FILE_ONLY*2
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine
The flag means that we need to process views only to get necessary data.
Tables are not processed.
*/
#define OPEN_VIEW_ONLY OPEN_TABLE_ONLY*2
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine.
The flag means that we need to open a view using
open_normal_and_derived_tables() function.
*/
#define OPEN_VIEW_FULL OPEN_VIEW_ONLY*2
/*
This flag is used in function get_all_tables() which fills
I_S tables with data which are retrieved from frm files and storage engine.
The flag means that I_S table uses optimization algorithm.
*/
#define OPTIMIZE_I_S_TABLE OPEN_VIEW_FULL*2
#define SC_INFO_LENGTH 4 /* Form format constant */
#define TE_INFO_LENGTH 3
#define MTYP_NOEMPTY_BIT 128
......
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