diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 0aa5e759207d5f4e0db9610641230d30ff0fdbb3..6c8e7a9cf8b69d1e37e892887815c2e089d10eb5 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -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; diff --git a/mysql-test/t/information_schema.test b/mysql-test/t/information_schema.test index 1739604372a530c25325a1c9a1d85953e40a3950..3e322ad2f5bf9e21b0a35caaa4b0118802111bbd 100644 --- a/mysql-test/t/information_schema.test +++ b/mysql-test/t/information_schema.test @@ -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; diff --git a/sql/sql_show.cc b/sql/sql_show.cc index ceb9874029857de25f0939e659390d937503538c..a90756e38dbea1c2f247777da966ec8d940d882a 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -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,7 +2320,12 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables, #else *end= 0; #endif - table->field[17]->store(tmp+1,end == tmp ? 0 : (uint) (end-tmp-1), cs); + 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); table->field[2]->store(file_name, strlen(file_name), cs);