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);