Commit efacd5e2 authored by unknown's avatar unknown
Browse files

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


sql/sql_base.cc:
  Auto merged
sql/sql_lex.h:
  Auto merged
sql/table.cc:
  Auto merged
parents 1bd553d4 1e9ebd01
Loading
Loading
Loading
Loading
+31 −13
Original line number Diff line number Diff line
@@ -34,7 +34,8 @@ HASH open_cache; /* Used by mysql_test */

static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
			     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 mysql_rm_tmp_tables(void);
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)
  key_length=(uint) (strmov(strmov(key,db)+1,table_name)-key)+1;

  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,
                                               key_length)))
  {
@@ -1311,7 +1312,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
        VOID(pthread_mutex_lock(&LOCK_open));
        if (!open_unireg_entry(thd, table, table_list->db,
                               table_list->table_name,
                               alias, table_list, mem_root))
                               alias, table_list, mem_root, 0))
        {
          DBUG_ASSERT(table_list->view != 0);
          VOID(pthread_mutex_unlock(&LOCK_open));
@@ -1391,6 +1392,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
  else
  {
    TABLE_SHARE *share;
    int error;
    /* Free cache if too big */
    while (open_cache.records > table_cache_size && unused_tables)
      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,
      VOID(pthread_mutex_unlock(&LOCK_open));
      DBUG_RETURN(NULL);
    }
    if (open_unireg_entry(thd, table, table_list->db, table_list->table_name,
			  alias, table_list, mem_root) ||
	(!table_list->view && 
    error= open_unireg_entry(thd, table, table_list->db,
                          table_list->table_name,
			  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,
                                                  (char*) key,
                                                  key_length))))
@@ -1413,8 +1418,15 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
      VOID(pthread_mutex_unlock(&LOCK_open));
      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));
      VOID(pthread_mutex_unlock(&LOCK_open));
      DBUG_RETURN(0); // VIEW
@@ -1521,7 +1533,7 @@ bool reopen_table(TABLE *table,bool locked)
  safe_mutex_assert_owner(&LOCK_open);

  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;
  free_io_cache(table);

@@ -1851,6 +1863,8 @@ void abort_locked_tables(THD *thd,const char *db, const char *table_name)
    alias		Alias name
    table_desc		TABLE_LIST descriptor (used with views)
    mem_root		temporary mem_root for parsing
    flags               the OPEN_VIEW_NO_PARSE flag to be passed to
                        openfrm()/open_new_frm()

  NOTES
   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)
*/
static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
			     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];
  int error;
@@ -1873,14 +1888,16 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
		         (uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
			         HA_GET_INDEX | HA_TRY_READ_ONLY |
                                 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)) &&
      (error != 5 ||
       (fn_format(path, path, 0, reg_ext, MY_UNPACK_FILENAME),
        open_new_frm(thd, path, alias, db, name,
                     (uint) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
                             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))))

  {
@@ -1962,7 +1979,7 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
  }

  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
@@ -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");
        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;
    }
    else
+1 −1
Original line number Diff line number Diff line
@@ -375,7 +375,7 @@ class st_select_lex_node {
  friend class st_select_lex_unit;
  friend bool mysql_new_select(struct st_lex *lex, bool move_down);
  friend bool mysql_make_view(THD *thd, File_parser *parser,
                              TABLE_LIST *table);
                              TABLE_LIST *table, uint flags);
private:
  void fast_exclude();
};
+25 −60
Original line number Diff line number Diff line
@@ -179,23 +179,15 @@ static bool
fill_defined_view_parts (THD *thd, TABLE_LIST *view)
{
  LEX *lex= thd->lex;
  bool free_view= 1;
  bool not_used;
  TABLE_LIST decoy;

  if (view->view)
    free_view= 0;
  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;
  }
  if (!decoy.view)
    /* An error while opening the view occurs, caller will handle it */
    return FALSE;

  if (!lex->definer)
  {
    view->definer.host= decoy.definer.host;
@@ -207,11 +199,6 @@ fill_defined_view_parts (THD *thd, TABLE_LIST *view)
  if (lex->create_view_suid == VIEW_SUID_DEFAULT)
    lex->create_view_suid= decoy.view_suid ? 
      VIEW_SUID_DEFINER : VIEW_SUID_INVOKER;
  if (free_view)
  {
    delete decoy.view;
    lex->cleanup_after_one_table_open();
  }

  return FALSE;
}
@@ -740,10 +727,8 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
  view->query.str= (char*)str.ptr();
  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.length= (char *)skip_rear_comments((uchar *)view->source.str,
                                                  (uchar *)thd->query +
                                                  thd->query_length) -
                        view->source.str;
  view->source.length= (thd->query_length -
                        thd->lex->create_view_select_start);
  view->file_version= 1;
  view->calc_md5(md5);
  view->md5.str= md5;
@@ -830,13 +815,14 @@ static int mysql_register_view(THD *thd, TABLE_LIST *view,
    thd			Thread handler
    parser		parser object
    table		TABLE_LIST structure for filling

    flags               flags
  RETURN
    0 ok
    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;
  LEX *old_lex, *lex;
@@ -927,6 +913,10 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table)
                        table->db, table->table_name);
    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
@@ -1297,11 +1287,8 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode)
  DBUG_ENTER("mysql_drop_view");
  char path[FN_REFLEN];
  TABLE_LIST *view;
  frm_type_enum type;
  bool type= 0;
  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)
  {
@@ -1309,9 +1296,8 @@ bool mysql_drop_view(THD *thd, TABLE_LIST *views, enum_drop_mode drop_mode)
             view->table_name, reg_ext, NullS);
    (void) unpack_filename(path, path);
    VOID(pthread_mutex_lock(&LOCK_open));
    type= FRMTYPE_ERROR;
    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];
      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)
	VOID(pthread_mutex_unlock(&LOCK_open));
	continue;
      }
      if (type == FRMTYPE_TABLE)
      {
        if (!wrong_object_name)
        {
          wrong_object_db= view->db;
          wrong_object_name= view->table_name;
        }
      }
      if (type)
        my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW");
      else
      {
        if (non_existant_views.length())
          non_existant_views.append(',');
        non_existant_views.append(String(view->table_name,system_charset_info));
      }
      VOID(pthread_mutex_unlock(&LOCK_open));
      continue;
        my_error(ER_BAD_TABLE_ERROR, MYF(0), name);
      goto err;
    }
    if (my_delete(path, MYF(MY_WME)))
      error= TRUE;
      goto err;
    query_cache_invalidate3(thd, view, 0);
    sp_cache_invalidate();
    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);
  DBUG_RETURN(FALSE);

err:
  VOID(pthread_mutex_unlock(&LOCK_open));
  DBUG_RETURN(TRUE);

}


+2 −1
Original line number Diff line number Diff line
@@ -19,7 +19,8 @@
bool mysql_create_view(THD *thd,
                       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);

+2 −0
Original line number Diff line number Diff line
@@ -121,6 +121,8 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
    // caller can't process new .frm
    goto err;
  }
  if (prgflag & OPEN_VIEW_NO_PARSE)
    goto err;

  share->blob_ptr_size= sizeof(char*);
  outparam->db_stat= db_stat;
Loading