Commit 2a456f69 authored by gni/root@dev3-127.(none)'s avatar gni/root@dev3-127.(none)

Merge gni@bk-internal.mysql.com:/home/bk/mysql-5.0-ndb-bj

into  dev3-127.(none):/mnt/mysql/home/ngb/mysql-5.0-ndb
parents 76d4e65a 1250b06a
...@@ -34,7 +34,8 @@ HASH open_cache; /* Used by mysql_test */ ...@@ -34,7 +34,8 @@ HASH open_cache; /* Used by mysql_test */
static int open_unireg_entry(THD *thd, TABLE *entry, const char *db, static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
const char *name, const char *alias, const char *name, const char *alias,
TABLE_LIST *table_list, MEM_ROOT *mem_root); TABLE_LIST *table_list, MEM_ROOT *mem_root,
uint flags);
static void free_cache_entry(TABLE *entry); static void free_cache_entry(TABLE *entry);
static void mysql_rm_tmp_tables(void); static void mysql_rm_tmp_tables(void);
static bool open_new_frm(THD *thd, const char *path, const char *alias, static bool open_new_frm(THD *thd, const char *path, const char *alias,
...@@ -1108,7 +1109,7 @@ bool reopen_name_locked_table(THD* thd, TABLE_LIST* table_list) ...@@ -1108,7 +1109,7 @@ bool reopen_name_locked_table(THD* thd, TABLE_LIST* table_list)
key_length=(uint) (strmov(strmov(key,db)+1,table_name)-key)+1; key_length=(uint) (strmov(strmov(key,db)+1,table_name)-key)+1;
if (open_unireg_entry(thd, table, db, table_name, table_name, 0, if (open_unireg_entry(thd, table, db, table_name, table_name, 0,
thd->mem_root) || thd->mem_root, 0) ||
!(table->s->table_cache_key= memdup_root(&table->mem_root, (char*) key, !(table->s->table_cache_key= memdup_root(&table->mem_root, (char*) key,
key_length))) key_length)))
{ {
...@@ -1311,7 +1312,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root, ...@@ -1311,7 +1312,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
VOID(pthread_mutex_lock(&LOCK_open)); VOID(pthread_mutex_lock(&LOCK_open));
if (!open_unireg_entry(thd, table, table_list->db, if (!open_unireg_entry(thd, table, table_list->db,
table_list->table_name, table_list->table_name,
alias, table_list, mem_root)) alias, table_list, mem_root, 0))
{ {
DBUG_ASSERT(table_list->view != 0); DBUG_ASSERT(table_list->view != 0);
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
...@@ -1391,6 +1392,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root, ...@@ -1391,6 +1392,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
else else
{ {
TABLE_SHARE *share; TABLE_SHARE *share;
int error;
/* Free cache if too big */ /* Free cache if too big */
while (open_cache.records > table_cache_size && unused_tables) while (open_cache.records > table_cache_size && unused_tables)
VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */ VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */
...@@ -1401,9 +1403,12 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root, ...@@ -1401,9 +1403,12 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
DBUG_RETURN(NULL); DBUG_RETURN(NULL);
} }
if (open_unireg_entry(thd, table, table_list->db, table_list->table_name, error= open_unireg_entry(thd, table, table_list->db,
alias, table_list, mem_root) || table_list->table_name,
(!table_list->view && alias, table_list, mem_root,
(flags & OPEN_VIEW_NO_PARSE));
if ((error > 0) ||
(!table_list->view && !error &&
!(table->s->table_cache_key= memdup_root(&table->mem_root, !(table->s->table_cache_key= memdup_root(&table->mem_root,
(char*) key, (char*) key,
key_length)))) key_length))))
...@@ -1413,8 +1418,15 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root, ...@@ -1413,8 +1418,15 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
DBUG_RETURN(NULL); DBUG_RETURN(NULL);
} }
if (table_list->view) if (table_list->view || error < 0)
{ {
/*
VIEW not really opened, only frm were read.
Set 1 as a flag here
*/
if (error < 0)
table_list->view= (st_lex*)1;
my_free((gptr)table, MYF(0)); my_free((gptr)table, MYF(0));
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
DBUG_RETURN(0); // VIEW DBUG_RETURN(0); // VIEW
...@@ -1521,7 +1533,7 @@ bool reopen_table(TABLE *table,bool locked) ...@@ -1521,7 +1533,7 @@ bool reopen_table(TABLE *table,bool locked)
safe_mutex_assert_owner(&LOCK_open); safe_mutex_assert_owner(&LOCK_open);
if (open_unireg_entry(table->in_use, &tmp, db, table_name, if (open_unireg_entry(table->in_use, &tmp, db, table_name,
table->alias, 0, table->in_use->mem_root)) table->alias, 0, table->in_use->mem_root, 0))
goto end; goto end;
free_io_cache(table); free_io_cache(table);
...@@ -1851,6 +1863,8 @@ void abort_locked_tables(THD *thd,const char *db, const char *table_name) ...@@ -1851,6 +1863,8 @@ void abort_locked_tables(THD *thd,const char *db, const char *table_name)
alias Alias name alias Alias name
table_desc TABLE_LIST descriptor (used with views) table_desc TABLE_LIST descriptor (used with views)
mem_root temporary mem_root for parsing mem_root temporary mem_root for parsing
flags the OPEN_VIEW_NO_PARSE flag to be passed to
openfrm()/open_new_frm()
NOTES NOTES
Extra argument for open is taken from thd->open_options Extra argument for open is taken from thd->open_options
...@@ -1861,7 +1875,8 @@ void abort_locked_tables(THD *thd,const char *db, const char *table_name) ...@@ -1861,7 +1875,8 @@ void abort_locked_tables(THD *thd,const char *db, const char *table_name)
*/ */
static int open_unireg_entry(THD *thd, TABLE *entry, const char *db, static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
const char *name, const char *alias, const char *name, const char *alias,
TABLE_LIST *table_desc, MEM_ROOT *mem_root) TABLE_LIST *table_desc, MEM_ROOT *mem_root,
uint flags)
{ {
char path[FN_REFLEN]; char path[FN_REFLEN];
int error; int error;
...@@ -1873,14 +1888,16 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db, ...@@ -1873,14 +1888,16 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
(uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE | (uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
HA_GET_INDEX | HA_TRY_READ_ONLY | HA_GET_INDEX | HA_TRY_READ_ONLY |
NO_ERR_ON_NEW_FRM), NO_ERR_ON_NEW_FRM),
READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD, READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD |
(flags & OPEN_VIEW_NO_PARSE),
thd->open_options, entry)) && thd->open_options, entry)) &&
(error != 5 || (error != 5 ||
(fn_format(path, path, 0, reg_ext, MY_UNPACK_FILENAME), (fn_format(path, path, 0, reg_ext, MY_UNPACK_FILENAME),
open_new_frm(thd, path, alias, db, name, open_new_frm(thd, path, alias, db, name,
(uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE | (uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
HA_GET_INDEX | HA_TRY_READ_ONLY), HA_GET_INDEX | HA_TRY_READ_ONLY),
READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD, READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD |
(flags & OPEN_VIEW_NO_PARSE),
thd->open_options, entry, table_desc, mem_root)))) thd->open_options, entry, table_desc, mem_root))))
{ {
...@@ -1962,7 +1979,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db, ...@@ -1962,7 +1979,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
} }
if (error == 5) if (error == 5)
DBUG_RETURN(0); // we have just opened VIEW DBUG_RETURN((flags & OPEN_VIEW_NO_PARSE)? -1 : 0); // we have just opened VIEW
/* /*
We can't mark all tables in 'mysql' database as system since we don't We can't mark all tables in 'mysql' database as system since we don't
...@@ -5379,7 +5396,8 @@ open_new_frm(THD *thd, const char *path, const char *alias, ...@@ -5379,7 +5396,8 @@ open_new_frm(THD *thd, const char *path, const char *alias,
my_error(ER_WRONG_OBJECT, MYF(0), db, table_name, "BASE TABLE"); my_error(ER_WRONG_OBJECT, MYF(0), db, table_name, "BASE TABLE");
goto err; goto err;
} }
if (mysql_make_view(thd, parser, table_desc)) if (mysql_make_view(thd, parser, table_desc,
(prgflag & OPEN_VIEW_NO_PARSE)))
goto err; goto err;
} }
else else
......
...@@ -375,7 +375,7 @@ class st_select_lex_node { ...@@ -375,7 +375,7 @@ class st_select_lex_node {
friend class st_select_lex_unit; friend class st_select_lex_unit;
friend bool mysql_new_select(struct st_lex *lex, bool move_down); friend bool mysql_new_select(struct st_lex *lex, bool move_down);
friend bool mysql_make_view(THD *thd, File_parser *parser, friend bool mysql_make_view(THD *thd, File_parser *parser,
TABLE_LIST *table); TABLE_LIST *table, uint flags);
private: private:
void fast_exclude(); void fast_exclude();
}; };
......
...@@ -179,23 +179,15 @@ static bool ...@@ -179,23 +179,15 @@ static bool
fill_defined_view_parts (THD *thd, TABLE_LIST *view) fill_defined_view_parts (THD *thd, TABLE_LIST *view)
{ {
LEX *lex= thd->lex; LEX *lex= thd->lex;
bool free_view= 1; bool not_used;
TABLE_LIST decoy; TABLE_LIST decoy;
if (view->view)
free_view= 0;
memcpy (&decoy, view, sizeof (TABLE_LIST)); memcpy (&decoy, view, sizeof (TABLE_LIST));
if ((decoy.table= open_table(thd, &decoy, thd->mem_root, NULL, 0))) if (!open_table(thd, &decoy, thd->mem_root, &not_used, OPEN_VIEW_NO_PARSE) &&
!decoy.view)
{ {
/* It's a table */
my_free((gptr)decoy.table, MYF(0));
my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW");
return TRUE; return TRUE;
} }
if (!decoy.view)
/* An error while opening the view occurs, caller will handle it */
return FALSE;
if (!lex->definer) if (!lex->definer)
{ {
view->definer.host= decoy.definer.host; view->definer.host= decoy.definer.host;
...@@ -207,11 +199,6 @@ fill_defined_view_parts (THD *thd, TABLE_LIST *view) ...@@ -207,11 +199,6 @@ fill_defined_view_parts (THD *thd, TABLE_LIST *view)
if (lex->create_view_suid == VIEW_SUID_DEFAULT) if (lex->create_view_suid == VIEW_SUID_DEFAULT)
lex->create_view_suid= decoy.view_suid ? lex->create_view_suid= decoy.view_suid ?
VIEW_SUID_DEFINER : VIEW_SUID_INVOKER; VIEW_SUID_DEFINER : VIEW_SUID_INVOKER;
if (free_view)
{
delete decoy.view;
lex->cleanup_after_one_table_open();
}
return FALSE; return FALSE;
} }
...@@ -740,10 +727,8 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view, ...@@ -740,10 +727,8 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
view->query.str= (char*)str.ptr(); view->query.str= (char*)str.ptr();
view->query.length= str.length()-1; // we do not need last \0 view->query.length= str.length()-1; // we do not need last \0
view->source.str= thd->query + thd->lex->create_view_select_start; view->source.str= thd->query + thd->lex->create_view_select_start;
view->source.length= (char *)skip_rear_comments((uchar *)view->source.str, view->source.length= (thd->query_length -
(uchar *)thd->query + thd->lex->create_view_select_start);
thd->query_length) -
view->source.str;
view->file_version= 1; view->file_version= 1;
view->calc_md5(md5); view->calc_md5(md5);
view->md5.str= md5; view->md5.str= md5;
...@@ -830,13 +815,14 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view, ...@@ -830,13 +815,14 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
thd Thread handler thd Thread handler
parser parser object parser parser object
table TABLE_LIST structure for filling table TABLE_LIST structure for filling
flags flags
RETURN RETURN
0 ok 0 ok
1 error 1 error
*/ */
bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table) bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,
uint flags)
{ {
SELECT_LEX *end, *view_select; SELECT_LEX *end, *view_select;
LEX *old_lex, *lex; LEX *old_lex, *lex;
...@@ -927,6 +913,10 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table) ...@@ -927,6 +913,10 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table)
table->db, table->table_name); table->db, table->table_name);
get_default_definer(thd, &table->definer); get_default_definer(thd, &table->definer);
} }
if (flags & OPEN_VIEW_NO_PARSE)
{
DBUG_RETURN(FALSE);
}
/* /*
Save VIEW parameters, which will be wiped out by derived table Save VIEW parameters, which will be wiped out by derived table
...@@ -1297,11 +1287,8 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) ...@@ -1297,11 +1287,8 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode)
DBUG_ENTER("mysql_drop_view"); DBUG_ENTER("mysql_drop_view");
char path[FN_REFLEN]; char path[FN_REFLEN];
TABLE_LIST *view; TABLE_LIST *view;
frm_type_enum type; bool type= 0;
db_type not_used; db_type not_used;
String non_existant_views;
char *wrong_object_db= NULL, *wrong_object_name= NULL;
bool error= FALSE;
for (view= views; view; view= view->next_local) for (view= views; view; view= view->next_local)
{ {
...@@ -1309,9 +1296,8 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) ...@@ -1309,9 +1296,8 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode)
view->table_name, reg_ext, NullS); view->table_name, reg_ext, NullS);
(void) unpack_filename(path, path); (void) unpack_filename(path, path);
VOID(pthread_mutex_lock(&LOCK_open)); VOID(pthread_mutex_lock(&LOCK_open));
type= FRMTYPE_ERROR;
if (access(path, F_OK) || if (access(path, F_OK) ||
FRMTYPE_VIEW != (type= mysql_frm_type(thd, path, &not_used))) (type= (mysql_frm_type(thd, path, &not_used) != FRMTYPE_VIEW)))
{ {
char name[FN_REFLEN]; char name[FN_REFLEN];
my_snprintf(name, sizeof(name), "%s.%s", view->db, view->table_name); my_snprintf(name, sizeof(name), "%s.%s", view->db, view->table_name);
...@@ -1323,46 +1309,25 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode) ...@@ -1323,46 +1309,25 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode)
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
continue; continue;
} }
if (type == FRMTYPE_TABLE) if (type)
{ my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW");
if (!wrong_object_name)
{
wrong_object_db= view->db;
wrong_object_name= view->table_name;
}
}
else else
{ my_error(ER_BAD_TABLE_ERROR, MYF(0), name);
if (non_existant_views.length()) goto err;
non_existant_views.append(',');
non_existant_views.append(String(view->table_name,system_charset_info));
}
VOID(pthread_mutex_unlock(&LOCK_open));
continue;
} }
if (my_delete(path, MYF(MY_WME))) if (my_delete(path, MYF(MY_WME)))
error= TRUE; goto err;
query_cache_invalidate3(thd, view, 0); query_cache_invalidate3(thd, view, 0);
sp_cache_invalidate(); sp_cache_invalidate();
VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_open));
} }
if (error)
{
DBUG_RETURN(TRUE);
}
if (wrong_object_name)
{
my_error(ER_WRONG_OBJECT, MYF(0), wrong_object_db, wrong_object_name,
"VIEW");
DBUG_RETURN(TRUE);
}
if (non_existant_views.length())
{
my_error(ER_BAD_TABLE_ERROR, MYF(0), non_existant_views.c_ptr());
DBUG_RETURN(TRUE);
}
send_ok(thd); send_ok(thd);
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
err:
VOID(pthread_mutex_unlock(&LOCK_open));
DBUG_RETURN(TRUE);
} }
......
...@@ -19,7 +19,8 @@ ...@@ -19,7 +19,8 @@
bool mysql_create_view(THD *thd, bool mysql_create_view(THD *thd,
enum_view_create_mode mode); enum_view_create_mode mode);
bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table); bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,
uint flags);
bool mysql_drop_view(THD *thd, TABLE_LIST *view, enum_drop_mode drop_mode); bool mysql_drop_view(THD *thd, TABLE_LIST *view, enum_drop_mode drop_mode);
......
...@@ -121,6 +121,8 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, ...@@ -121,6 +121,8 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
// caller can't process new .frm // caller can't process new .frm
goto err; goto err;
} }
if (prgflag & OPEN_VIEW_NO_PARSE)
goto err;
share->blob_ptr_size= sizeof(char*); share->blob_ptr_size= sizeof(char*);
outparam->db_stat= db_stat; outparam->db_stat= db_stat;
......
...@@ -147,7 +147,8 @@ ...@@ -147,7 +147,8 @@
#define READ_SCREENS 1024 /* Read screens, info and helpfile */ #define READ_SCREENS 1024 /* Read screens, info and helpfile */
#define DELAYED_OPEN 4096 /* Open table later */ #define DELAYED_OPEN 4096 /* Open table later */
#define NO_ERR_ON_NEW_FRM 8192 /* stop error sending on new format */ #define NO_ERR_ON_NEW_FRM 8192 /* stop error sending on new format */
#define OPEN_VIEW_NO_PARSE 16384 /* Open frm only if it's a view,
but do not parse view itself */
#define SC_INFO_LENGTH 4 /* Form format constant */ #define SC_INFO_LENGTH 4 /* Form format constant */
#define TE_INFO_LENGTH 3 #define TE_INFO_LENGTH 3
#define MTYP_NOEMPTY_BIT 128 #define MTYP_NOEMPTY_BIT 128
......
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