diff --git a/mysql-test/main/a.test b/mysql-test/main/a.test
new file mode 100644
index 00000000000..0109a13c854
--- /dev/null
+++ b/mysql-test/main/a.test
@@ -0,0 +1,14 @@
+flush status;
+query_vertical select * from information_schema.parameters
+where concat(specific_schema)='mtr' and specific_name='add_suppression';
+show status like 'handler_read%next';
+
+flush status;
+query_vertical select * from information_schema.parameters
+where specific_schema='mtr' and concat(specific_name)='add_suppression';
+show status like 'handler_read%next';
+
+flush status;
+query_vertical select * from information_schema.parameters
+where specific_schema='mtr' and specific_name='add_suppression';
+show status like 'handler_read%next';
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index a5ec7bf73c2..438f82bbf5b 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -65,7 +65,7 @@
 #include "transaction.h"
 #include "opt_trace.h"
 #include "my_cpu.h"
-
+#include "key.h"
 
 #include "lex_symbol.h"
 #define KEYWORD_SIZE 64
@@ -6421,9 +6421,6 @@ static inline void copy_field_as_string(Field *to_field, Field *from_field)
   @param[in]      thd                   thread handler
   @param[in]      table                 I_S table
   @param[in]      proc_table            'mysql.proc' table
-  @param[in]      wild                  wild string, not used for now,
-                                        will be useful
-                                        if we add 'SHOW PARAMETERs'
   @param[in]      full_access           if 1 user has privileges on the routine
   @param[in]      sp_user               user in 'user@host' format
 
@@ -6432,9 +6429,9 @@ static inline void copy_field_as_string(Field *to_field, Field *from_field)
     @retval       1                     error
 */
 
-bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table,
-                         const char *wild, bool full_access,
-                         const char *sp_user)
+int store_schema_params(THD *thd, TABLE *table, TABLE *proc_table,
+                        LOOKUP_FIELD_VALUES *lookup, bool full_access,
+                        const char *sp_user)
 {
   TABLE_SHARE share;
   TABLE tbl;
@@ -6455,6 +6452,15 @@ bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table,
 
   proc_table->field[MYSQL_PROC_FIELD_DB]->val_str_nopad(thd->mem_root, &db);
   proc_table->field[MYSQL_PROC_FIELD_NAME]->val_str_nopad(thd->mem_root, &name);
+
+  if (lookup->db_value.str)
+  {
+    if (cmp(lookup->db_value, db))
+      DBUG_RETURN(HA_ERR_END_OF_FILE);
+    if (lookup->table_value.str && cmp(lookup->table_value, name))
+      DBUG_RETURN(HA_ERR_END_OF_FILE);
+  }
+
   proc_table->field[MYSQL_PROC_FIELD_DEFINER]->val_str_nopad(thd->mem_root, &definer);
   sql_mode= (sql_mode_t) proc_table->field[MYSQL_PROC_FIELD_SQL_MODE]->val_int();
   sph= Sp_handler::handler_mysql_proc((enum_sp_type)
@@ -6558,16 +6564,21 @@ bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table,
 }
 
 
-bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
-                       const char *wild, bool full_access, const char *sp_user)
+int store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
+                      LOOKUP_FIELD_VALUES *lookup, bool full_access, const char *sp_user)
 {
   LEX *lex= thd->lex;
   CHARSET_INFO *cs= system_charset_info;
   const Sp_handler *sph;
   LEX_CSTRING db, name, definer, returns= empty_clex_str;
+  const char *wild= lookup->table_value.str && lookup->wild_table_value
+                    ? lookup->table_value.str : NULL;
 
   proc_table->field[MYSQL_PROC_FIELD_DB]->val_str_nopad(thd->mem_root, &db);
   proc_table->field[MYSQL_PROC_FIELD_NAME]->val_str_nopad(thd->mem_root, &name);
+
+  // XXX lookup as in store_schema_params()
+
   proc_table->field[MYSQL_PROC_FIELD_DEFINER]->val_str_nopad(thd->mem_root, &definer);
   sph= Sp_handler::handler_mysql_proc((enum_sp_type)
                                       proc_table->field[MYSQL_PROC_MYSQL_TYPE]->
@@ -6679,7 +6690,6 @@ int fill_schema_proc(THD *thd, TABLE_LIST *tables, COND *cond)
 {
   TABLE *proc_table;
   TABLE_LIST proc_tables;
-  const char *wild= thd->lex->wild ? thd->lex->wild->ptr() : NullS;
   int res= 0;
   TABLE *table= tables->table;
   bool full_access;
@@ -6699,6 +6709,17 @@ int fill_schema_proc(THD *thd, TABLE_LIST *tables, COND *cond)
   full_access= !check_table_access(thd, SELECT_ACL, &proc_tables, FALSE,
                                    1, TRUE);
 
+  LOOKUP_FIELD_VALUES lookup;
+  bzero(&lookup, sizeof(lookup));
+  if (thd->lex->wild)
+  {
+    thd->lex->wild->get_value(&lookup.table_value);
+    lookup.wild_table_value= 1;
+  }
+  else if (calc_lookup_values_from_cond(thd, cond, tables, &lookup))
+    DBUG_RETURN(0);
+  // XXX charsets? wild_db_value/wild_table_value ?
+
   start_new_trans new_trans(thd);
 
   if (!(proc_table= open_proc_table_for_read(thd)))
@@ -6717,34 +6738,52 @@ int fill_schema_proc(THD *thd, TABLE_LIST *tables, COND *cond)
     goto err;
   }
 
-  if ((res= proc_table->file->ha_index_first(proc_table->record[0])))
+  if (lookup.db_value.str)
   {
-    res= (res == HA_ERR_END_OF_FILE) ? 0 : 1;
-    goto err;
+    KEY *keyinfo= proc_table->key_info;
+    uint keylen= keyinfo->key_part[0].length;
+    key_part_map keypart_map= 1;
+    enum ha_rkey_function find_flag= HA_READ_PREFIX;
+    uchar keybuf[NAME_CHAR_LEN*2*4*64];
+
+    proc_table->field[0]->store(lookup.db_value.str, lookup.db_value.length,
+                                system_charset_info);
+    if (lookup.table_value.str)
+    {
+      proc_table->field[1]->store(lookup.table_value.str,
+                                lookup.table_value.length, system_charset_info);
+      keylen+= keyinfo->key_part[1].length;
+      keypart_map= 3;
+      find_flag= HA_READ_KEY_EXACT;
+    }
+    key_copy(keybuf, proc_table->record[0], keyinfo, keylen, 0);
+    res= proc_table->file->ha_index_read_map(proc_table->record[0], keybuf,
+                                             keypart_map, find_flag);
   }
+  else
+    res= proc_table->file->ha_index_first(proc_table->record[0]);
 
-  if (schema_table_idx == SCH_PROCEDURES ?
-      store_schema_proc(thd, table, proc_table, wild, full_access, definer) :
-      store_schema_params(thd, table, proc_table, wild, full_access, definer))
-  {
-    res= 1;
+  if (res)
     goto err;
-  }
-  while (!proc_table->file->ha_index_next(proc_table->record[0]))
+
+  res= schema_table_idx == SCH_PROCEDURES ?
+      store_schema_proc(thd, table, proc_table, &lookup, full_access, definer) :
+      store_schema_params(thd, table, proc_table, &lookup, full_access, definer);
+
+  while (!res && !proc_table->file->ha_index_next(proc_table->record[0]))
   {
-    if (schema_table_idx == SCH_PROCEDURES ?
-        store_schema_proc(thd, table, proc_table, wild, full_access, definer): 
-        store_schema_params(thd, table, proc_table, wild, full_access, definer))
-    {
-      res= 1;
-      goto err;
-    }
+    res= schema_table_idx == SCH_PROCEDURES ?
+        store_schema_proc(thd, table, proc_table, &lookup, full_access, definer) :
+        store_schema_params(thd, table, proc_table, &lookup, full_access, definer);
   }
 
 err:
   if (proc_table->file->inited)
     (void) proc_table->file->ha_index_end();
 
+  if (res == HA_ERR_END_OF_FILE)
+    res= 0;
+
   thd->commit_whole_transaction_and_close_tables();
   new_trans.restore_old_transaction();
 
@@ -9830,7 +9869,7 @@ ST_SCHEMA_TABLE schema_tables[]=
   {"OPTIMIZER_TRACE", Show::optimizer_trace_info, 0,
      fill_optimizer_trace_info, NULL, NULL, -1, -1, false, 0},
   {"PARAMETERS", Show::parameters_fields_info, 0,
-   fill_schema_proc, 0, 0, -1, -1, 0, 0},
+   fill_schema_proc, 0, 0, 1, 2, 0, 0},
   {"PARTITIONS", Show::partitions_fields_info, 0,
    get_all_tables, 0, get_schema_partitions_record, 1, 2, 0,
    OPTIMIZE_I_S_TABLE|OPEN_TABLE_ONLY},
