summaryrefslogtreecommitdiff
path: root/sql/sql_class.h
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_class.h')
-rw-r--r--sql/sql_class.h252
1 files changed, 214 insertions, 38 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h
index d733aea1756..20318d55da1 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -20,7 +20,6 @@
/* Classes in mysql */
-#include "my_global.h" /* NO_EMBEDDED_ACCESS_CHECKS */
#include "dur_prop.h"
#include <waiting_threads.h>
#include "sql_const.h"
@@ -38,6 +37,7 @@
#include "thr_lock.h" /* thr_lock_type, THR_LOCK_DATA, THR_LOCK_INFO */
#include "thr_timer.h"
#include "thr_malloc.h"
+#include "log_slow.h" /* LOG_SLOW_DISABLE_... */
#include "sql_digest_stream.h" // sql_digest_state
@@ -537,6 +537,8 @@ typedef struct system_variables
ulonglong join_buff_space_limit;
ulonglong log_slow_filter;
ulonglong log_slow_verbosity;
+ ulonglong log_slow_disabled_statements;
+ ulonglong log_disabled_statements;
ulonglong bulk_insert_buff_size;
ulonglong join_buff_size;
ulonglong sortbuff_size;
@@ -555,6 +557,7 @@ typedef struct system_variables
ha_rows max_join_size;
ha_rows expensive_subquery_limit;
ulong auto_increment_increment, auto_increment_offset;
+ ulong column_compression_zlib_strategy;
ulong lock_wait_timeout;
ulong join_cache_level;
ulong max_allowed_packet;
@@ -642,6 +645,7 @@ typedef struct system_variables
my_bool sql_log_bin_off;
my_bool binlog_annotate_row_events;
my_bool binlog_direct_non_trans_update;
+ my_bool column_compression_zlib_wrap;
plugin_ref table_plugin;
plugin_ref tmp_table_plugin;
@@ -691,6 +695,13 @@ typedef struct system_variables
my_bool session_track_state_change;
ulong threadpool_priority;
+
+ uint idle_transaction_timeout;
+ uint idle_readonly_transaction_timeout;
+ uint idle_write_transaction_timeout;
+ uint column_compression_threshold;
+ uint column_compression_zlib_level;
+ ulong in_subquery_conversion_threshold;
} SV;
/**
@@ -701,6 +712,8 @@ typedef struct system_variables
typedef struct system_status_var
{
+ ulong column_compressions;
+ ulong column_decompressions;
ulong com_stat[(uint) SQLCOM_END];
ulong com_create_tmp_table;
ulong com_drop_tmp_table;
@@ -810,6 +823,9 @@ typedef struct system_status_var
ulonglong rows_sent;
ulonglong rows_tmp_read;
ulonglong binlog_bytes_written;
+ ulonglong table_open_cache_hits;
+ ulonglong table_open_cache_misses;
+ ulonglong table_open_cache_overflows;
double last_query_cost;
double cpu_time, busy_time;
/* Don't initialize */
@@ -892,7 +908,7 @@ void free_tmp_table(THD *thd, TABLE *entry);
/* The following macro is to make init of Query_arena simpler */
-#ifndef DBUG_OFF
+#ifdef DBUG_ASSERT_EXISTS
#define INIT_ARENA_DBUG_INFO is_backup_arena= 0; is_reprepared= FALSE;
#else
#define INIT_ARENA_DBUG_INFO
@@ -907,7 +923,7 @@ public:
*/
Item *free_list;
MEM_ROOT *mem_root; // Pointer to current memroot
-#ifndef DBUG_OFF
+#ifdef DBUG_ASSERT_EXISTS
bool is_backup_arena; /* True if this arena is used for backup. */
bool is_reprepared;
#endif
@@ -1514,19 +1530,25 @@ public:
class Sub_statement_state
{
public:
+ Discrete_interval auto_inc_interval_for_cur_row;
+ Discrete_intervals_list auto_inc_intervals_forced;
+ SAVEPOINT *savepoints;
ulonglong option_bits;
ulonglong first_successful_insert_id_in_prev_stmt;
ulonglong first_successful_insert_id_in_cur_stmt, insert_id_for_cur_row;
- Discrete_interval auto_inc_interval_for_cur_row;
- Discrete_intervals_list auto_inc_intervals_forced;
ulonglong limit_found_rows;
- ha_rows cuted_fields, sent_row_count, examined_row_count;
+ ulonglong tmp_tables_size;
ulonglong client_capabilities;
+ ulonglong cuted_fields, sent_row_count, examined_row_count;
+ ulonglong affected_rows;
+ ulonglong bytes_sent_old;
+ ulong tmp_tables_used;
+ ulong tmp_tables_disk_used;
+ ulong query_plan_fsort_passes;
ulong query_plan_flags;
uint in_sub_stmt; /* 0, SUB_STMT_TRIGGER or SUB_STMT_FUNCTION */
bool enable_slow_log;
bool last_insert_id_used;
- SAVEPOINT *savepoints;
enum enum_check_fields count_cuted_fields;
};
@@ -2017,13 +2039,18 @@ struct wait_for_commit
void reinit();
};
+/*
+ Structure to store the start time for a query
+*/
-extern "C" void my_message_sql(uint error, const char *str, myf MyFlags);
+typedef struct
+{
+ my_time_t start_time;
+ ulong start_time_sec_part;
+ ulonglong start_utime, utime_after_lock;
+} QUERY_START_TIME_INFO;
-class THD;
-#ifndef DBUG_OFF
-void dbug_serve_apcs(THD *thd, int n_calls);
-#endif
+extern "C" void my_message_sql(uint error, const char *str, myf MyFlags);
/**
@class THD
@@ -2242,7 +2269,7 @@ public:
HASH ull_hash;
/* Hash of used seqeunces (for PREVIOUS value) */
HASH sequences;
-#ifndef DBUG_OFF
+#ifdef DBUG_ASSERT_EXISTS
uint dbug_sentry; // watch out for memory corruption
#endif
struct st_my_thread_var *mysys_var;
@@ -2723,6 +2750,14 @@ public:
{
m_row_count_func= row_count_func;
}
+ inline void set_affected_rows(longlong row_count_func)
+ {
+ /*
+ We have to add to affected_rows (used by slow log), as otherwise
+ information for 'call' will be wrong
+ */
+ affected_rows+= (row_count_func >= 0 ? row_count_func : 0);
+ }
ha_rows cuted_fields;
@@ -2752,6 +2787,9 @@ public:
ha_rows get_examined_row_count() const
{ return m_examined_row_count; }
+ ulonglong get_affected_rows() const
+ { return affected_rows; }
+
void set_sent_row_count(ha_rows count);
void set_examined_row_count(ha_rows count);
@@ -2829,8 +2867,16 @@ public:
/* Statement id is thread-wide. This counter is used to generate ids */
ulong statement_id_counter;
ulong rand_saved_seed1, rand_saved_seed2;
+
+ /* The following variables are used when printing to slow log */
ulong query_plan_flags;
ulong query_plan_fsort_passes;
+ ulong tmp_tables_used;
+ ulong tmp_tables_disk_used;
+ ulonglong tmp_tables_size;
+ ulonglong bytes_sent_old;
+ ulonglong affected_rows; /* Number of changed rows */
+
pthread_t real_id; /* For debugging */
my_thread_id thread_id, thread_dbug_id;
uint32 os_thread_id;
@@ -2920,7 +2966,6 @@ public:
uint8 failed_com_change_user;
bool slave_thread;
bool extra_port; /* If extra connection */
-
bool no_errors;
/**
@@ -2964,7 +3009,7 @@ public:
*/
bool charset_is_system_charset, charset_is_collation_connection;
bool charset_is_character_set_filesystem;
- bool enable_slow_log; /* enable slow log for current statement */
+ bool enable_slow_log; /* Enable slow log for current statement */
bool abort_on_warning;
bool got_warning; /* Set on call to push_warning() */
/* set during loop of derived table processing */
@@ -2996,6 +3041,7 @@ public:
the query. 0 if no error on the master.
*/
int slave_expected_error;
+ enum_sql_command last_sql_command; // Last sql_command exceuted in mysql_execute_command()
sp_rcontext *spcont; // SP runtime context
sp_cache *sp_proc_cache;
@@ -3294,6 +3340,20 @@ public:
MYSQL_SET_STATEMENT_LOCK_TIME(m_statement_psi,
(utime_after_lock - start_utime));
}
+ void get_time(QUERY_START_TIME_INFO *time_info)
+ {
+ time_info->start_time= start_time;
+ time_info->start_time_sec_part= start_time_sec_part;
+ time_info->start_utime= start_utime;
+ time_info->utime_after_lock= utime_after_lock;
+ }
+ void set_time(QUERY_START_TIME_INFO *time_info)
+ {
+ start_time= time_info->start_time;
+ start_time_sec_part= time_info->start_time_sec_part;
+ start_utime= time_info->start_utime;
+ utime_after_lock= time_info->utime_after_lock;
+ }
ulonglong current_utime() { return microsecond_interval_timer(); }
/* Tell SHOW PROCESSLIST to show time from this point */
@@ -3312,7 +3372,7 @@ public:
void update_server_status()
{
set_time_for_next_stage();
- if (utime_after_query > utime_after_lock + variables.long_query_time)
+ if (utime_after_query >= utime_after_lock + variables.long_query_time)
server_status|= SERVER_QUERY_WAS_SLOW;
}
inline ulonglong found_rows(void)
@@ -3420,17 +3480,31 @@ public:
LEX_STRING *make_lex_string(const char* str, uint length)
{
LEX_STRING *lex_str;
- if (!(lex_str= (LEX_STRING *)alloc_root(mem_root, sizeof(LEX_STRING))))
+ char *tmp;
+ if (!(lex_str= (LEX_STRING *) alloc_root(mem_root, sizeof(LEX_STRING) +
+ length+1)))
return 0;
- return make_lex_string(lex_str, str, length);
+ tmp= (char*) (lex_str+1);
+ lex_str->str= tmp;
+ memcpy(tmp, str, length);
+ tmp[length]= 0;
+ lex_str->length= length;
+ return lex_str;
}
LEX_CSTRING *make_clex_string(const char* str, uint length)
{
LEX_CSTRING *lex_str;
- if (!(lex_str= (LEX_CSTRING *)alloc_root(mem_root, sizeof(LEX_CSTRING))))
+ char *tmp;
+ if (!(lex_str= (LEX_CSTRING *)alloc_root(mem_root, sizeof(LEX_CSTRING) +
+ length+1)))
return 0;
- return make_lex_string(lex_str, str, length);
+ tmp= (char*) (lex_str+1);
+ lex_str->str= tmp;
+ memcpy(tmp, str, length);
+ tmp[length]= 0;
+ lex_str->length= length;
+ return lex_str;
}
// Allocate LEX_STRING for character set conversion
@@ -3704,20 +3778,7 @@ public:
}
}
int killed_errno();
- inline void reset_killed()
- {
- /*
- Resetting killed has to be done under a mutex to ensure
- its not done during an awake() call.
- */
- if (killed != NOT_KILLED)
- {
- mysql_mutex_lock(&LOCK_thd_kill);
- killed= NOT_KILLED;
- killed_err= 0;
- mysql_mutex_unlock(&LOCK_thd_kill);
- }
- }
+ void reset_killed();
inline void reset_kill_query()
{
if (killed < KILL_CONNECTION)
@@ -3747,6 +3808,9 @@ public:
void restore_backup_open_tables_state(Open_tables_backup *backup);
void reset_sub_statement_state(Sub_statement_state *backup, uint new_state);
void restore_sub_statement_state(Sub_statement_state *backup);
+ void store_slow_query_state(Sub_statement_state *backup);
+ void reset_slow_query_state();
+ void add_slow_query_state(Sub_statement_state *backup);
void set_n_backup_active_arena(Query_arena *set, Query_arena *backup);
void restore_active_arena(Query_arena *set, Query_arena *backup);
@@ -4501,6 +4565,29 @@ public:
mysql_mutex_unlock(&LOCK_thread_count);
}
+
+ uint get_net_wait_timeout()
+ {
+ if (in_active_multi_stmt_transaction())
+ {
+ if (transaction.all.is_trx_read_write())
+ {
+ if (variables.idle_write_transaction_timeout > 0)
+ return variables.idle_write_transaction_timeout;
+ }
+ else
+ {
+ if (variables.idle_readonly_transaction_timeout > 0)
+ return variables.idle_readonly_transaction_timeout;
+ }
+
+ if (variables.idle_transaction_timeout > 0)
+ return variables.idle_transaction_timeout;
+ }
+
+ return variables.net_wait_timeout;
+ }
+
/**
Switch to a sublex, to parse a substatement or an expression.
*/
@@ -4524,6 +4611,13 @@ public:
See also sp_head::merge_lex().
*/
bool restore_from_local_lex_to_old_lex(LEX *oldlex);
+
+ inline void prepare_logs_for_admin_command()
+ {
+ enable_slow_log&= !MY_TEST(variables.log_slow_disabled_statements &
+ LOG_SLOW_DISABLE_ADMIN);
+ query_plan_flags|= QPLAN_ADMIN;
+ }
};
inline void add_to_active_threads(THD *thd)
@@ -4550,11 +4644,12 @@ inline void unlink_not_visible_thd(THD *thd)
/** A short cut for thd->get_stmt_da()->set_ok_status(). */
inline void
-my_ok(THD *thd, ulonglong affected_rows= 0, ulonglong id= 0,
+my_ok(THD *thd, ulonglong affected_rows_arg= 0, ulonglong id= 0,
const char *message= NULL)
{
- thd->set_row_count_func(affected_rows);
- thd->get_stmt_da()->set_ok_status(affected_rows, id, message);
+ thd->set_row_count_func(affected_rows_arg);
+ thd->set_affected_rows(affected_rows_arg);
+ thd->get_stmt_da()->set_ok_status(affected_rows_arg, id, message);
}
@@ -6113,7 +6208,7 @@ public:
(int) m_db.length, (m_db.length ? m_db.str : ""),
dot, ".",
(int) m_name.length, m_name.str);
- DBUG_ASSERT(ok_for_lower_case_names(m_db.str));
+ DBUG_SLOW_ASSERT(ok_for_lower_case_names(m_db.str));
return false;
}
};
@@ -6133,6 +6228,87 @@ public:
}
};
+/* Functions to compare if two lex strings are equal */
+inline bool lex_string_cmp(CHARSET_INFO *charset,
+ const LEX_CSTRING *a,
+ const LEX_CSTRING *b)
+{
+ return my_strcasecmp(charset, a->str, b->str);
+}
+
+/*
+ Compare if two LEX_CSTRING are equal. Assumption is that
+ character set is ASCII (like for plugin names)
+*/
+inline bool lex_string_eq(const LEX_CSTRING *a,
+ const LEX_CSTRING *b)
+{
+ if (a->length != b->length)
+ return 1; /* Different */
+ return strcasecmp(a->str, b->str) != 0;
+}
+
+class Type_holder: public Sql_alloc,
+ public Item_args,
+ public Type_handler_hybrid_field_type,
+ public Type_all_attributes,
+ public Type_geometry_attributes
+{
+ TYPELIB *m_typelib;
+ bool m_maybe_null;
+public:
+ Type_holder()
+ :m_typelib(NULL),
+ m_maybe_null(false)
+ { }
+
+ void set_maybe_null(bool maybe_null_arg) { m_maybe_null= maybe_null_arg; }
+ bool get_maybe_null() const { return m_maybe_null; }
+
+ uint decimal_precision() const
+ {
+ /*
+ Type_holder is not used directly to create fields, so
+ its virtual decimal_precision() is never called.
+ We should eventually extend create_result_table() to accept
+ an array of Type_holders directly, without having to allocate
+ Item_type_holder's and put them into List<Item>.
+ */
+ DBUG_ASSERT(0);
+ return 0;
+ }
+ void set_geometry_type(uint type)
+ {
+ Type_geometry_attributes::set_geometry_type(type);
+ }
+ uint uint_geometry_type() const
+ {
+ return Type_geometry_attributes::get_geometry_type();
+ }
+ void set_typelib(TYPELIB *typelib)
+ {
+ m_typelib= typelib;
+ }
+ TYPELIB *get_typelib() const
+ {
+ return m_typelib;
+ }
+
+ bool aggregate_attributes(THD *thd)
+ {
+ for (uint i= 0; i < arg_count; i++)
+ m_maybe_null|= args[i]->maybe_null;
+ return
+ type_handler()->Item_hybrid_func_fix_attributes(thd,
+ "UNION", this, this,
+ args, arg_count);
+ }
+};
+
+
+#ifndef DBUG_OFF
+void dbug_serve_apcs(THD *thd, int n_calls);
+#endif
#endif /* MYSQL_SERVER */