Commit 90c6ecca authored by serg@serg.mylan's avatar serg@serg.mylan

BUG#2304 - HANDLER and tables in non-current db

parent 18036f98
...@@ -173,3 +173,21 @@ Unknown column 'W' in 'field list' ...@@ -173,3 +173,21 @@ Unknown column 'W' in 'field list'
handler t1 read a=(a); handler t1 read a=(a);
Wrong arguments to HANDLER ... READ Wrong arguments to HANDLER ... READ
drop table t1; drop table t1;
create table t1 (a char(5));
insert into t1 values ("Ok");
handler t1 open as t;
handler t read first;
a
Ok
use mysql;
handler t read first;
a
Ok
handler t close;
handler test.t1 open as t;
handler t read first;
a
Ok
handler t close;
use test;
drop table t1;
...@@ -107,3 +107,19 @@ handler t1 read a=(W); ...@@ -107,3 +107,19 @@ handler t1 read a=(W);
handler t1 read a=(a); handler t1 read a=(a);
drop table t1; drop table t1;
#
# BUG#2304
#
create table t1 (a char(5));
insert into t1 values ("Ok");
handler t1 open as t;
handler t read first;
use mysql;
handler t read first;
handler t close;
handler test.t1 open as t;
handler t read first;
handler t close;
use test;
drop table t1;
...@@ -276,14 +276,13 @@ static TABLE **find_table_ptr_by_name(THD *thd, const char *db, ...@@ -276,14 +276,13 @@ static TABLE **find_table_ptr_by_name(THD *thd, const char *db,
int dblen; int dblen;
TABLE **ptr; TABLE **ptr;
if (!db || ! *db) DBUG_ASSERT(db);
db= thd->db ? thd->db : ""; dblen=*db ? strlen(db)+1 : 0;
dblen=strlen(db)+1;
ptr=&(thd->handler_tables); ptr=&(thd->handler_tables);
for (TABLE *table=*ptr; table ; table=*ptr) for (TABLE *table=*ptr; table ; table=*ptr)
{ {
if (!memcmp(table->table_cache_key, db, dblen) && if ((!dblen || !memcmp(table->table_cache_key, db, dblen)) &&
!my_strcasecmp((is_alias ? table->table_name : table->real_name),table_name)) !my_strcasecmp((is_alias ? table->table_name : table->real_name),table_name))
{ {
if (table->version != refresh_version) if (table->version != refresh_version)
......
...@@ -501,7 +501,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); ...@@ -501,7 +501,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
opt_table_alias opt_table_alias
%type <table> %type <table>
table_ident table_ident table_ident_ref
%type <simple_string> %type <simple_string>
remember_name remember_end opt_len opt_ident opt_db text_or_password remember_name remember_end opt_len opt_ident opt_db text_or_password
...@@ -3243,8 +3243,13 @@ field_ident: ...@@ -3243,8 +3243,13 @@ field_ident:
table_ident: table_ident:
ident { $$=new Table_ident($1); } ident { $$=new Table_ident($1); }
| ident '.' ident { $$=new Table_ident($1,$3,0);} | ident '.' ident { $$=new Table_ident($1,$3,0);}
| '.' ident { $$=new Table_ident($2);} | '.' ident { $$=new Table_ident($2);} /* For Delphi */
/* For Delphi */; ;
table_ident_ref:
ident { LEX_STRING db={"",0}; $$=new Table_ident(db,$1,0); }
| ident '.' ident { $$=new Table_ident($1,$3,0);}
;
ident: ident:
IDENT { $$=$1; } IDENT { $$=$1; }
...@@ -3610,13 +3615,13 @@ handler: ...@@ -3610,13 +3615,13 @@ handler:
if (!add_table_to_list($2,$4,0)) if (!add_table_to_list($2,$4,0))
YYABORT; YYABORT;
} }
| HANDLER_SYM table_ident CLOSE_SYM | HANDLER_SYM table_ident_ref CLOSE_SYM
{ {
Lex->sql_command = SQLCOM_HA_CLOSE; Lex->sql_command = SQLCOM_HA_CLOSE;
if (!add_table_to_list($2,0,0)) if (!add_table_to_list($2,0,0))
YYABORT; YYABORT;
} }
| HANDLER_SYM table_ident READ_SYM | HANDLER_SYM table_ident_ref READ_SYM
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command = SQLCOM_HA_READ; lex->sql_command = SQLCOM_HA_READ;
......
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