summaryrefslogtreecommitdiffstats
path: root/sql/sql_class.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 13:39:13 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 13:39:13 +0000
commit86fbb58c3ac0865482819c10a3e81f2eea001c36 (patch)
tree28c9e526ea739c6f9b89e36115e1e2698bddf981 /sql/sql_class.h
parentReleasing progress-linux version 1:10.11.6-2~progress7.99u1. (diff)
downloadmariadb-86fbb58c3ac0865482819c10a3e81f2eea001c36.tar.xz
mariadb-86fbb58c3ac0865482819c10a3e81f2eea001c36.zip
Merging upstream version 1:10.11.7.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sql/sql_class.h')
-rw-r--r--sql/sql_class.h153
1 files changed, 111 insertions, 42 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h
index beb33d83..7543df39 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -201,6 +201,7 @@ enum enum_binlog_row_image {
#define OLD_MODE_UTF8_IS_UTF8MB3 (1 << 3)
#define OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN (1 << 4)
#define OLD_MODE_COMPAT_5_1_CHECKSUM (1 << 5)
+#define OLD_MODE_NO_NULL_COLLATION_IDS (1 << 6)
extern char internal_table_name[2];
extern char empty_c_string[1];
@@ -281,9 +282,8 @@ typedef struct st_user_var_events
user_var_entry *user_var_event;
char *value;
size_t length;
- Item_result type;
+ const Type_handler *th;
uint charset_number;
- bool unsigned_flag;
} BINLOG_USER_VAR_EVENT;
/*
@@ -657,6 +657,15 @@ enum killed_type
KILL_TYPE_QUERY
};
+#define SECONDS_TO_WAIT_FOR_KILL 2
+#define SECONDS_TO_WAIT_FOR_DUMP_THREAD_KILL 10
+#if !defined(_WIN32) && defined(HAVE_SELECT)
+/* my_sleep() can wait for sub second times */
+#define WAIT_FOR_KILL_TRY_TIMES 20
+#else
+#define WAIT_FOR_KILL_TRY_TIMES 2
+#endif
+
#include "sql_lex.h" /* Must be here */
class Delayed_insert;
@@ -694,7 +703,6 @@ typedef struct system_variables
ulonglong max_statement_time;
ulonglong optimizer_switch;
ulonglong optimizer_trace;
- ulong optimizer_trace_max_mem_size;
sql_mode_t sql_mode; ///< which non-standard SQL behaviour should be enabled
sql_mode_t old_behavior; ///< which old SQL behaviour should be enabled
ulonglong option_bits; ///< OPTION_xxx constants, e.g. OPTION_PROFILING
@@ -758,6 +766,8 @@ typedef struct system_variables
ulong optimizer_use_condition_selectivity;
ulong optimizer_max_sel_arg_weight;
ulong optimizer_max_sel_args;
+ ulong optimizer_trace_max_mem_size;
+ ulong optimizer_adjust_secondary_key_costs;
ulong use_stat_tables;
double sample_percentage;
ulong histogram_size;
@@ -3204,6 +3214,17 @@ public:
*/
Query_arena *stmt_arena;
+ /**
+ Get either call or statement arena. In case some function is called from
+ within a query the call arena has to be used for a memory allocation,
+ else use the statement arena.
+ */
+ Query_arena *active_stmt_arena_to_use()
+ {
+ return (state == Query_arena::STMT_SP_QUERY_ARGUMENTS) ? this :
+ stmt_arena;
+ }
+
void *bulk_param;
/*
@@ -3435,7 +3456,11 @@ public:
{ return m_sent_row_count; }
ha_rows get_examined_row_count() const
- { return m_examined_row_count; }
+ {
+ DBUG_EXECUTE_IF("debug_huge_number_of_examined_rows",
+ return (ULONGLONG_MAX - 1000000););
+ return m_examined_row_count;
+ }
ulonglong get_affected_rows() const
{ return affected_rows; }
@@ -4608,7 +4633,8 @@ public:
The worst things that can happen is that we get
a suboptimal error message.
*/
- killed_err= (err_info*) alloc_root(&main_mem_root, sizeof(*killed_err));
+ if (!killed_err)
+ killed_err= (err_info*) my_malloc(PSI_INSTRUMENT_ME, sizeof(*killed_err), MYF(MY_WME));
if (likely(killed_err))
{
killed_err->no= killed_errno_arg;
@@ -5039,13 +5065,24 @@ public:
public:
/** Overloaded to guard query/query_length fields */
virtual void set_statement(Statement *stmt);
- void set_command(enum enum_server_command command)
+ inline void set_command(enum enum_server_command command)
{
+ DBUG_ASSERT(command != COM_SLEEP);
m_command= command;
#ifdef HAVE_PSI_THREAD_INTERFACE
PSI_STATEMENT_CALL(set_thread_command)(m_command);
#endif
}
+ /* As sleep needs a bit of special handling, we have a special case for it */
+ inline void mark_connection_idle()
+ {
+ proc_info= 0;
+ m_command= COM_SLEEP;
+#ifdef HAVE_PSI_THREAD_INTERFACE
+ PSI_STATEMENT_CALL(set_thread_command)(m_command);
+#endif
+ }
+
inline enum enum_server_command get_command() const
{ return m_command; }
@@ -7118,7 +7155,7 @@ public:
// this is needed for user_vars hash
-class user_var_entry
+class user_var_entry: public Type_handler_hybrid_field_type
{
CHARSET_INFO *m_charset;
public:
@@ -7127,8 +7164,6 @@ class user_var_entry
char *value;
size_t length;
query_id_t update_query_id, used_query_id;
- Item_result type;
- bool unsigned_flag;
double val_real(bool *null_value);
longlong val_int(bool *null_value) const;
@@ -7809,6 +7844,66 @@ public:
};
+class Identifier_chain2
+{
+ LEX_CSTRING m_name[2];
+public:
+ Identifier_chain2()
+ :m_name{Lex_cstring(), Lex_cstring()}
+ { }
+ Identifier_chain2(const LEX_CSTRING &a, const LEX_CSTRING &b)
+ :m_name{a, b}
+ { }
+
+ const LEX_CSTRING& operator [] (size_t i) const
+ {
+ return m_name[i];
+ }
+
+ static Identifier_chain2 split(const LEX_CSTRING &txt)
+ {
+ DBUG_ASSERT(txt.str[txt.length] == '\0'); // Expect 0-terminated input
+ const char *dot= strchr(txt.str, '.');
+ if (!dot)
+ return Identifier_chain2(Lex_cstring(), txt);
+ size_t length0= dot - txt.str;
+ Lex_cstring name0(txt.str, length0);
+ Lex_cstring name1(txt.str + length0 + 1, txt.length - length0 - 1);
+ return Identifier_chain2(name0, name1);
+ }
+
+ // Export as a qualified name string: 'db.name'
+ size_t make_qname(char *dst, size_t dstlen, bool casedn_part1) const
+ {
+ size_t res= my_snprintf(dst, dstlen, "%.*s.%.*s",
+ (int) m_name[0].length, m_name[0].str,
+ (int) m_name[1].length, m_name[1].str);
+ if (casedn_part1 && dstlen > m_name[0].length)
+ my_casedn_str(system_charset_info, dst + m_name[0].length + 1);
+ return res;
+ }
+
+ // Export as a qualified name string, allocate on mem_root.
+ LEX_CSTRING make_qname(MEM_ROOT *mem_root, bool casedn_part1) const
+ {
+ LEX_STRING dst;
+ /* format: [pkg + dot] + name + '\0' */
+ size_t dst_size= m_name[0].length + 1 /*dot*/ + m_name[1].length + 1/*\0*/;
+ if (unlikely(!(dst.str= (char*) alloc_root(mem_root, dst_size))))
+ return {NULL, 0};
+ if (!m_name[0].length)
+ {
+ DBUG_ASSERT(!casedn_part1); // Should not be called this way
+ dst.length= my_snprintf(dst.str, dst_size, "%.*s",
+ (int) m_name[1].length, m_name[1].str);
+ return {dst.str, dst.length};
+ }
+ dst.length= make_qname(dst.str, dst_size, casedn_part1);
+ return {dst.str, dst.length};
+ }
+};
+
+
/**
This class resembles the SQL Standard schema qualified object name:
<schema qualified name> ::= [ <schema name> <period> ] <qualified identifier>
@@ -7849,41 +7944,16 @@ public:
void copy(MEM_ROOT *mem_root, const LEX_CSTRING &db,
const LEX_CSTRING &name);
- static Database_qualified_name split(const LEX_CSTRING &txt)
- {
- DBUG_ASSERT(txt.str[txt.length] == '\0'); // Expect 0-terminated input
- const char *dot= strchr(txt.str, '.');
- if (!dot)
- return Database_qualified_name(NULL, 0, txt.str, txt.length);
- size_t dblen= dot - txt.str;
- Lex_cstring db(txt.str, dblen);
- Lex_cstring name(txt.str + dblen + 1, txt.length - dblen - 1);
- return Database_qualified_name(db, name);
- }
-
// Export db and name as a qualified name string: 'db.name'
- size_t make_qname(char *dst, size_t dstlen) const
+ size_t make_qname(char *dst, size_t dstlen, bool casedn_name) const
{
- return my_snprintf(dst, dstlen, "%.*s.%.*s",
- (int) m_db.length, m_db.str,
- (int) m_name.length, m_name.str);
+ return Identifier_chain2(m_db, m_name).make_qname(dst, dstlen, casedn_name);
}
// Export db and name as a qualified name string, allocate on mem_root.
- bool make_qname(MEM_ROOT *mem_root, LEX_CSTRING *dst) const
+ LEX_CSTRING make_qname(MEM_ROOT *mem_root, bool casedn_name) const
{
- const uint dot= !!m_db.length;
- char *tmp;
- /* format: [database + dot] + name + '\0' */
- dst->length= m_db.length + dot + m_name.length;
- if (unlikely(!(dst->str= tmp= (char*) alloc_root(mem_root,
- dst->length + 1))))
- return true;
- snprintf(tmp, dst->length + 1, "%.*s%.*s%.*s",
- (int) m_db.length, (m_db.length ? m_db.str : ""),
- dot, ".",
- (int) m_name.length, m_name.str);
DBUG_SLOW_ASSERT(ok_for_lower_case_names(m_db.str));
- return false;
+ return Identifier_chain2(m_db, m_name).make_qname(mem_root, casedn_name);
}
bool make_package_routine_name(MEM_ROOT *mem_root,
@@ -7894,9 +7964,8 @@ public:
size_t length= package.length + 1 + routine.length + 1;
if (unlikely(!(tmp= (char *) alloc_root(mem_root, length))))
return true;
- m_name.length= my_snprintf(tmp, length, "%.*s.%.*s",
- (int) package.length, package.str,
- (int) routine.length, routine.str);
+ m_name.length= Identifier_chain2(package, routine).make_qname(tmp, length,
+ false);
m_name.str= tmp;
return false;
}
@@ -7925,7 +7994,7 @@ public:
{ }
LEX_CSTRING lex_cstring() const override
{
- size_t length= m_name->make_qname(err_buffer, sizeof(err_buffer));
+ size_t length= m_name->make_qname(err_buffer, sizeof(err_buffer), false);
return {err_buffer, length};
}
};