mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
cleanup
This commit is contained in:
@ -1150,6 +1150,16 @@ void acl_free(bool end)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void fix_table_list(TABLE_LIST *tl, uint n)
|
||||||
|
{
|
||||||
|
TABLE_LIST *end;
|
||||||
|
for (end= tl + n - 1; tl < end; tl++)
|
||||||
|
{
|
||||||
|
tl->next_local= tl->next_global= tl + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Forget current user/db-level privileges and read new privileges
|
Forget current user/db-level privileges and read new privileges
|
||||||
from the privilege tables.
|
from the privilege tables.
|
||||||
@ -1191,11 +1201,7 @@ my_bool acl_reload(THD *thd)
|
|||||||
tables[3].init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[3].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("proxies_priv"),
|
C_STRING_WITH_LEN("proxies_priv"),
|
||||||
"proxies_priv", TL_READ);
|
"proxies_priv", TL_READ);
|
||||||
tables[0].next_local= tables[0].next_global= tables + 1;
|
fix_table_list(tables, 4);
|
||||||
tables[1].next_local= tables[1].next_global= tables + 2;
|
|
||||||
tables[2].next_local= tables[2].next_global= tables + 3;
|
|
||||||
tables[0].open_type= tables[1].open_type= tables[2].open_type=
|
|
||||||
tables[3].open_type= OT_BASE_ONLY;
|
|
||||||
tables[3].open_strategy= TABLE_LIST::OPEN_IF_EXISTS;
|
tables[3].open_strategy= TABLE_LIST::OPEN_IF_EXISTS;
|
||||||
|
|
||||||
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
if (open_and_lock_tables(thd, tables, FALSE, MYSQL_LOCK_IGNORE_TIMEOUT))
|
||||||
@ -1921,6 +1927,7 @@ bool change_password(THD *thd, const char *host, const char *user,
|
|||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
tables.init_one_table("mysql", 5, "user", 4, "user", TL_WRITE);
|
tables.init_one_table("mysql", 5, "user", 4, "user", TL_WRITE);
|
||||||
|
fix_table_list(&tables, 1);
|
||||||
|
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
/*
|
/*
|
||||||
@ -2282,6 +2289,7 @@ static bool test_if_create_new_users(THD *thd)
|
|||||||
ulong db_access;
|
ulong db_access;
|
||||||
tl.init_one_table(C_STRING_WITH_LEN("mysql"),
|
tl.init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("user"), "user", TL_WRITE);
|
C_STRING_WITH_LEN("user"), "user", TL_WRITE);
|
||||||
|
fix_table_list(&tl, 1);
|
||||||
create_new_users= 1;
|
create_new_users= 1;
|
||||||
|
|
||||||
db_access=acl_get(sctx->host, sctx->ip,
|
db_access=acl_get(sctx->host, sctx->ip,
|
||||||
@ -3689,10 +3697,11 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||||||
tables[2].init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[2].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("columns_priv"),
|
C_STRING_WITH_LEN("columns_priv"),
|
||||||
"columns_priv", TL_WRITE);
|
"columns_priv", TL_WRITE);
|
||||||
tables[0].next_local= tables[0].next_global= tables+1;
|
|
||||||
/* Don't open column table if we don't need it ! */
|
/* Don't open column table if we don't need it ! */
|
||||||
if (column_priv || (revoke_grant && ((rights & COL_ACLS) || columns.elements)))
|
if (column_priv || (revoke_grant && ((rights & COL_ACLS) || columns.elements)))
|
||||||
tables[1].next_local= tables[1].next_global= tables+2;
|
fix_table_list(tables, 3);
|
||||||
|
else
|
||||||
|
fix_table_list(tables, 2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This statement will be replicated as a statement, even when using
|
This statement will be replicated as a statement, even when using
|
||||||
@ -3930,7 +3939,7 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
|
|||||||
C_STRING_WITH_LEN("user"), "user", TL_WRITE);
|
C_STRING_WITH_LEN("user"), "user", TL_WRITE);
|
||||||
tables[1].init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[1].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("procs_priv"), "procs_priv", TL_WRITE);
|
C_STRING_WITH_LEN("procs_priv"), "procs_priv", TL_WRITE);
|
||||||
tables[0].next_local= tables[0].next_global= tables+1;
|
fix_table_list(tables, 2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This statement will be replicated as a statement, even when using
|
This statement will be replicated as a statement, even when using
|
||||||
@ -4104,7 +4113,7 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
|
|||||||
C_STRING_WITH_LEN("db"),
|
C_STRING_WITH_LEN("db"),
|
||||||
"db",
|
"db",
|
||||||
TL_WRITE);
|
TL_WRITE);
|
||||||
tables[0].next_local= tables[0].next_global= tables+1;
|
fix_table_list(tables, 2);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This statement will be replicated as a statement, even when using
|
This statement will be replicated as a statement, even when using
|
||||||
@ -4525,10 +4534,7 @@ my_bool grant_reload(THD *thd)
|
|||||||
tables[2].init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[2].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("procs_priv"),
|
C_STRING_WITH_LEN("procs_priv"),
|
||||||
"procs_priv", TL_READ);
|
"procs_priv", TL_READ);
|
||||||
|
fix_table_list(tables, 3);
|
||||||
tables[0].next_local= tables[0].next_global= tables+1;
|
|
||||||
tables[1].next_local= tables[1].next_global= tables+2;
|
|
||||||
tables[0].open_type= tables[1].open_type= tables[2].open_type= OT_BASE_ONLY;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Reload will work in the following manner:-
|
Reload will work in the following manner:-
|
||||||
@ -5864,29 +5870,24 @@ int open_grant_tables(THD *thd, TABLE_LIST *tables)
|
|||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
tables->init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[0].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("user"), "user", TL_WRITE);
|
C_STRING_WITH_LEN("user"), "user", TL_WRITE);
|
||||||
(tables+1)->init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[1].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("db"), "db", TL_WRITE);
|
C_STRING_WITH_LEN("db"), "db", TL_WRITE);
|
||||||
(tables+2)->init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[2].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("tables_priv"),
|
C_STRING_WITH_LEN("tables_priv"),
|
||||||
"tables_priv", TL_WRITE);
|
"tables_priv", TL_WRITE);
|
||||||
(tables+3)->init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[3].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("columns_priv"),
|
C_STRING_WITH_LEN("columns_priv"),
|
||||||
"columns_priv", TL_WRITE);
|
"columns_priv", TL_WRITE);
|
||||||
(tables+4)->init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[4].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("procs_priv"),
|
C_STRING_WITH_LEN("procs_priv"),
|
||||||
"procs_priv", TL_WRITE);
|
"procs_priv", TL_WRITE);
|
||||||
(tables+5)->init_one_table(C_STRING_WITH_LEN("mysql"),
|
tables[5].init_one_table(C_STRING_WITH_LEN("mysql"),
|
||||||
C_STRING_WITH_LEN("proxies_priv"),
|
C_STRING_WITH_LEN("proxies_priv"),
|
||||||
"proxies_priv", TL_WRITE);
|
"proxies_priv", TL_WRITE);
|
||||||
tables[5].open_strategy= TABLE_LIST::OPEN_IF_EXISTS;
|
tables[5].open_strategy= TABLE_LIST::OPEN_IF_EXISTS;
|
||||||
|
fix_table_list(tables, 6);
|
||||||
tables->next_local= tables->next_global= tables + 1;
|
|
||||||
(tables+1)->next_local= (tables+1)->next_global= tables + 2;
|
|
||||||
(tables+2)->next_local= (tables+2)->next_global= tables + 3;
|
|
||||||
(tables+3)->next_local= (tables+3)->next_global= tables + 4;
|
|
||||||
(tables+4)->next_local= (tables+4)->next_global= tables + 5;
|
|
||||||
|
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
/*
|
/*
|
||||||
|
@ -4468,6 +4468,45 @@ open_and_process_routine(THD *thd, Query_tables_list *prelocking_ctx,
|
|||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
If we are not already in prelocked mode and extended table list is not
|
||||||
|
yet built we might have to build the prelocking set for this statement.
|
||||||
|
|
||||||
|
Since currently no prelocking strategy prescribes doing anything for
|
||||||
|
tables which are only read, we do below checks only if table is going
|
||||||
|
to be changed.
|
||||||
|
*/
|
||||||
|
bool extend_table_list(THD *thd, TABLE_LIST *tables,
|
||||||
|
Prelocking_strategy *prelocking_strategy,
|
||||||
|
bool has_prelocking_list)
|
||||||
|
{
|
||||||
|
bool error= false;
|
||||||
|
LEX *lex= thd->lex;
|
||||||
|
|
||||||
|
if (thd->locked_tables_mode <= LTM_LOCK_TABLES &&
|
||||||
|
! has_prelocking_list &&
|
||||||
|
tables->lock_type >= TL_WRITE_ALLOW_WRITE)
|
||||||
|
{
|
||||||
|
bool need_prelocking= FALSE;
|
||||||
|
TABLE_LIST **save_query_tables_last= lex->query_tables_last;
|
||||||
|
/*
|
||||||
|
Extend statement's table list and the prelocking set with
|
||||||
|
tables and routines according to the current prelocking
|
||||||
|
strategy.
|
||||||
|
|
||||||
|
For example, for DML statements we need to add tables and routines
|
||||||
|
used by triggers which are going to be invoked for this element of
|
||||||
|
table list and also add tables required for handling of foreign keys.
|
||||||
|
*/
|
||||||
|
error= prelocking_strategy->handle_table(thd, lex, tables,
|
||||||
|
&need_prelocking);
|
||||||
|
|
||||||
|
if (need_prelocking && ! lex->requires_prelocking())
|
||||||
|
lex->mark_as_requiring_prelocking(save_query_tables_last);
|
||||||
|
}
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Handle table list element by obtaining metadata lock, opening table or view
|
Handle table list element by obtaining metadata lock, opening table or view
|
||||||
@ -4496,15 +4535,14 @@ open_and_process_routine(THD *thd, Query_tables_list *prelocking_ctx,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
|
open_and_process_table(THD *thd, TABLE_LIST *tables, uint *counter, uint flags,
|
||||||
uint *counter, uint flags,
|
|
||||||
Prelocking_strategy *prelocking_strategy,
|
Prelocking_strategy *prelocking_strategy,
|
||||||
bool has_prelocking_list,
|
bool has_prelocking_list, Open_table_context *ot_ctx,
|
||||||
Open_table_context *ot_ctx,
|
|
||||||
MEM_ROOT *new_frm_mem)
|
MEM_ROOT *new_frm_mem)
|
||||||
{
|
{
|
||||||
bool error= FALSE;
|
bool error= FALSE;
|
||||||
bool safe_to_ignore_table= FALSE;
|
bool safe_to_ignore_table= FALSE;
|
||||||
|
LEX *lex= thd->lex;
|
||||||
DBUG_ENTER("open_and_process_table");
|
DBUG_ENTER("open_and_process_table");
|
||||||
DEBUG_SYNC(thd, "open_and_process_table");
|
DEBUG_SYNC(thd, "open_and_process_table");
|
||||||
|
|
||||||
@ -4654,38 +4692,9 @@ open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
|
|||||||
if (tables->open_strategy && !tables->table)
|
if (tables->open_strategy && !tables->table)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/*
|
error= extend_table_list(thd, tables, prelocking_strategy, has_prelocking_list);
|
||||||
If we are not already in prelocked mode and extended table list is not
|
|
||||||
yet built we might have to build the prelocking set for this statement.
|
|
||||||
|
|
||||||
Since currently no prelocking strategy prescribes doing anything for
|
|
||||||
tables which are only read, we do below checks only if table is going
|
|
||||||
to be changed.
|
|
||||||
*/
|
|
||||||
if (thd->locked_tables_mode <= LTM_LOCK_TABLES &&
|
|
||||||
! has_prelocking_list &&
|
|
||||||
tables->lock_type >= TL_WRITE_ALLOW_WRITE)
|
|
||||||
{
|
|
||||||
bool need_prelocking= FALSE;
|
|
||||||
TABLE_LIST **save_query_tables_last= lex->query_tables_last;
|
|
||||||
/*
|
|
||||||
Extend statement's table list and the prelocking set with
|
|
||||||
tables and routines according to the current prelocking
|
|
||||||
strategy.
|
|
||||||
|
|
||||||
For example, for DML statements we need to add tables and routines
|
|
||||||
used by triggers which are going to be invoked for this element of
|
|
||||||
table list and also add tables required for handling of foreign keys.
|
|
||||||
*/
|
|
||||||
error= prelocking_strategy->handle_table(thd, lex, tables,
|
|
||||||
&need_prelocking);
|
|
||||||
|
|
||||||
if (need_prelocking && ! lex->requires_prelocking())
|
|
||||||
lex->mark_as_requiring_prelocking(save_query_tables_last);
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
goto end;
|
goto end;
|
||||||
}
|
|
||||||
|
|
||||||
if (tables->lock_type != TL_UNLOCK && ! thd->locked_tables_mode)
|
if (tables->lock_type != TL_UNLOCK && ! thd->locked_tables_mode)
|
||||||
{
|
{
|
||||||
@ -4994,7 +5003,8 @@ open_tables_check_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
|
|||||||
@retval TRUE Error, reported.
|
@retval TRUE Error, reported.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags,
|
bool open_tables(THD *thd, TABLE_LIST **start, uint *counter,
|
||||||
|
Sroutine_hash_entry **sroutine_to_open_list, uint flags,
|
||||||
Prelocking_strategy *prelocking_strategy)
|
Prelocking_strategy *prelocking_strategy)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -5043,7 +5053,7 @@ restart:
|
|||||||
|
|
||||||
has_prelocking_list= thd->lex->requires_prelocking();
|
has_prelocking_list= thd->lex->requires_prelocking();
|
||||||
table_to_open= start;
|
table_to_open= start;
|
||||||
sroutine_to_open= (Sroutine_hash_entry**) &thd->lex->sroutines_list.first;
|
sroutine_to_open= sroutine_to_open_list;
|
||||||
*counter= 0;
|
*counter= 0;
|
||||||
thd_proc_info(thd, "Opening tables");
|
thd_proc_info(thd, "Opening tables");
|
||||||
|
|
||||||
@ -5112,10 +5122,9 @@ restart:
|
|||||||
for (tables= *table_to_open; tables;
|
for (tables= *table_to_open; tables;
|
||||||
table_to_open= &tables->next_global, tables= tables->next_global)
|
table_to_open= &tables->next_global, tables= tables->next_global)
|
||||||
{
|
{
|
||||||
error= open_and_process_table(thd, thd->lex, tables, counter,
|
error= open_and_process_table(thd, tables, counter, flags,
|
||||||
flags, prelocking_strategy,
|
prelocking_strategy, has_prelocking_list,
|
||||||
has_prelocking_list, &ot_ctx,
|
&ot_ctx, &new_frm_mem);
|
||||||
&new_frm_mem);
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
|
@ -276,7 +276,8 @@ int init_ftfuncs(THD *thd, SELECT_LEX* select, bool no_order);
|
|||||||
bool lock_table_names(THD *thd, TABLE_LIST *table_list,
|
bool lock_table_names(THD *thd, TABLE_LIST *table_list,
|
||||||
TABLE_LIST *table_list_end, ulong lock_wait_timeout,
|
TABLE_LIST *table_list_end, ulong lock_wait_timeout,
|
||||||
uint flags);
|
uint flags);
|
||||||
bool open_tables(THD *thd, TABLE_LIST **tables, uint *counter, uint flags,
|
bool open_tables(THD *thd, TABLE_LIST **tables, uint *counter,
|
||||||
|
Sroutine_hash_entry **sroutine_to_open, uint flags,
|
||||||
Prelocking_strategy *prelocking_strategy);
|
Prelocking_strategy *prelocking_strategy);
|
||||||
/* open_and_lock_tables with optional derived handling */
|
/* open_and_lock_tables with optional derived handling */
|
||||||
bool open_and_lock_tables(THD *thd, TABLE_LIST *tables,
|
bool open_and_lock_tables(THD *thd, TABLE_LIST *tables,
|
||||||
@ -498,6 +499,15 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
open_tables(THD *thd, TABLE_LIST **tables, uint *counter, uint flags,
|
||||||
|
Prelocking_strategy *prelocking_strategy)
|
||||||
|
{
|
||||||
|
return open_tables(thd, tables, counter, &thd->lex->sroutines_list.first,
|
||||||
|
flags, prelocking_strategy);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
open_tables(THD *thd, TABLE_LIST **tables, uint *counter, uint flags)
|
open_tables(THD *thd, TABLE_LIST **tables, uint *counter, uint flags)
|
||||||
{
|
{
|
||||||
@ -528,6 +538,10 @@ inline bool open_and_lock_tables(THD *thd, TABLE_LIST *tables,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool extend_table_list(THD *thd, TABLE_LIST *tables,
|
||||||
|
Prelocking_strategy *prelocking_strategy,
|
||||||
|
bool has_prelocking_list);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
A context of open_tables() function, used to recover
|
A context of open_tables() function, used to recover
|
||||||
from a failed open_table() or open_routine() attempt.
|
from a failed open_table() or open_routine() attempt.
|
||||||
|
@ -11159,14 +11159,14 @@ update:
|
|||||||
opt_low_priority opt_ignore join_table_list
|
opt_low_priority opt_ignore join_table_list
|
||||||
SET update_list
|
SET update_list
|
||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
SELECT_LEX *slex= &Lex->select_lex;
|
||||||
if (lex->select_lex.table_list.elements > 1)
|
if (slex->table_list.elements > 1)
|
||||||
lex->sql_command= SQLCOM_UPDATE_MULTI;
|
Lex->sql_command= SQLCOM_UPDATE_MULTI;
|
||||||
else if (lex->select_lex.get_table_list()->derived)
|
else if (slex->get_table_list()->derived)
|
||||||
{
|
{
|
||||||
/* it is single table update and it is update of derived table */
|
/* it is single table update and it is update of derived table */
|
||||||
my_error(ER_NON_UPDATABLE_TABLE, MYF(0),
|
my_error(ER_NON_UPDATABLE_TABLE, MYF(0),
|
||||||
lex->select_lex.get_table_list()->alias, "UPDATE");
|
slex->get_table_list()->alias, "UPDATE");
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -11174,7 +11174,7 @@ update:
|
|||||||
be too pessimistic. We will decrease lock level if possible in
|
be too pessimistic. We will decrease lock level if possible in
|
||||||
mysql_multi_update().
|
mysql_multi_update().
|
||||||
*/
|
*/
|
||||||
Select->set_lock_for_tables($3);
|
slex->set_lock_for_tables($3);
|
||||||
}
|
}
|
||||||
where_clause opt_order_clause delete_limit_clause {}
|
where_clause opt_order_clause delete_limit_clause {}
|
||||||
;
|
;
|
||||||
@ -13834,13 +13834,16 @@ table_lock:
|
|||||||
table_ident opt_table_alias lock_option
|
table_ident opt_table_alias lock_option
|
||||||
{
|
{
|
||||||
thr_lock_type lock_type= (thr_lock_type) $3;
|
thr_lock_type lock_type= (thr_lock_type) $3;
|
||||||
bool lock_for_write= (lock_type >= TL_WRITE_ALLOW_WRITE);
|
bool lock_for_write= lock_type >= TL_WRITE_ALLOW_WRITE;
|
||||||
if (!Select->add_table_to_list(thd, $1, $2, 0, lock_type,
|
ulong table_options= 0;
|
||||||
(lock_for_write ?
|
enum_mdl_type mdl_type= !lock_for_write
|
||||||
lock_type == TL_WRITE_CONCURRENT_INSERT ?
|
? MDL_SHARED_READ
|
||||||
MDL_SHARED_WRITE :
|
: lock_type == TL_WRITE_CONCURRENT_INSERT
|
||||||
MDL_SHARED_NO_READ_WRITE :
|
? MDL_SHARED_WRITE
|
||||||
MDL_SHARED_READ)))
|
: MDL_SHARED_NO_READ_WRITE;
|
||||||
|
|
||||||
|
if (!Select->add_table_to_list(thd, $1, $2, table_options,
|
||||||
|
lock_type, mdl_type))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
Reference in New Issue
Block a user