summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2019-04-03 17:21:10 +0200
committerSergei Golubchik <serg@mariadb.org>2019-04-24 11:15:38 +0200
commit66099b8f2d10cedf4ee75d12c0188f3a9b383e6c (patch)
treeb6ad866baf52373326dd53bf03883a3a12c7cae0
parent81a8d8be76b1cc22d8567ed66cf8c6b93591112c (diff)
downloadmariadb-git-66099b8f2d10cedf4ee75d12c0188f3a9b383e6c.tar.gz
cleanup
-rw-r--r--mysql-test/r/multi_update_big.result (renamed from mysql-test/r/multi_update2.result)0
-rw-r--r--mysql-test/t/multi_update_big.opt (renamed from mysql-test/t/multi_update2-master.opt)0
-rw-r--r--mysql-test/t/multi_update_big.test (renamed from mysql-test/t/multi_update2.test)0
-rw-r--r--sql/sql_acl.cc71
-rw-r--r--sql/sql_base.cc95
-rw-r--r--sql/sql_base.h16
-rw-r--r--sql/sql_yacc.yy29
7 files changed, 119 insertions, 92 deletions
diff --git a/mysql-test/r/multi_update2.result b/mysql-test/r/multi_update_big.result
index 3712e638f40..3712e638f40 100644
--- a/mysql-test/r/multi_update2.result
+++ b/mysql-test/r/multi_update_big.result
diff --git a/mysql-test/t/multi_update2-master.opt b/mysql-test/t/multi_update_big.opt
index da78f987af3..da78f987af3 100644
--- a/mysql-test/t/multi_update2-master.opt
+++ b/mysql-test/t/multi_update_big.opt
diff --git a/mysql-test/t/multi_update2.test b/mysql-test/t/multi_update_big.test
index a0f17fabec4..a0f17fabec4 100644
--- a/mysql-test/t/multi_update2.test
+++ b/mysql-test/t/multi_update_big.test
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 066e7e4c7f4..19ecd870307 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -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
from the privilege tables.
@@ -1191,11 +1201,7 @@ my_bool acl_reload(THD *thd)
tables[3].init_one_table(C_STRING_WITH_LEN("mysql"),
C_STRING_WITH_LEN("proxies_priv"),
"proxies_priv", TL_READ);
- tables[0].next_local= tables[0].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[0].open_type= tables[1].open_type= tables[2].open_type=
- tables[3].open_type= OT_BASE_ONLY;
+ fix_table_list(tables, 4);
tables[3].open_strategy= TABLE_LIST::OPEN_IF_EXISTS;
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);
tables.init_one_table("mysql", 5, "user", 4, "user", TL_WRITE);
+ fix_table_list(&tables, 1);
#ifdef HAVE_REPLICATION
/*
@@ -2282,6 +2289,7 @@ static bool test_if_create_new_users(THD *thd)
ulong db_access;
tl.init_one_table(C_STRING_WITH_LEN("mysql"),
C_STRING_WITH_LEN("user"), "user", TL_WRITE);
+ fix_table_list(&tl, 1);
create_new_users= 1;
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"),
C_STRING_WITH_LEN("columns_priv"),
"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 ! */
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
@@ -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);
tables[1].init_one_table(C_STRING_WITH_LEN("mysql"),
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
@@ -4104,7 +4113,7 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
C_STRING_WITH_LEN("db"),
"db",
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
@@ -4525,10 +4534,7 @@ my_bool grant_reload(THD *thd)
tables[2].init_one_table(C_STRING_WITH_LEN("mysql"),
C_STRING_WITH_LEN("procs_priv"),
"procs_priv", TL_READ);
-
- 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;
+ fix_table_list(tables, 3);
/*
Reload will work in the following manner:-
@@ -5864,29 +5870,24 @@ int open_grant_tables(THD *thd, TABLE_LIST *tables)
DBUG_RETURN(-1);
}
- tables->init_one_table(C_STRING_WITH_LEN("mysql"),
- C_STRING_WITH_LEN("user"), "user", TL_WRITE);
- (tables+1)->init_one_table(C_STRING_WITH_LEN("mysql"),
- C_STRING_WITH_LEN("db"), "db", TL_WRITE);
- (tables+2)->init_one_table(C_STRING_WITH_LEN("mysql"),
- C_STRING_WITH_LEN("tables_priv"),
- "tables_priv", TL_WRITE);
- (tables+3)->init_one_table(C_STRING_WITH_LEN("mysql"),
- C_STRING_WITH_LEN("columns_priv"),
- "columns_priv", TL_WRITE);
- (tables+4)->init_one_table(C_STRING_WITH_LEN("mysql"),
- C_STRING_WITH_LEN("procs_priv"),
- "procs_priv", TL_WRITE);
- (tables+5)->init_one_table(C_STRING_WITH_LEN("mysql"),
- C_STRING_WITH_LEN("proxies_priv"),
- "proxies_priv", TL_WRITE);
+ tables[0].init_one_table(C_STRING_WITH_LEN("mysql"),
+ C_STRING_WITH_LEN("user"), "user", TL_WRITE);
+ tables[1].init_one_table(C_STRING_WITH_LEN("mysql"),
+ C_STRING_WITH_LEN("db"), "db", TL_WRITE);
+ tables[2].init_one_table(C_STRING_WITH_LEN("mysql"),
+ C_STRING_WITH_LEN("tables_priv"),
+ "tables_priv", TL_WRITE);
+ tables[3].init_one_table(C_STRING_WITH_LEN("mysql"),
+ C_STRING_WITH_LEN("columns_priv"),
+ "columns_priv", TL_WRITE);
+ tables[4].init_one_table(C_STRING_WITH_LEN("mysql"),
+ C_STRING_WITH_LEN("procs_priv"),
+ "procs_priv", TL_WRITE);
+ tables[5].init_one_table(C_STRING_WITH_LEN("mysql"),
+ C_STRING_WITH_LEN("proxies_priv"),
+ "proxies_priv", TL_WRITE);
tables[5].open_strategy= TABLE_LIST::OPEN_IF_EXISTS;
-
- 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;
+ fix_table_list(tables, 6);
#ifdef HAVE_REPLICATION
/*
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 272aa11977d..9a2da7a8658 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -4468,6 +4468,45 @@ open_and_process_routine(THD *thd, Query_tables_list *prelocking_ctx,
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
@@ -4496,15 +4535,14 @@ open_and_process_routine(THD *thd, Query_tables_list *prelocking_ctx,
*/
static bool
-open_and_process_table(THD *thd, LEX *lex, TABLE_LIST *tables,
- uint *counter, uint flags,
+open_and_process_table(THD *thd, TABLE_LIST *tables, uint *counter, uint flags,
Prelocking_strategy *prelocking_strategy,
- bool has_prelocking_list,
- Open_table_context *ot_ctx,
+ bool has_prelocking_list, Open_table_context *ot_ctx,
MEM_ROOT *new_frm_mem)
{
bool error= FALSE;
bool safe_to_ignore_table= FALSE;
+ LEX *lex= thd->lex;
DBUG_ENTER("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)
goto end;
- /*
- 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)
- goto end;
- }
+ error= extend_table_list(thd, tables, prelocking_strategy, has_prelocking_list);
+ if (error)
+ goto end;
if (tables->lock_type != TL_UNLOCK && ! thd->locked_tables_mode)
{
@@ -4994,8 +5003,9 @@ open_tables_check_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
@retval TRUE Error, reported.
*/
-bool open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags,
- Prelocking_strategy *prelocking_strategy)
+bool open_tables(THD *thd, TABLE_LIST **start, uint *counter,
+ Sroutine_hash_entry **sroutine_to_open_list, uint flags,
+ Prelocking_strategy *prelocking_strategy)
{
/*
We use pointers to "next_global" member in the last processed TABLE_LIST
@@ -5043,7 +5053,7 @@ restart:
has_prelocking_list= thd->lex->requires_prelocking();
table_to_open= start;
- sroutine_to_open= (Sroutine_hash_entry**) &thd->lex->sroutines_list.first;
+ sroutine_to_open= sroutine_to_open_list;
*counter= 0;
thd_proc_info(thd, "Opening tables");
@@ -5112,10 +5122,9 @@ restart:
for (tables= *table_to_open; tables;
table_to_open= &tables->next_global, tables= tables->next_global)
{
- error= open_and_process_table(thd, thd->lex, tables, counter,
- flags, prelocking_strategy,
- has_prelocking_list, &ot_ctx,
- &new_frm_mem);
+ error= open_and_process_table(thd, tables, counter, flags,
+ prelocking_strategy, has_prelocking_list,
+ &ot_ctx, &new_frm_mem);
if (error)
{
diff --git a/sql/sql_base.h b/sql/sql_base.h
index 646e391a58b..4d9ccc460e9 100644
--- a/sql/sql_base.h
+++ b/sql/sql_base.h
@@ -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,
TABLE_LIST *table_list_end, ulong lock_wait_timeout,
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);
/* open_and_lock_tables with optional derived handling */
bool open_and_lock_tables(THD *thd, TABLE_LIST *tables,
@@ -499,6 +500,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
open_tables(THD *thd, TABLE_LIST **tables, uint *counter, uint flags)
{
DML_prelocking_strategy prelocking_strategy;
@@ -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
from a failed open_table() or open_routine() attempt.
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index ba0041cf477..760aed5c5e3 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -11159,14 +11159,14 @@ update:
opt_low_priority opt_ignore join_table_list
SET update_list
{
- LEX *lex= Lex;
- if (lex->select_lex.table_list.elements > 1)
- lex->sql_command= SQLCOM_UPDATE_MULTI;
- else if (lex->select_lex.get_table_list()->derived)
+ SELECT_LEX *slex= &Lex->select_lex;
+ if (slex->table_list.elements > 1)
+ Lex->sql_command= SQLCOM_UPDATE_MULTI;
+ else if (slex->get_table_list()->derived)
{
/* it is single table update and it is update of derived table */
my_error(ER_NON_UPDATABLE_TABLE, MYF(0),
- lex->select_lex.get_table_list()->alias, "UPDATE");
+ slex->get_table_list()->alias, "UPDATE");
MYSQL_YYABORT;
}
/*
@@ -11174,7 +11174,7 @@ update:
be too pessimistic. We will decrease lock level if possible in
mysql_multi_update().
*/
- Select->set_lock_for_tables($3);
+ slex->set_lock_for_tables($3);
}
where_clause opt_order_clause delete_limit_clause {}
;
@@ -13834,13 +13834,16 @@ table_lock:
table_ident opt_table_alias lock_option
{
thr_lock_type lock_type= (thr_lock_type) $3;
- bool lock_for_write= (lock_type >= TL_WRITE_ALLOW_WRITE);
- if (!Select->add_table_to_list(thd, $1, $2, 0, lock_type,
- (lock_for_write ?
- lock_type == TL_WRITE_CONCURRENT_INSERT ?
- MDL_SHARED_WRITE :
- MDL_SHARED_NO_READ_WRITE :
- MDL_SHARED_READ)))
+ bool lock_for_write= lock_type >= TL_WRITE_ALLOW_WRITE;
+ ulong table_options= 0;
+ enum_mdl_type mdl_type= !lock_for_write
+ ? MDL_SHARED_READ
+ : lock_type == TL_WRITE_CONCURRENT_INSERT
+ ? MDL_SHARED_WRITE
+ : MDL_SHARED_NO_READ_WRITE;
+
+ if (!Select->add_table_to_list(thd, $1, $2, table_options,
+ lock_type, mdl_type))
MYSQL_YYABORT;
}
;