Commit f6bf2680 authored by gluh@mysql.com's avatar gluh@mysql.com

Fix for bug#10261: INFORMATION_SCHEMA.COLUMNS, incomplete result for non root user

   I_S table columns information is available for any user 
parent 64cbbf14
......@@ -734,3 +734,17 @@ x_real NULL NULL
x_float NULL NULL
x_double_precision NULL NULL
drop table t1;
create user mysqltest_4@localhost;
SELECT TABLE_NAME, COLUMN_NAME, PRIVILEGES FROM INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME='TABLE_NAME';
TABLE_NAME COLUMN_NAME PRIVILEGES
TABLES TABLE_NAME select
COLUMNS TABLE_NAME select
STATISTICS TABLE_NAME select
VIEWS TABLE_NAME select
TABLE_PRIVILEGES TABLE_NAME select
COLUMN_PRIVILEGES TABLE_NAME select
TABLE_CONSTRAINTS TABLE_NAME select
KEY_COLUMN_USAGE TABLE_NAME select
delete from mysql.user where user='mysqltest_4';
flush privileges;
......@@ -473,3 +473,16 @@ SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME= 't1';
drop table t1;
#
# Bug#10261 INFORMATION_SCHEMA.COLUMNS, incomplete result for non root user
#
create user mysqltest_4@localhost;
connect (user4,localhost,mysqltest_4,,);
connection user4;
SELECT TABLE_NAME, COLUMN_NAME, PRIVILEGES FROM INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME='TABLE_NAME';
connection default;
delete from mysql.user where user='mysqltest_4';
flush privileges;
......@@ -2306,7 +2306,8 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
col_access= get_column_grant(thd, &tables->grant,
base_name, file_name,
field->field_name) & COL_ACLS;
if (lex->orig_sql_command != SQLCOM_SHOW_FIELDS && !col_access)
if (lex->orig_sql_command != SQLCOM_SHOW_FIELDS &&
!tables->schema_table && !col_access)
continue;
for (uint bitnr=0; col_access ; col_access>>=1,bitnr++)
{
......@@ -2319,6 +2320,11 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
#else
*end= 0;
#endif
if (tables->schema_table) // any user has 'select' privilege on all
// I_S table columns
table->field[17]->store(grant_types.type_names[0],
strlen(grant_types.type_names[0]), cs);
else
table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs);
table->field[1]->store(base_name, strlen(base_name), cs);
......
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