Lots of small cleanups
- Simplified use_trans_cache() to return at once if is_transactional is set - Indentation and spelling errors fixed - Don't call signal_update() if update_binlog_end_pos() is called as the function already calls signal_update() - Removed not used function wait_for_update_bin_log(), which would cause errors if ever used. - Simplified handler::clone() by always allocating 'ref' in ha_open(). To do this I added an optional MEM_ROOT argument to ha_open() to be used when allocating 'ref' - Changed arguments to get_system_var() from LEX_CSTRING to LEX_CSTRING* - Added THD as argument to create_select_for_variable(). Changed also char* argument to LEX_CSTRING to avoid strlen() call. - Change calls to append() to use LEX_CSTRING
This commit is contained in:
parent
a70f7aad55
commit
458d5ed8aa
@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
*******************************************************/
|
||||
|
||||
#include <my_global.h>
|
||||
#include <my_base.h>
|
||||
#include <archive.h>
|
||||
#include <archive_entry.h>
|
||||
|
@ -1,3 +1,18 @@
|
||||
/* Copyright (c) 2017, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
|
||||
|
||||
#include <my_global.h>
|
||||
#include <mysqld.h>
|
||||
#include <mysql.h>
|
||||
|
@ -24,7 +24,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
#include <my_global.h>
|
||||
#include <my_base.h>
|
||||
|
||||
#include <fil0fil.h>
|
||||
#include <fsp0fsp.h>
|
||||
#include <srv0start.h>
|
||||
|
@ -43,6 +43,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
//#define XTRABACKUP_TARGET_IS_PLUGIN
|
||||
|
||||
#include <my_global.h>
|
||||
#include <my_config.h>
|
||||
#include <unireg.h>
|
||||
#include <mysql_version.h>
|
||||
|
@ -149,10 +149,11 @@ static inline void remove_from_active_list(safe_mutex_t *mp)
|
||||
}
|
||||
|
||||
/*
|
||||
We initialise the hashes for deadlock detection lazily.
|
||||
This greatly helps with performance when lots of mutexes are initiased but
|
||||
We initialize the hashes for deadlock detection lazily.
|
||||
This greatly helps with performance when lots of mutexes are initialized but
|
||||
only a few of them are actually used (eg. InnoDB).
|
||||
*/
|
||||
|
||||
static int safe_mutex_lazy_init_deadlock_detection(safe_mutex_t *mp)
|
||||
{
|
||||
if (!my_multi_malloc(MY_FAE | MY_WME,
|
||||
|
@ -1236,7 +1236,7 @@ Event_timed::get_create_event(THD *thd, String *buf)
|
||||
append_unescaped(buf, comment.str, comment.length);
|
||||
}
|
||||
buf->append(STRING_WITH_LEN(" DO "));
|
||||
buf->append(body.str, body.length);
|
||||
buf->append(&body);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
@ -1284,7 +1284,7 @@ Event_job_data::construct_sp_sql(THD *thd, String *sp_sql)
|
||||
*/
|
||||
sp_sql->append(C_STRING_WITH_LEN("() SQL SECURITY INVOKER "));
|
||||
|
||||
sp_sql->append(body.str, body.length);
|
||||
sp_sql->append(&body);
|
||||
|
||||
DBUG_RETURN(thd->is_fatal_error);
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ Event_worker_thread::print_warnings(THD *thd, Event_job_data *et)
|
||||
char prefix_buf[5 * STRING_BUFFER_USUAL_SIZE];
|
||||
String prefix(prefix_buf, sizeof(prefix_buf), system_charset_info);
|
||||
prefix.length(0);
|
||||
prefix.append("Event Scheduler: [");
|
||||
prefix.append(STRING_WITH_LEN("Event Scheduler: ["));
|
||||
|
||||
prefix.append(et->definer.str, et->definer.length, system_charset_info);
|
||||
prefix.append("][", 2);
|
||||
|
@ -2360,6 +2360,18 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path,
|
||||
/****************************************************************************
|
||||
** General handler functions
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
/**
|
||||
Clone a handler
|
||||
|
||||
@param name name of new table instance
|
||||
@param mem_root Where 'this->ref' should be allocated. It can't be
|
||||
in this->table->mem_root as otherwise we will not be
|
||||
able to reclaim that memory when the clone handler
|
||||
object is destroyed.
|
||||
*/
|
||||
|
||||
handler *handler::clone(const char *name, MEM_ROOT *mem_root)
|
||||
{
|
||||
handler *new_handler= get_new_handler(table->s, mem_root, ht);
|
||||
@ -2369,16 +2381,6 @@ handler *handler::clone(const char *name, MEM_ROOT *mem_root)
|
||||
if (new_handler->set_ha_share_ref(ha_share))
|
||||
goto err;
|
||||
|
||||
/*
|
||||
Allocate handler->ref here because otherwise ha_open will allocate it
|
||||
on this->table->mem_root and we will not be able to reclaim that memory
|
||||
when the clone handler object is destroyed.
|
||||
*/
|
||||
|
||||
if (!(new_handler->ref= (uchar*) alloc_root(mem_root,
|
||||
ALIGN_SIZE(ref_length)*2)))
|
||||
goto err;
|
||||
|
||||
/*
|
||||
TODO: Implement a more efficient way to have more than one index open for
|
||||
the same table instance. The ha_open call is not cachable for clone.
|
||||
@ -2387,7 +2389,7 @@ handler *handler::clone(const char *name, MEM_ROOT *mem_root)
|
||||
and should be able to use the original instance of the table.
|
||||
*/
|
||||
if (new_handler->ha_open(table, name, table->db_stat,
|
||||
HA_OPEN_IGNORE_IF_LOCKED))
|
||||
HA_OPEN_IGNORE_IF_LOCKED, mem_root))
|
||||
goto err;
|
||||
|
||||
return new_handler;
|
||||
@ -2465,7 +2467,7 @@ PSI_table_share *handler::ha_table_share_psi() const
|
||||
Don't wait for locks if not HA_OPEN_WAIT_IF_LOCKED is set
|
||||
*/
|
||||
int handler::ha_open(TABLE *table_arg, const char *name, int mode,
|
||||
uint test_if_locked)
|
||||
uint test_if_locked, MEM_ROOT *mem_root)
|
||||
{
|
||||
int error;
|
||||
DBUG_ENTER("handler::ha_open");
|
||||
@ -2512,9 +2514,9 @@ int handler::ha_open(TABLE *table_arg, const char *name, int mode,
|
||||
table->db_stat|=HA_READ_ONLY;
|
||||
(void) extra(HA_EXTRA_NO_READCHECK); // Not needed in SQL
|
||||
|
||||
/* ref is already allocated for us if we're called from handler::clone() */
|
||||
if (!ref && !(ref= (uchar*) alloc_root(&table->mem_root,
|
||||
ALIGN_SIZE(ref_length)*2)))
|
||||
/* Allocate ref in thd or on the table's mem_root */
|
||||
if (!(ref= (uchar*) alloc_root(mem_root ? mem_root : &table->mem_root,
|
||||
ALIGN_SIZE(ref_length)*2)))
|
||||
{
|
||||
ha_close();
|
||||
error=HA_ERR_OUT_OF_MEM;
|
||||
|
@ -2832,7 +2832,8 @@ public:
|
||||
}
|
||||
/* ha_ methods: pubilc wrappers for private virtual API */
|
||||
|
||||
int ha_open(TABLE *table, const char *name, int mode, uint test_if_locked);
|
||||
int ha_open(TABLE *table, const char *name, int mode, uint test_if_locked,
|
||||
MEM_ROOT *mem_root= 0);
|
||||
int ha_index_init(uint idx, bool sorted)
|
||||
{
|
||||
DBUG_EXECUTE_IF("ha_index_init_fail", return HA_ERR_TABLE_DEF_CHANGED;);
|
||||
|
12
sql/item.cc
12
sql/item.cc
@ -1691,7 +1691,7 @@ Item_splocal::this_item_addr(THD *thd, Item **)
|
||||
void Item_splocal::print(String *str, enum_query_type)
|
||||
{
|
||||
str->reserve(m_name.length+8);
|
||||
str->append(m_name.str, m_name.length);
|
||||
str->append(&m_name);
|
||||
str->append('@');
|
||||
str->qs_append(m_var_idx);
|
||||
}
|
||||
@ -1816,9 +1816,9 @@ Item_splocal_row_field::this_item_addr(THD *thd, Item **)
|
||||
void Item_splocal_row_field::print(String *str, enum_query_type)
|
||||
{
|
||||
str->reserve(m_name.length + m_field_name.length + 8);
|
||||
str->append(m_name.str, m_name.length);
|
||||
str->append(&m_name);
|
||||
str->append('.');
|
||||
str->append(m_field_name.str, m_field_name.length);
|
||||
str->append(&m_field_name);
|
||||
str->append('@');
|
||||
str->qs_append(m_var_idx);
|
||||
str->append('[');
|
||||
@ -1854,13 +1854,13 @@ void Item_splocal_row_field_by_name::print(String *str, enum_query_type)
|
||||
// +16 should be enough for .NNN@[""]
|
||||
if (str->reserve(m_name.length + 2 * m_field_name.length + 16))
|
||||
return;
|
||||
str->qs_append(m_name.str, m_name.length);
|
||||
str->qs_append(&m_name);
|
||||
str->qs_append('.');
|
||||
str->qs_append(m_field_name.str, m_field_name.length);
|
||||
str->qs_append(&m_field_name);
|
||||
str->qs_append('@');
|
||||
str->qs_append(m_var_idx);
|
||||
str->qs_append("[\"", 2);
|
||||
str->qs_append(m_field_name.str, m_field_name.length);
|
||||
str->qs_append(&m_field_name);
|
||||
str->qs_append("\"]", 2);
|
||||
}
|
||||
|
||||
|
@ -4995,7 +4995,7 @@ bool Item_func_set_user_var::is_null_result()
|
||||
void Item_func_set_user_var::print(String *str, enum_query_type query_type)
|
||||
{
|
||||
str->append(STRING_WITH_LEN("@"));
|
||||
str->append(name.str, name.length);
|
||||
str->append(&name);
|
||||
str->append(STRING_WITH_LEN(":="));
|
||||
args[0]->print_parenthesised(str, query_type, precedence());
|
||||
}
|
||||
@ -5005,7 +5005,7 @@ void Item_func_set_user_var::print_as_stmt(String *str,
|
||||
enum_query_type query_type)
|
||||
{
|
||||
str->append(STRING_WITH_LEN("set @"));
|
||||
str->append(name.str, name.length);
|
||||
str->append(&name);
|
||||
str->append(STRING_WITH_LEN(":="));
|
||||
args[0]->print_parenthesised(str, query_type, precedence());
|
||||
}
|
||||
@ -5588,7 +5588,7 @@ void Item_func_get_system_var::fix_length_and_dec()
|
||||
void Item_func_get_system_var::print(String *str, enum_query_type query_type)
|
||||
{
|
||||
if (name.length)
|
||||
str->append(name.str, name.length);
|
||||
str->append(&name);
|
||||
else
|
||||
{
|
||||
str->append(STRING_WITH_LEN("@@"));
|
||||
@ -6122,39 +6122,41 @@ longlong Item_func_bit_xor::val_int()
|
||||
*/
|
||||
|
||||
|
||||
Item *get_system_var(THD *thd, enum_var_type var_type, LEX_CSTRING name,
|
||||
LEX_CSTRING component)
|
||||
Item *get_system_var(THD *thd, enum_var_type var_type,
|
||||
const LEX_CSTRING *name,
|
||||
const LEX_CSTRING *component)
|
||||
{
|
||||
sys_var *var;
|
||||
LEX_CSTRING *base_name, *component_name;
|
||||
LEX_CSTRING base_name, component_name;
|
||||
|
||||
if (component.str)
|
||||
if (component->str)
|
||||
{
|
||||
base_name= &component;
|
||||
component_name= &name;
|
||||
base_name= *component;
|
||||
component_name= *name;
|
||||
}
|
||||
else
|
||||
{
|
||||
base_name= &name;
|
||||
component_name= &component; // Empty string
|
||||
base_name= *name;
|
||||
component_name= *component; // Empty string
|
||||
}
|
||||
|
||||
if (!(var= find_sys_var(thd, base_name->str, base_name->length)))
|
||||
if (!(var= find_sys_var(thd, base_name.str, base_name.length)))
|
||||
return 0;
|
||||
if (component.str)
|
||||
if (component->str)
|
||||
{
|
||||
if (!var->is_struct())
|
||||
{
|
||||
my_error(ER_VARIABLE_IS_NOT_STRUCT, MYF(0), base_name->str);
|
||||
my_error(ER_VARIABLE_IS_NOT_STRUCT, MYF(0), base_name.str);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT);
|
||||
|
||||
set_if_smaller(component_name->length, MAX_SYS_VAR_LENGTH);
|
||||
set_if_smaller(component_name.length, MAX_SYS_VAR_LENGTH);
|
||||
|
||||
return new (thd->mem_root) Item_func_get_system_var(thd, var, var_type, component_name,
|
||||
NULL, 0);
|
||||
return new (thd->mem_root) Item_func_get_system_var(thd, var, var_type,
|
||||
&component_name,
|
||||
NULL, 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2975,8 +2975,8 @@ public:
|
||||
};
|
||||
|
||||
|
||||
Item *get_system_var(THD *thd, enum_var_type var_type, LEX_CSTRING name,
|
||||
LEX_CSTRING component);
|
||||
Item *get_system_var(THD *thd, enum_var_type var_type,
|
||||
const LEX_CSTRING *name, const LEX_CSTRING *component);
|
||||
extern bool check_reserved_words(const LEX_CSTRING *name);
|
||||
Item *find_date_time_item(Item **args, uint nargs, uint col);
|
||||
double my_double_round(double value, longlong dec, bool dec_unsigned,
|
||||
|
@ -949,7 +949,7 @@ void Item_subselect::print(String *str, enum_query_type query_type)
|
||||
{
|
||||
if (query_type & QT_ITEM_SUBSELECT_ID_ONLY)
|
||||
{
|
||||
str->append("(subquery#");
|
||||
str->append(STRING_WITH_LEN("(subquery#"));
|
||||
if (unit && unit->first_select())
|
||||
{
|
||||
char buf[64];
|
||||
@ -4358,7 +4358,6 @@ void subselect_union_engine::print(String *str, enum_query_type query_type)
|
||||
void subselect_uniquesubquery_engine::print(String *str,
|
||||
enum_query_type query_type)
|
||||
{
|
||||
const char *table_name= tab->table->s->table_name.str;
|
||||
str->append(STRING_WITH_LEN("<primary_index_lookup>("));
|
||||
tab->ref.items[0]->print(str, query_type);
|
||||
str->append(STRING_WITH_LEN(" in "));
|
||||
@ -4371,7 +4370,7 @@ void subselect_uniquesubquery_engine::print(String *str,
|
||||
str->append(STRING_WITH_LEN("<temporary table>"));
|
||||
}
|
||||
else
|
||||
str->append(table_name, tab->table->s->table_name.length);
|
||||
str->append(&tab->table->s->table_name);
|
||||
KEY *key_info= tab->table->key_info+ tab->ref.key;
|
||||
str->append(STRING_WITH_LEN(" on "));
|
||||
str->append(key_info->name);
|
||||
@ -4395,7 +4394,7 @@ void subselect_uniquesubquery_engine::print(String *str)
|
||||
for (uint i= 0; i < key_info->user_defined_key_parts; i++)
|
||||
tab->ref.items[i]->print(str);
|
||||
str->append(STRING_WITH_LEN(" in "));
|
||||
str->append(tab->table->s->table_name.str, tab->table->s->table_name.length);
|
||||
str->append(&tab->table->s->table_name);
|
||||
str->append(STRING_WITH_LEN(" on "));
|
||||
str->append(key_info->name);
|
||||
if (cond)
|
||||
|
66
sql/log.cc
66
sql/log.cc
@ -2887,27 +2887,27 @@ bool MYSQL_QUERY_LOG::write(time_t event_time, const char *user_host,
|
||||
DBUG_EXECUTE_IF("reset_log_last_time", last_time= 0;);
|
||||
|
||||
/* Note that my_b_write() assumes it knows the length for this */
|
||||
if (event_time != last_time)
|
||||
{
|
||||
last_time= event_time;
|
||||
if (event_time != last_time)
|
||||
{
|
||||
last_time= event_time;
|
||||
|
||||
localtime_r(&event_time, &start);
|
||||
localtime_r(&event_time, &start);
|
||||
|
||||
time_buff_len= my_snprintf(local_time_buff, MAX_TIME_SIZE,
|
||||
"%02d%02d%02d %2d:%02d:%02d\t",
|
||||
start.tm_year % 100, start.tm_mon + 1,
|
||||
start.tm_mday, start.tm_hour,
|
||||
start.tm_min, start.tm_sec);
|
||||
time_buff_len= my_snprintf(local_time_buff, MAX_TIME_SIZE,
|
||||
"%02d%02d%02d %2d:%02d:%02d\t",
|
||||
start.tm_year % 100, start.tm_mon + 1,
|
||||
start.tm_mday, start.tm_hour,
|
||||
start.tm_min, start.tm_sec);
|
||||
|
||||
if (my_b_write(&log_file, (uchar*) local_time_buff, time_buff_len))
|
||||
goto err;
|
||||
}
|
||||
else
|
||||
if (my_b_write(&log_file, (uchar*) "\t\t" ,2) < 0)
|
||||
goto err;
|
||||
if (my_b_write(&log_file, (uchar*) local_time_buff, time_buff_len))
|
||||
goto err;
|
||||
}
|
||||
else
|
||||
if (my_b_write(&log_file, (uchar*) "\t\t" ,2) < 0)
|
||||
goto err;
|
||||
|
||||
/* command_type, thread_id */
|
||||
size_t length= my_snprintf(buff, 32, "%6llu ", thread_id_arg);
|
||||
/* command_type, thread_id */
|
||||
size_t length= my_snprintf(buff, 32, "%6llu ", thread_id_arg);
|
||||
|
||||
if (my_b_write(&log_file, (uchar*) buff, length))
|
||||
goto err;
|
||||
@ -5433,13 +5433,14 @@ stmt_has_updated_trans_table(const THD *thd)
|
||||
*/
|
||||
bool use_trans_cache(const THD* thd, bool is_transactional)
|
||||
{
|
||||
if (is_transactional)
|
||||
return 1;
|
||||
binlog_cache_mngr *const cache_mngr=
|
||||
(binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
|
||||
|
||||
return
|
||||
((thd->is_current_stmt_binlog_format_row() ||
|
||||
thd->variables.binlog_direct_non_trans_update) ? is_transactional :
|
||||
(is_transactional || !cache_mngr->trx_cache.empty()));
|
||||
return ((thd->is_current_stmt_binlog_format_row() ||
|
||||
thd->variables.binlog_direct_non_trans_update) ? 0 :
|
||||
!cache_mngr->trx_cache.empty());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -6360,7 +6361,6 @@ err:
|
||||
*/
|
||||
update_binlog_end_pos(offset);
|
||||
|
||||
signal_update();
|
||||
if ((error= rotate(false, &check_purge)))
|
||||
check_purge= false;
|
||||
}
|
||||
@ -7675,7 +7675,6 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader)
|
||||
else
|
||||
{
|
||||
bool any_error= false;
|
||||
bool all_error= true;
|
||||
|
||||
mysql_mutex_assert_not_owner(&LOCK_prepare_ordered);
|
||||
mysql_mutex_assert_owner(&LOCK_log);
|
||||
@ -7697,8 +7696,6 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader)
|
||||
current->error_cache= NULL;
|
||||
any_error= true;
|
||||
}
|
||||
else
|
||||
all_error= false;
|
||||
first= false;
|
||||
}
|
||||
|
||||
@ -7712,8 +7709,6 @@ MYSQL_BIN_LOG::trx_group_commit_leader(group_commit_entry *leader)
|
||||
|
||||
if (any_error)
|
||||
sql_print_error("Failed to run 'after_flush' hooks");
|
||||
if (!all_error)
|
||||
signal_update();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -8117,23 +8112,6 @@ void MYSQL_BIN_LOG::wait_for_update_relay_log(THD* thd)
|
||||
LOCK_log is released by the caller.
|
||||
*/
|
||||
|
||||
int MYSQL_BIN_LOG::wait_for_update_bin_log(THD* thd,
|
||||
const struct timespec *timeout)
|
||||
{
|
||||
int ret= 0;
|
||||
DBUG_ENTER("wait_for_update_bin_log");
|
||||
|
||||
thd_wait_begin(thd, THD_WAIT_BINLOG);
|
||||
mysql_mutex_assert_owner(&LOCK_log);
|
||||
if (!timeout)
|
||||
mysql_cond_wait(&update_cond, &LOCK_log);
|
||||
else
|
||||
ret= mysql_cond_timedwait(&update_cond, &LOCK_log,
|
||||
const_cast<struct timespec *>(timeout));
|
||||
thd_wait_end(thd);
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
int MYSQL_BIN_LOG::wait_for_update_binlog_end_pos(THD* thd,
|
||||
struct timespec *timeout)
|
||||
{
|
||||
|
@ -711,7 +711,6 @@ public:
|
||||
void wait_for_sufficient_commits();
|
||||
void binlog_trigger_immediate_group_commit();
|
||||
void wait_for_update_relay_log(THD* thd);
|
||||
int wait_for_update_bin_log(THD* thd, const struct timespec * timeout);
|
||||
void init(ulong max_size);
|
||||
void init_pthread_objects();
|
||||
void cleanup();
|
||||
|
@ -319,7 +319,7 @@ public:
|
||||
LEX_STRING tmp_str;
|
||||
if (copy_event_cache_to_string_and_reinit(m_cache, &tmp_str))
|
||||
exit(1);
|
||||
m_ev->output_buf.append(tmp_str.str, tmp_str.length);
|
||||
m_ev->output_buf.append(&tmp_str);
|
||||
my_free(tmp_str.str);
|
||||
}
|
||||
#else /* MySQL_SERVER */
|
||||
|
@ -1216,7 +1216,7 @@ bool Transaction_state_tracker::store(THD *thd, String *buf)
|
||||
tx_isolation_typelib as it hyphenates its items.
|
||||
*/
|
||||
buf->append(STRING_WITH_LEN("SET TRANSACTION ISOLATION LEVEL "));
|
||||
buf->append(isol[tx_isol_level - 1].str, isol[tx_isol_level - 1].length);
|
||||
buf->append(&isol[tx_isol_level - 1]);
|
||||
buf->append(STRING_WITH_LEN("; "));
|
||||
}
|
||||
|
||||
|
@ -3357,7 +3357,7 @@ sp_instr_set::print(String *str)
|
||||
str->qs_append(STRING_WITH_LEN("set "));
|
||||
if (var)
|
||||
{
|
||||
str->qs_append(var->name.str, var->name.length);
|
||||
str->qs_append(&var->name);
|
||||
str->qs_append('@');
|
||||
}
|
||||
str->qs_append(m_offset);
|
||||
@ -3403,9 +3403,9 @@ sp_instr_set_row_field::print(String *str)
|
||||
if (str->reserve(rsrv))
|
||||
return;
|
||||
str->qs_append(STRING_WITH_LEN("set "));
|
||||
str->qs_append(var->name.str, var->name.length);
|
||||
str->qs_append(&var->name);
|
||||
str->qs_append('.');
|
||||
str->qs_append(def->field_name.str, def->field_name.length);
|
||||
str->qs_append(&def->field_name);
|
||||
str->qs_append('@');
|
||||
str->qs_append(m_offset);
|
||||
str->qs_append('[');
|
||||
@ -3461,13 +3461,13 @@ sp_instr_set_row_field_by_name::print(String *str)
|
||||
if (str->reserve(rsrv))
|
||||
return;
|
||||
str->qs_append(STRING_WITH_LEN("set "));
|
||||
str->qs_append(var->name.str, var->name.length);
|
||||
str->qs_append(&var->name);
|
||||
str->qs_append('.');
|
||||
str->qs_append(m_field_name.str, m_field_name.length);
|
||||
str->qs_append(&m_field_name);
|
||||
str->qs_append('@');
|
||||
str->qs_append(m_offset);
|
||||
str->qs_append("[\"",2);
|
||||
str->qs_append(m_field_name.str, m_field_name.length);
|
||||
str->qs_append(&m_field_name);
|
||||
str->qs_append("\"]",2);
|
||||
str->qs_append(' ');
|
||||
m_value->print(str, enum_query_type(QT_ORDINARY |
|
||||
@ -4120,7 +4120,7 @@ sp_instr_cfetch::print(String *str)
|
||||
if (str->reserve(pv->name.length+SP_INSTR_UINT_MAXLEN+2))
|
||||
return;
|
||||
str->qs_append(' ');
|
||||
str->qs_append(pv->name.str, pv->name.length);
|
||||
str->qs_append(&pv->name);
|
||||
str->qs_append('@');
|
||||
str->qs_append(pv->offset);
|
||||
}
|
||||
|
@ -8381,18 +8381,18 @@ static void add_user_parameters(String *result, ACL_USER* acl_user,
|
||||
{
|
||||
DBUG_ASSERT(acl_user->salt_len);
|
||||
result->append(STRING_WITH_LEN(" IDENTIFIED BY PASSWORD '"));
|
||||
result->append(acl_user->auth_string.str, acl_user->auth_string.length);
|
||||
result->append(&acl_user->auth_string);
|
||||
result->append('\'');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result->append(STRING_WITH_LEN(" IDENTIFIED VIA "));
|
||||
result->append(acl_user->plugin.str, acl_user->plugin.length);
|
||||
result->append(&acl_user->plugin);
|
||||
if (acl_user->auth_string.length)
|
||||
{
|
||||
result->append(STRING_WITH_LEN(" USING '"));
|
||||
result->append(acl_user->auth_string.str, acl_user->auth_string.length);
|
||||
result->append(&acl_user->auth_string);
|
||||
result->append('\'');
|
||||
}
|
||||
}
|
||||
|
@ -837,7 +837,7 @@ static bool write_execute_load_query_log_event(THD *thd, sql_exchange* ex,
|
||||
if (n++)
|
||||
query_str.append(STRING_WITH_LEN(", "));
|
||||
append_identifier(thd, &query_str, item->name.str, item->name.length);
|
||||
query_str.append(val->name.str, val->name.length);
|
||||
query_str.append(&val->name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7644,28 +7644,23 @@ mysql_new_select(LEX *lex, bool move_down, SELECT_LEX *select_lex)
|
||||
@param var_name Variable name
|
||||
*/
|
||||
|
||||
void create_select_for_variable(const char *var_name)
|
||||
void create_select_for_variable(THD *thd, LEX_CSTRING *var_name)
|
||||
{
|
||||
THD *thd;
|
||||
LEX *lex;
|
||||
LEX_CSTRING tmp;
|
||||
Item *var;
|
||||
char buff[MAX_SYS_VAR_LENGTH*2+4+8], *end;
|
||||
DBUG_ENTER("create_select_for_variable");
|
||||
|
||||
thd= current_thd;
|
||||
lex= thd->lex;
|
||||
mysql_init_select(lex);
|
||||
lex->sql_command= SQLCOM_SELECT;
|
||||
tmp.str= var_name;
|
||||
tmp.length=strlen(var_name);
|
||||
/*
|
||||
We set the name of Item to @@session.var_name because that then is used
|
||||
as the column name in the output.
|
||||
*/
|
||||
if ((var= get_system_var(thd, OPT_SESSION, tmp, null_clex_str)))
|
||||
if ((var= get_system_var(thd, OPT_SESSION, var_name, &null_clex_str)))
|
||||
{
|
||||
end= strxmov(buff, "@@session.", var_name, NullS);
|
||||
end= strxmov(buff, "@@session.", var_name->str, NullS);
|
||||
var->set_name(thd, buff, end-buff, system_charset_info);
|
||||
add_item_to_list(thd, var);
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ void mysql_parse(THD *thd, char *rawbuf, uint length,
|
||||
Parser_state *parser_state, bool is_com_multi,
|
||||
bool is_next_command);
|
||||
bool mysql_new_select(LEX *lex, bool move_down, SELECT_LEX *sel);
|
||||
void create_select_for_variable(const char *var_name);
|
||||
void create_select_for_variable(THD *thd, LEX_CSTRING *var_name);
|
||||
void create_table_set_open_action_and_adjust_tables(LEX *lex);
|
||||
void mysql_init_multi_delete(LEX *lex);
|
||||
bool multi_delete_set_locks_and_link_aux_tables(LEX *lex);
|
||||
|
@ -1773,7 +1773,7 @@ static void append_create_options(THD *thd, String *packet,
|
||||
if (opt->quoted_value)
|
||||
append_unescaped(packet, opt->value.str, opt->value.length);
|
||||
else
|
||||
packet->append(opt->value.str, opt->value.length);
|
||||
packet->append(&opt->value);
|
||||
}
|
||||
if (in_comment)
|
||||
packet->append(STRING_WITH_LEN(" */"));
|
||||
@ -7089,7 +7089,7 @@ static int get_schema_partitions_record(THD *thd, TABLE_LIST *tables,
|
||||
tmp_res.length(0);
|
||||
if (part_elem->has_null_value)
|
||||
{
|
||||
tmp_str.append("NULL");
|
||||
tmp_str.append(STRING_WITH_LEN("NULL"));
|
||||
if (num_items > 0)
|
||||
tmp_str.append(",");
|
||||
}
|
||||
@ -7098,7 +7098,7 @@ static int get_schema_partitions_record(THD *thd, TABLE_LIST *tables,
|
||||
if (part_info->column_list)
|
||||
{
|
||||
if (part_info->part_field_list.elements > 1U)
|
||||
tmp_str.append("(");
|
||||
tmp_str.append(STRING_WITH_LEN("("));
|
||||
if (get_partition_column_description(thd,
|
||||
part_info,
|
||||
list_value,
|
||||
|
@ -575,6 +575,10 @@ public:
|
||||
{
|
||||
qs_append(str, (uint32)strlen(str));
|
||||
}
|
||||
void qs_append(const LEX_CSTRING *str)
|
||||
{
|
||||
qs_append(str->str, str->length);
|
||||
}
|
||||
void qs_append(const char *str, uint32 len);
|
||||
void qs_append_hex(const char *str, uint32 len);
|
||||
void qs_append(double d);
|
||||
|
@ -688,7 +688,7 @@ static void build_trig_stmt_query(THD *thd, TABLE_LIST *tables,
|
||||
|
||||
/* Create statement for storing trigger (without trigger order) */
|
||||
if (lex->trg_chistics.ordering_clause == TRG_ORDER_NONE)
|
||||
trigger_def->append(stmt_definition.str, stmt_definition.length);
|
||||
trigger_def->append(&stmt_definition);
|
||||
else
|
||||
{
|
||||
/* Copy data before FOLLOWS/PRECEDES trigger_name */
|
||||
@ -923,8 +923,8 @@ err_without_cleanup:
|
||||
if (trigger_dropped)
|
||||
{
|
||||
String drop_trg_query;
|
||||
drop_trg_query.append("DROP TRIGGER /* generated by failed CREATE TRIGGER */ ");
|
||||
drop_trg_query.append(lex->spname->m_name.str);
|
||||
drop_trg_query.append(STRING_WITH_LEN("DROP TRIGGER /* generated by failed CREATE TRIGGER */ "));
|
||||
drop_trg_query.append(&lex->spname->m_name);
|
||||
/*
|
||||
We dropped an existing trigger and was not able to recreate it because
|
||||
of an internal error. Ensure it's also dropped on the slave.
|
||||
|
@ -647,8 +647,7 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
|
||||
{ C_STRING_WITH_LEN("ALTER ") },
|
||||
{ C_STRING_WITH_LEN("CREATE OR REPLACE ") }};
|
||||
|
||||
buff.append(command[thd->lex->create_view->mode].str,
|
||||
command[thd->lex->create_view->mode].length);
|
||||
buff.append(&command[thd->lex->create_view->mode]);
|
||||
view_store_options(thd, views, &buff);
|
||||
buff.append(STRING_WITH_LEN("VIEW "));
|
||||
|
||||
@ -680,7 +679,7 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
|
||||
buff.append(')');
|
||||
}
|
||||
buff.append(STRING_WITH_LEN(" AS "));
|
||||
buff.append(views->source.str, views->source.length);
|
||||
buff.append(&views->source);
|
||||
|
||||
int errcode= query_error_code(thd, TRUE);
|
||||
/*
|
||||
|
@ -10726,7 +10726,7 @@ variable_aux:
|
||||
thd->parse_error();
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
if (!($$= get_system_var(thd, $2, $3, $4)))
|
||||
if (!($$= get_system_var(thd, $2, &$3, &$4)))
|
||||
MYSQL_YYABORT;
|
||||
if (!((Item_func_get_system_var*) $$)->is_written_to_binlog())
|
||||
Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_VARIABLE);
|
||||
@ -13035,9 +13035,15 @@ show_param:
|
||||
lex->sql_command= SQLCOM_SHOW_PRIVILEGES;
|
||||
}
|
||||
| COUNT_SYM '(' '*' ')' WARNINGS
|
||||
{ (void) create_select_for_variable("warning_count"); }
|
||||
{
|
||||
LEX_CSTRING var= {STRING_WITH_LEN("warning_count")};
|
||||
(void) create_select_for_variable(thd, &var);
|
||||
}
|
||||
| COUNT_SYM '(' '*' ')' ERRORS
|
||||
{ (void) create_select_for_variable("error_count"); }
|
||||
{
|
||||
LEX_CSTRING var= {STRING_WITH_LEN("error_count")};
|
||||
(void) create_select_for_variable(thd, &var);
|
||||
}
|
||||
| WARNINGS opt_limit_clause
|
||||
{ Lex->sql_command = SQLCOM_SHOW_WARNS;}
|
||||
| ERRORS opt_limit_clause
|
||||
|
@ -10781,7 +10781,7 @@ variable_aux:
|
||||
thd->parse_error();
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
if (!($$= get_system_var(thd, $2, $3, $4)))
|
||||
if (!($$= get_system_var(thd, $2, &$3, &$4)))
|
||||
MYSQL_YYABORT;
|
||||
if (!((Item_func_get_system_var*) $$)->is_written_to_binlog())
|
||||
Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_VARIABLE);
|
||||
@ -13123,9 +13123,15 @@ show_param:
|
||||
lex->sql_command= SQLCOM_SHOW_PRIVILEGES;
|
||||
}
|
||||
| COUNT_SYM '(' '*' ')' WARNINGS
|
||||
{ (void) create_select_for_variable("warning_count"); }
|
||||
{
|
||||
LEX_CSTRING var= {STRING_WITH_LEN("warning_count")};
|
||||
(void) create_select_for_variable(thd, &var);
|
||||
}
|
||||
| COUNT_SYM '(' '*' ')' ERRORS
|
||||
{ (void) create_select_for_variable("error_count"); }
|
||||
{
|
||||
LEX_CSTRING var= {STRING_WITH_LEN("error_count")};
|
||||
(void) create_select_for_variable(thd, &var);
|
||||
}
|
||||
| WARNINGS opt_limit_clause
|
||||
{ Lex->sql_command = SQLCOM_SHOW_WARNS;}
|
||||
| ERRORS opt_limit_clause
|
||||
|
@ -539,7 +539,7 @@ static bool pack_expression(String *buf, Virtual_column_info *vcol,
|
||||
size_t len_off= buf->length();
|
||||
buf->q_append2b(0); // to be added later
|
||||
buf->q_append((char)vcol->name.length);
|
||||
buf->q_append(vcol->name.str, vcol->name.length);
|
||||
buf->q_append(&vcol->name);
|
||||
size_t expr_start= buf->length();
|
||||
vcol->print(buf);
|
||||
size_t expr_len= buf->length() - expr_start;
|
||||
|
@ -1325,22 +1325,17 @@ create_view_query(THD *thd, uchar** buf, size_t* buf_len)
|
||||
SELECT_LEX *select_lex= &lex->select_lex;
|
||||
TABLE_LIST *first_table= select_lex->table_list.first;
|
||||
TABLE_LIST *views = first_table;
|
||||
|
||||
LEX_USER *definer;
|
||||
String buff;
|
||||
const LEX_STRING command[3]=
|
||||
{{ C_STRING_WITH_LEN("CREATE ") },
|
||||
{ C_STRING_WITH_LEN("ALTER ") },
|
||||
{ C_STRING_WITH_LEN("CREATE OR REPLACE ") }};
|
||||
|
||||
buff.append(command[thd->lex->create_view->mode].str,
|
||||
command[thd->lex->create_view->mode].length);
|
||||
|
||||
LEX_USER *definer;
|
||||
buff.append(&command[thd->lex->create_view->mode]);
|
||||
|
||||
if (lex->definer)
|
||||
{
|
||||
definer= get_current_user(thd, lex->definer);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
|
@ -52,6 +52,8 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty);
|
||||
bool SerializeArray(JOUT *js, PJAR jarp, bool b);
|
||||
bool SerializeObject(JOUT *js, PJOB jobp);
|
||||
bool SerializeValue(JOUT *js, PJVAL jvp);
|
||||
bool IsNum(PSZ s);
|
||||
char *NextChr(PSZ s, char sep);
|
||||
|
||||
/***********************************************************************/
|
||||
/* Class JOUT. Used by Serialize. */
|
||||
|
@ -1815,7 +1815,7 @@ char *json_make_array(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||
return str;
|
||||
} // end of json_make_array
|
||||
|
||||
void json_array_deinit(UDF_INIT* initid)
|
||||
static void json_array_deinit(UDF_INIT* initid)
|
||||
{
|
||||
JsonFreeMem((PGLOBAL)initid->ptr);
|
||||
} // end of json_make_array_deinit
|
||||
|
@ -53,8 +53,6 @@
|
||||
/* External functions. */
|
||||
/***********************************************************************/
|
||||
USETEMP UseTemp(void);
|
||||
bool IsNum(PSZ s);
|
||||
char *NextChr(PSZ s, char sep);
|
||||
|
||||
typedef struct _jncol {
|
||||
struct _jncol *Next;
|
||||
|
Loading…
x
Reference in New Issue
Block a user