diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 539bb90d9074ad887b4915b2115d16fff63a36e5..33951ea33a49904cdff12fe21255b3f2202349e1 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -668,12 +668,12 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
 %type <NONE>
 	query verb_clause create change select do drop insert replace insert2
 	insert_values update delete truncate rename
-	show describe load alter optimize preload flush
+	show describe load alter optimize keycache preload flush
 	reset purge begin commit rollback savepoint
 	slave master_def master_defs
 	repair restore backup analyze check start
 	field_list field_list_item field_spec kill column_def key_def
-	preload_list preload_keys
+	keycache_list assign_to_keycache preload_list preload_keys
 	select_item_list select_item values_list no_braces
 	opt_limit_clause delete_limit_clause fields opt_values values
 	procedure_list procedure_list2 procedure_item
@@ -742,6 +742,7 @@ verb_clause:
 	| lock
 	| kill
 	| optimize
+        | keycache
 	| preload
 	| purge
 	| rename
@@ -1879,6 +1880,45 @@ table_to_table:
 	    YYABORT;
 	};
 
+keycache:
+        CACHE_SYM INDEX 
+        {
+          LEX *lex=Lex;
+          lex->sql_command=SQLCOM_ASSIGN_TO_KEYCACHE;
+        }
+        keycache_list
+        {}
+        ;
+
+keycache_list:
+        assign_to_keycache
+        | keycache_list ',' assign_to_keycache;
+
+assign_to_keycache:
+        table_ident cache_keys_spec IN_SYM ident
+        {
+          LEX *lex=Lex;
+          SELECT_LEX *sel= &lex->select_lex;
+          if (!sel->add_table_to_list(lex->thd, $1, NULL, 0,
+                                      TL_READ,
+                                      sel->get_use_index(),
+                                      (List<String> *)0,
+                                      &($4)))        
+            YYABORT;
+        }
+        |
+        table_ident cache_keys_spec IN_SYM DEFAULT
+        {
+          LEX *lex=Lex;
+          SELECT_LEX *sel= &lex->select_lex;
+          if (!sel->add_table_to_list(lex->thd, $1, NULL, 0,
+                                      TL_READ,
+                                      sel->get_use_index(),
+                                      (List<String> *)0))        
+            YYABORT;
+        }
+        ;
+
 preload:
 	LOAD INDEX INTO CACHE_SYM
 	{
@@ -1894,7 +1934,7 @@ preload_list:
 	| preload_list ',' preload_keys;
 
 preload_keys:
-	table_ident preload_keys_spec opt_ignore_leaves
+	table_ident cache_keys_spec opt_ignore_leaves
 	{
 	  LEX *lex=Lex;
 	  SELECT_LEX *sel= &lex->select_lex;
@@ -1908,7 +1948,7 @@ preload_keys:
 
 preload_keys_spec:
 	keys_or_index { Select->interval_list.empty(); }
-	preload_key_list_or_empty
+	cache_key_list_or_empty 
 	{
 	  LEX *lex=Lex;
 	  SELECT_LEX *sel= &lex->select_lex;
@@ -1917,7 +1957,7 @@ preload_keys_spec:
 	}
 	;
 
-preload_key_list_or_empty:
+cache_key_list_or_empty:
 	/* empty */
 	| '(' key_usage_list2 ')' {}
 	;