mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge bk-internal.mysql.com:/home/bk/mysql-5.1-marvel
into mysql.com:/data0/mysqldev/my/mysql-5.1-30367 sql/sql_show.cc: Auto merged sql/table.cc: Auto merged sql/log_event.cc: Manual merge, later version of the fix takes precedence.
This commit is contained in:
147
sql/sql_show.cc
147
sql/sql_show.cc
@ -2957,49 +2957,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;
|
||||
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);
|
||||
}
|
||||
|
||||
if (res)
|
||||
thd->clear_error();
|
||||
return 0;
|
||||
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);
|
||||
closefrm(&tbl, true);
|
||||
goto err;
|
||||
}
|
||||
|
||||
err1:
|
||||
release_table_share(share, RELEASE_NORMAL);
|
||||
|
||||
err:
|
||||
pthread_mutex_unlock(&LOCK_open);
|
||||
thd->clear_error();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
@ -3038,7 +3059,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
enum enum_schema_tables schema_table_idx;
|
||||
List<LEX_STRING> db_names;
|
||||
List_iterator_fast<LEX_STRING> it(db_names);
|
||||
COND *partial_cond;
|
||||
COND *partial_cond= 0;
|
||||
uint derived_tables= lex->derived_tables;
|
||||
int error= 1;
|
||||
Open_tables_state open_tables_state_backup;
|
||||
@ -3077,20 +3098,35 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
DBUG_PRINT("INDEX VALUES",("db_name='%s', table_name='%s'",
|
||||
lookup_field_vals.db_value.str,
|
||||
lookup_field_vals.table_value.str));
|
||||
if (lookup_field_vals.db_value.length &&
|
||||
!lookup_field_vals.wild_db_value &&
|
||||
lookup_field_vals.table_value.length &&
|
||||
!lookup_field_vals.wild_table_value)
|
||||
partial_cond= 0;
|
||||
else
|
||||
partial_cond= make_cond_for_info_schema(cond, tables);
|
||||
|
||||
if (lookup_field_vals.db_value.length && !lookup_field_vals.wild_db_value)
|
||||
if (!lookup_field_vals.wild_db_value && !lookup_field_vals.wild_table_value)
|
||||
{
|
||||
/*
|
||||
if lookup value is empty string then
|
||||
it's impossible table name or db name
|
||||
*/
|
||||
if (lookup_field_vals.db_value.str &&
|
||||
!lookup_field_vals.db_value.str[0] ||
|
||||
lookup_field_vals.table_value.str &&
|
||||
!lookup_field_vals.table_value.str[0])
|
||||
{
|
||||
error= 0;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (lookup_field_vals.db_value.length &&
|
||||
!lookup_field_vals.wild_db_value)
|
||||
tables->has_db_lookup_value= TRUE;
|
||||
if (lookup_field_vals.table_value.length &&
|
||||
!lookup_field_vals.wild_table_value)
|
||||
tables->has_table_lookup_value= TRUE;
|
||||
|
||||
if (tables->has_db_lookup_value && tables->has_table_lookup_value)
|
||||
partial_cond= 0;
|
||||
else
|
||||
partial_cond= make_cond_for_info_schema(cond, tables);
|
||||
|
||||
tables->table_open_method= table_open_method=
|
||||
get_table_open_method(tables, schema_table, schema_table_idx);
|
||||
|
||||
@ -3255,7 +3291,7 @@ bool store_schema_shemata(THD* thd, TABLE *table, LEX_STRING *db_name,
|
||||
}
|
||||
|
||||
|
||||
int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
{
|
||||
/*
|
||||
TODO: fill_schema_shemata() is called when new client is connected.
|
||||
@ -3281,6 +3317,23 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
&with_i_schema))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
/*
|
||||
If we have lookup db value we should check that the database exists
|
||||
*/
|
||||
if(lookup_field_vals.db_value.str && !lookup_field_vals.wild_db_value)
|
||||
{
|
||||
char path[FN_REFLEN+16];
|
||||
uint path_len;
|
||||
MY_STAT stat_info;
|
||||
if (!lookup_field_vals.db_value.str[0])
|
||||
DBUG_RETURN(0);
|
||||
path_len= build_table_filename(path, sizeof(path),
|
||||
lookup_field_vals.db_value.str, "", "", 0);
|
||||
path[path_len-1]= 0;
|
||||
if (!my_stat(path,&stat_info,MYF(0)))
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
List_iterator_fast<LEX_STRING> it(db_names);
|
||||
while ((db_name=it++))
|
||||
{
|
||||
@ -6409,7 +6462,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,
|
||||
@ -6439,7 +6492,7 @@ ST_SCHEMA_TABLE schema_tables[]=
|
||||
{"ROUTINES", proc_fields_info, create_schema_table,
|
||||
fill_schema_proc, make_proc_old_format, 0, -1, -1, 0, 0},
|
||||
{"SCHEMATA", schema_fields_info, create_schema_table,
|
||||
fill_schema_shemata, make_schemata_old_format, 0, 1, -1, 0, 0},
|
||||
fill_schema_schemata, make_schemata_old_format, 0, 1, -1, 0, 0},
|
||||
{"SCHEMA_PRIVILEGES", schema_privileges_fields_info, create_schema_table,
|
||||
fill_schema_schema_privileges, 0, 0, -1, -1, 0, 0},
|
||||
{"SESSION_STATUS", variables_fields_info, create_schema_table,
|
||||
@ -6448,7 +6501,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,
|
||||
|
Reference in New Issue
Block a user