2011-04-15 14:02:22 +02:00
|
|
|
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
2005-04-01 14:04:50 +02:00
|
|
|
|
|
|
|
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
|
2006-12-23 20:17:15 +01:00
|
|
|
the Free Software Foundation; version 2 of the License.
|
2005-04-01 14:04:50 +02:00
|
|
|
|
|
|
|
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
|
2013-03-19 15:53:48 +01:00
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
|
2005-04-01 14:04:50 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
#ifndef SQL_ERROR_H
|
|
|
|
#define SQL_ERROR_H
|
|
|
|
|
|
|
|
#include "sql_list.h" /* Sql_alloc, MEM_ROOT */
|
|
|
|
#include "m_string.h" /* LEX_STRING */
|
2010-03-31 16:05:33 +02:00
|
|
|
#include "sql_string.h" /* String */
|
2013-06-15 17:32:08 +02:00
|
|
|
#include "sql_plist.h" /* I_P_List */
|
2009-09-10 11:18:29 +02:00
|
|
|
#include "mysql_com.h" /* MYSQL_ERRMSG_SIZE */
|
2012-08-01 16:27:34 +02:00
|
|
|
#include "my_time.h" /* MYSQL_TIME */
|
|
|
|
#include "decimal.h"
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
class THD;
|
2013-06-15 17:32:08 +02:00
|
|
|
class my_decimal;
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/**
|
|
|
|
Representation of a SQL condition.
|
|
|
|
A SQL condition can be a completion condition (note, warning),
|
|
|
|
or an exception condition (error, not found).
|
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
class Sql_condition : public Sql_alloc
|
2005-04-01 14:04:50 +02:00
|
|
|
{
|
|
|
|
public:
|
2009-09-10 11:18:29 +02:00
|
|
|
/*
|
|
|
|
Enumeration value describing the severity of the error.
|
|
|
|
|
|
|
|
Note that these enumeration values must correspond to the indices
|
|
|
|
of the sql_print_message_handlers array.
|
|
|
|
*/
|
2005-04-01 14:04:50 +02:00
|
|
|
enum enum_warning_level
|
|
|
|
{ WARN_LEVEL_NOTE, WARN_LEVEL_WARN, WARN_LEVEL_ERROR, WARN_LEVEL_END};
|
2013-06-15 17:32:08 +02:00
|
|
|
|
2013-08-15 13:24:34 +02:00
|
|
|
/**
|
|
|
|
Convert a bitmask consisting of MYSQL_TIME_{NOTE|WARN}_XXX bits
|
|
|
|
to WARN_LEVEL_XXX
|
|
|
|
*/
|
|
|
|
static enum_warning_level time_warn_level(int warnings)
|
|
|
|
{
|
|
|
|
return MYSQL_TIME_WARN_HAVE_WARNINGS(warnings) ?
|
|
|
|
WARN_LEVEL_WARN : WARN_LEVEL_NOTE;
|
|
|
|
}
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
|
|
|
Get the MESSAGE_TEXT of this condition.
|
|
|
|
@return the message text.
|
|
|
|
*/
|
|
|
|
const char* get_message_text() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the MESSAGE_OCTET_LENGTH of this condition.
|
|
|
|
@return the length in bytes of the message text.
|
|
|
|
*/
|
|
|
|
int get_message_octet_length() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the SQLSTATE of this condition.
|
|
|
|
@return the sql state.
|
|
|
|
*/
|
|
|
|
const char* get_sqlstate() const
|
|
|
|
{ return m_returned_sqlstate; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the SQL_ERRNO of this condition.
|
|
|
|
@return the sql error number condition item.
|
|
|
|
*/
|
|
|
|
uint get_sql_errno() const
|
|
|
|
{ return m_sql_errno; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
Get the error level of this condition.
|
|
|
|
@return the error level condition item.
|
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
Sql_condition::enum_warning_level get_level() const
|
2009-09-10 11:18:29 +02:00
|
|
|
{ return m_level; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
/*
|
2013-06-15 17:32:08 +02:00
|
|
|
The interface of Sql_condition is mostly private, by design,
|
2009-09-10 11:18:29 +02:00
|
|
|
so that only the following code:
|
|
|
|
- various raise_error() or raise_warning() methods in class THD,
|
2013-06-15 17:32:08 +02:00
|
|
|
- the implementation of SIGNAL / RESIGNAL / GET DIAGNOSTICS
|
2009-09-10 11:18:29 +02:00
|
|
|
- catch / re-throw of SQL conditions in stored procedures (sp_rcontext)
|
|
|
|
is allowed to create / modify a SQL condition.
|
|
|
|
Enforcing this policy prevents confusion, since the only public
|
|
|
|
interface available to the rest of the server implementation
|
|
|
|
is the interface offered by the THD methods (THD::raise_error()),
|
|
|
|
which should be used.
|
|
|
|
*/
|
|
|
|
friend class THD;
|
|
|
|
friend class Warning_info;
|
2013-06-15 17:32:08 +02:00
|
|
|
friend class Sql_cmd_common_signal;
|
|
|
|
friend class Sql_cmd_signal;
|
|
|
|
friend class Sql_cmd_resignal;
|
2009-09-10 11:18:29 +02:00
|
|
|
friend class sp_rcontext;
|
2013-06-15 17:32:08 +02:00
|
|
|
friend class Condition_information_item;
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Default constructor.
|
|
|
|
This constructor is usefull when allocating arrays.
|
2013-06-15 17:32:08 +02:00
|
|
|
Note that the init() method should be called to complete the Sql_condition.
|
2009-09-10 11:18:29 +02:00
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
Sql_condition();
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
2013-06-15 17:32:08 +02:00
|
|
|
Complete the Sql_condition initialisation.
|
2009-09-10 11:18:29 +02:00
|
|
|
@param mem_root The memory root to use for the condition items
|
|
|
|
of this condition
|
|
|
|
*/
|
|
|
|
void init(MEM_ROOT *mem_root);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Constructor.
|
|
|
|
@param mem_root The memory root to use for the condition items
|
|
|
|
of this condition
|
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
Sql_condition(MEM_ROOT *mem_root);
|
2012-08-30 11:36:24 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/** Destructor. */
|
|
|
|
~Sql_condition()
|
|
|
|
{}
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Copy optional condition items attributes.
|
|
|
|
@param cond the condition to copy.
|
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
void copy_opt_attributes(const Sql_condition *cond);
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Set this condition area with a fixed message text.
|
|
|
|
@param thd the current thread.
|
|
|
|
@param code the error number for this condition.
|
|
|
|
@param str the message text for this condition.
|
|
|
|
@param level the error level for this condition.
|
|
|
|
@param MyFlags additional flags.
|
|
|
|
*/
|
|
|
|
void set(uint sql_errno, const char* sqlstate,
|
2013-06-15 17:32:08 +02:00
|
|
|
Sql_condition::enum_warning_level level,
|
2009-09-10 11:18:29 +02:00
|
|
|
const char* msg);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Set the condition message test.
|
|
|
|
@param str Message text, expressed in the character set derived from
|
|
|
|
the server --language option
|
|
|
|
*/
|
|
|
|
void set_builtin_message_text(const char* str);
|
|
|
|
|
|
|
|
/** Set the SQLSTATE of this condition. */
|
|
|
|
void set_sqlstate(const char* sqlstate);
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/** Set the CLASS_ORIGIN of this condition. */
|
|
|
|
void set_class_origin();
|
|
|
|
|
|
|
|
/** Set the SUBCLASS_ORIGIN of this condition. */
|
|
|
|
void set_subclass_origin();
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
|
|
|
Clear this SQL condition.
|
|
|
|
*/
|
|
|
|
void clear();
|
|
|
|
|
|
|
|
private:
|
|
|
|
/** SQL CLASS_ORIGIN condition item. */
|
|
|
|
String m_class_origin;
|
|
|
|
|
|
|
|
/** SQL SUBCLASS_ORIGIN condition item. */
|
|
|
|
String m_subclass_origin;
|
|
|
|
|
|
|
|
/** SQL CONSTRAINT_CATALOG condition item. */
|
|
|
|
String m_constraint_catalog;
|
2005-04-01 14:04:50 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/** SQL CONSTRAINT_SCHEMA condition item. */
|
|
|
|
String m_constraint_schema;
|
|
|
|
|
|
|
|
/** SQL CONSTRAINT_NAME condition item. */
|
|
|
|
String m_constraint_name;
|
|
|
|
|
|
|
|
/** SQL CATALOG_NAME condition item. */
|
|
|
|
String m_catalog_name;
|
|
|
|
|
|
|
|
/** SQL SCHEMA_NAME condition item. */
|
|
|
|
String m_schema_name;
|
|
|
|
|
|
|
|
/** SQL TABLE_NAME condition item. */
|
|
|
|
String m_table_name;
|
|
|
|
|
|
|
|
/** SQL COLUMN_NAME condition item. */
|
|
|
|
String m_column_name;
|
|
|
|
|
|
|
|
/** SQL CURSOR_NAME condition item. */
|
|
|
|
String m_cursor_name;
|
|
|
|
|
|
|
|
/** Message text, expressed in the character set implied by --language. */
|
|
|
|
String m_message_text;
|
|
|
|
|
|
|
|
/** MySQL extension, MYSQL_ERRNO condition item. */
|
|
|
|
uint m_sql_errno;
|
|
|
|
|
|
|
|
/**
|
|
|
|
SQL RETURNED_SQLSTATE condition item.
|
|
|
|
This member is always NUL terminated.
|
|
|
|
*/
|
|
|
|
char m_returned_sqlstate[SQLSTATE_LENGTH+1];
|
|
|
|
|
|
|
|
/** Severity (error, warning, note) of this condition. */
|
2013-06-15 17:32:08 +02:00
|
|
|
Sql_condition::enum_warning_level m_level;
|
|
|
|
|
|
|
|
/** Pointers for participating in the list of conditions. */
|
|
|
|
Sql_condition *next_in_wi;
|
|
|
|
Sql_condition **prev_in_wi;
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/** Memory root to use to hold condition item values. */
|
|
|
|
MEM_ROOT *m_mem_root;
|
|
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/**
|
|
|
|
Information about warnings of the current connection.
|
|
|
|
*/
|
|
|
|
class Warning_info
|
|
|
|
{
|
2013-06-15 17:32:08 +02:00
|
|
|
/** The type of the counted and doubly linked list of conditions. */
|
|
|
|
typedef I_P_List<Sql_condition,
|
|
|
|
I_P_List_adapter<Sql_condition,
|
|
|
|
&Sql_condition::next_in_wi,
|
|
|
|
&Sql_condition::prev_in_wi>,
|
|
|
|
I_P_List_counter,
|
|
|
|
I_P_List_fast_push_back<Sql_condition> >
|
|
|
|
Sql_condition_list;
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/** A memory root to allocate warnings and errors */
|
|
|
|
MEM_ROOT m_warn_root;
|
2011-04-15 14:02:22 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/** List of warnings of all severities (levels). */
|
2013-06-15 17:32:08 +02:00
|
|
|
Sql_condition_list m_warn_list;
|
2011-04-15 14:02:22 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/** A break down of the number of warnings per severity (level). */
|
2013-06-15 17:32:08 +02:00
|
|
|
uint m_warn_count[(uint) Sql_condition::WARN_LEVEL_END];
|
2011-04-15 14:02:22 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
|
|
|
The number of warnings of the current statement. Warning_info
|
|
|
|
life cycle differs from statement life cycle -- it may span
|
|
|
|
multiple statements. In that case we get
|
2013-06-15 17:32:08 +02:00
|
|
|
m_current_statement_warn_count 0, whereas m_warn_list is not empty.
|
2009-09-10 11:18:29 +02:00
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
uint m_current_statement_warn_count;
|
2011-04-15 14:02:22 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/*
|
|
|
|
Row counter, to print in errors and warnings. Not increased in
|
|
|
|
create_sort_index(); may differ from examined_row_count.
|
|
|
|
*/
|
|
|
|
ulong m_current_row_for_warning;
|
2011-04-15 14:02:22 +02:00
|
|
|
|
|
|
|
/** Used to optionally clear warnings only once per statement. */
|
2009-09-10 11:18:29 +02:00
|
|
|
ulonglong m_warn_id;
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/**
|
|
|
|
A pointer to an element of m_warn_list. It determines SQL-condition
|
|
|
|
instance which corresponds to the error state in Diagnostics_area.
|
|
|
|
|
|
|
|
This is needed for properly processing SQL-conditions in SQL-handlers.
|
|
|
|
When an SQL-handler is found for the current error state in Diagnostics_area,
|
|
|
|
this pointer is needed to remove the corresponding SQL-condition from the
|
|
|
|
Warning_info list.
|
|
|
|
|
|
|
|
@note m_error_condition might be NULL in the following cases:
|
|
|
|
- Diagnostics_area set to fatal error state (like OOM);
|
|
|
|
- Max number of Warning_info elements has been reached (thus, there is
|
|
|
|
no corresponding SQL-condition object in Warning_info).
|
|
|
|
*/
|
|
|
|
const Sql_condition *m_error_condition;
|
|
|
|
|
2011-04-15 14:02:22 +02:00
|
|
|
/** Indicates if push_warning() allows unlimited number of warnings. */
|
|
|
|
bool m_allow_unlimited_warnings;
|
MDEV-4011 Added per thread memory counting and usage
Base code and idea from a patch from by plinux at Taobao.
The idea is that we mark all memory that are thread specific with MY_THREAD_SPECIFIC.
Memory counting is done per thread in the my_malloc_size_cb_func callback function from my_malloc().
There are plenty of new asserts to ensure that for a debug server the counting is correct.
Information_schema.processlist gets two new columns: MEMORY_USED and EXAMINED_ROWS.
- The later is there mainly to show how query is progressing.
The following changes in interfaces was needed to get this to work:
- init_alloc_root() amd init_sql_alloc() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- One now have to use alloc_root_set_min_malloc() to set min memory to be allocated by alloc_root()
- my_init_dynamic_array() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- my_net_init() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- Added flag for hash_init() so that one can mark hash table to be thread specific.
- Added flags to init_tree() so that one can mark tree to be thread specific.
- Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
- Added flag to Warning_info::Warning_info() if the structure should be fully initialized.
- String elements can now be marked as thread specific.
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Changed type of myf from int to ulong, as this is always a set of bit flags.
Other things:
- Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
- We now also show EXAMINED_ROWS in SHOW PROCESSLIST
- Added new variable 'memory_used'
- Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
- Removed calls to the obsoleted function init_dynamic_array()
- Use set_current_thd() instead of my_pthread_setspecific_ptr(THR_THD,...)
client/completion_hash.cc:
Updated call to init_alloc_root()
client/mysql.cc:
Updated call to init_alloc_root()
client/mysqlbinlog.cc:
init_dynamic_array() -> my_init_dynamic_array()
Updated call to init_alloc_root()
client/mysqlcheck.c:
Updated call to my_init_dynamic_array()
client/mysqldump.c:
Updated call to init_alloc_root()
client/mysqltest.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Fixed compiler warnings
extra/comp_err.c:
Updated call to my_init_dynamic_array()
extra/resolve_stack_dump.c:
Updated call to my_init_dynamic_array()
include/hash.h:
Added HASH_THREAD_SPECIFIC
include/heap.h:
Added flag is internal temporary table.
include/my_dir.h:
Safety fix: Ensure that MY_DONT_SORT and MY_WANT_STAT don't interfer with other mysys flags
include/my_global.h:
Changed type of myf from int to ulong, as this is always a set of bit flags.
include/my_sys.h:
Added MY_THREAD_SPECIFIC and MY_THREAD_MOVE
Added malloc_flags to DYNAMIC_ARRAY
Added extra mysys flag argument to my_init_dynamic_array()
Removed deprecated functions init_dynamic_array() and my_init_dynamic_array.._ci
Updated paramaters for init_alloc_root()
include/my_tree.h:
Added my_flags to allow one to use MY_THREAD_SPECIFIC with hash tables.
Removed with_delete. One should now instead use MY_TREE_WITH_DELETE_FLAG
Updated parameters to init_tree()
include/myisamchk.h:
Added malloc_flags to allow one to use MY_THREAD_SPECIFIC for checks.
include/mysql.h:
Added MYSQL_THREAD_SPECIFIC_MALLOC
Used 'unused1' to mark memory as thread specific.
include/mysql.h.pp:
Updated file
include/mysql_com.h:
Used 'unused1' to mark memory as thread specific.
Updated parameters for my_net_init()
libmysql/libmysql.c:
Updated call to init_alloc_root() to mark memory thread specific.
libmysqld/emb_qcache.cc:
Updated call to init_alloc_root()
libmysqld/lib_sql.cc:
Updated call to init_alloc_root()
mysql-test/r/create.result:
Updated results
mysql-test/r/user_var.result:
Updated results
mysql-test/suite/funcs_1/datadict/processlist_priv.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/datadict/processlist_val.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/is_columns_is.result:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result:
Updated results
mysql-test/suite/funcs_1/r/processlist_val_no_prot.result:
Updated results
mysql-test/t/show_explain.test:
Fixed usage of debug variable so that one can run test with --debug
mysql-test/t/user_var.test:
Added test of memory_usage variable.
mysys/array.c:
Added extra my_flags option to init_dynamic_array() and init_dynamic_array2() so that one can mark memory with MY_THREAD_SPECIFIC
All allocated memory is marked with the given my_flags.
Removed obsolete function init_dynamic_array()
mysys/default.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
mysys/hash.c:
Updated call to my_init_dynamic_array_ci().
Allocated memory is marked with MY_THREAD_SPECIFIC if HASH_THREAD_SPECIFIC is used.
mysys/ma_dyncol.c:
init_dynamic_array() -> my_init_dynamic_array()
Added #if to get rid of compiler warnings
mysys/mf_tempdir.c:
Updated call to my_init_dynamic_array()
mysys/my_alloc.c:
Added extra parameter to init_alloc_root() so that one can mark memory with MY_THREAD_SPECIFIC
Extend MEM_ROOT with a flag if memory is thread specific.
This is stored in block_size, to keep the size of the MEM_ROOT object identical as before.
Allocated memory is marked with MY_THREAD_SPECIFIC if used with init_alloc_root()
mysys/my_chmod.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_chsize.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_copy.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_create.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_delete.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_error.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fopen.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fstream.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_getwd.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_lib.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Updated DBUG_PRINT because of change of myf type
mysys/my_lock.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_malloc.c:
Store at start of each allocated memory block the size of the block and if the block is thread specific.
Call malloc_size_cb_func, if set, with the memory allocated/freed.
Updated DBUG_PRINT because of change of myf type
mysys/my_open.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_pread.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_read.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_redel.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_rename.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_seek.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_sync.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_thr_init.c:
Ensure that one can call my_thread_dbug_id() even if thread is not properly initialized.
mysys/my_write.c:
Updated DBUG_PRINT because of change of myf type
mysys/mysys_priv.h:
Updated parameters to sf_malloc and sf_realloc()
mysys/safemalloc.c:
Added checking that for memory marked with MY_THREAD_SPECIFIC that it's the same thread that is allocation and freeing the memory.
Added sf_malloc_dbug_id() to allow MariaDB to specify which THD is handling the memory.
Added my_flags arguments to sf_malloc() and sf_realloc() to be able to mark memory with MY_THREAD_SPECIFIC.
Added sf_report_leaked_memory() to get list of memory not freed by a thread.
mysys/tree.c:
Added flags to init_tree() so that one can mark tree to be thread specific.
Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
Updated call to init_alloc_root()
All allocated memory is marked with the given malloc flags
mysys/waiting_threads.c:
Updated call to my_init_dynamic_array()
sql-common/client.c:
Updated call to init_alloc_root() and my_net_init() to mark memory thread specific.
Updated call to my_init_dynamic_array().
Added MYSQL_THREAD_SPECIFIC_MALLOC so that client can mark memory as MY_THREAD_SPECIFIC.
sql-common/client_plugin.c:
Updated call to init_alloc_root()
sql/debug_sync.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/event_scheduler.cc:
Removed calls to net_end() as this is now done in ~THD()
Call set_current_thd() to ensure that memory is assigned to right thread.
sql/events.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/filesort.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/filesort_utils.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/ha_ndbcluster.cc:
Updated call to init_alloc_root()
Updated call to my_net_init()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_ndbcluster_binlog.cc:
Updated call to my_net_init()
Updated call to init_sql_alloc()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_partition.cc:
Updated call to init_alloc_root()
sql/handler.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
Added missing call to my_dir_end()
sql/item_func.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_subselect.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_sum.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/log.cc:
More DBUG
Updated call to init_alloc_root()
sql/mdl.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/mysqld.cc:
Added total_memory_used
Updated call to init_alloc_root()
Move mysql_cond_broadcast() before my_thread_end()
Added mariadb_dbug_id() to count memory per THD instead of per thread.
Added my_malloc_size_cb_func() callback function for my_malloc() to count memory.
Move initialization of mysqld_server_started and mysqld_server_initialized earlier.
Updated call to my_init_dynamic_array().
Updated call to my_net_init().
Call my_pthread_setspecific_ptr(THR_THD,...) to ensure that memory is assigned to right thread.
Added status variable 'memory_used'.
Updated call to init_alloc_root()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/mysqld.h:
Added set_current_thd()
sql/net_serv.cc:
Added new parameter to my_net_init() so that one can mark memory with MY_THREAD_SPECIFIC.
Store in net->thread_specific_malloc if memory is thread specific.
Mark memory to be thread specific if requested.
sql/opt_range.cc:
Updated call to my_init_dynamic_array()
Updated call to init_sql_alloc()
Added MY_THREAD_SPECIFIC to allocated memory.
sql/opt_subselect.cc:
Updated call to init_sql_alloc() to mark memory thread specific.
sql/protocol.cc:
Fixed compiler warning
sql/records.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/rpl_filter.cc:
Updated call to my_init_dynamic_array()
sql/rpl_handler.cc:
Updated call to my_init_dynamic_array2()
sql/rpl_handler.h:
Updated call to init_sql_alloc()
sql/rpl_mi.cc:
Updated call to my_init_dynamic_array()
sql/rpl_tblmap.cc:
Updated call to init_alloc_root()
sql/rpl_utility.cc:
Updated call to my_init_dynamic_array()
sql/slave.cc:
Initialize things properly before calling functions that allocate memory.
Removed calls to net_end() as this is now done in ~THD()
sql/sp_head.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
Added parameter to warning_info() that it should be fully initialized.
sql/sp_pcontext.cc:
Updated call to my_init_dynamic_array()
sql/sql_acl.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_admin.cc:
Added parameter to warning_info() that it should be fully initialized.
sql/sql_analyse.h:
Updated call to init_tree() to mark memory thread specific.
sql/sql_array.h:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_audit.cc:
Updated call to my_init_dynamic_array()
sql/sql_base.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_cache.cc:
Updated comment
sql/sql_class.cc:
Added parameter to warning_info() that not initialize it until THD is fully created.
Updated call to init_sql_alloc()
Mark THD::user_vars has to be thread specific.
Updated call to my_init_dynamic_array()
Ensure that memory allocated by THD is assigned to the THD.
More DBUG
Always acll net_end() in ~THD()
Assert that all memory signed to this THD is really deleted at ~THD.
Fixed set_status_var_init() to not reset memory_used.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_class.h:
Added MY_THREAD_SPECIFIC to allocated memory.
Added malloc_size to THD to record allocated memory per THD.
sql/sql_delete.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_error.cc:
Added 'initialize' parameter to Warning_info() to say if should allocate memory for it's structures.
This is used by THD::THD() to not allocate memory until THD is ready.
Added Warning_info::free_memory()
sql/sql_error.h:
Updated Warning_info() class.
sql/sql_handler.cc:
Updated call to init_alloc_root() to mark memory thread specific.
sql/sql_insert.cc:
More DBUG
sql/sql_join_cache.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_lex.cc:
Updated call to my_init_dynamic_array()
sql/sql_lex.h:
Updated call to my_init_dynamic_array()
sql/sql_load.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_parse.cc:
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
Ensure that examined_row_count() is reset before query.
Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Don't restore thd->status_var.memory_used when restoring thd->status_var
sql/sql_plugin.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Don't allocate THD on the stack, as this causes problems with valgrind when doing thd memory counting.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_prepare.cc:
Added parameter to warning_info() that it should be fully initialized.
Updated call to init_sql_alloc() to mark memory thread specific.
sql/sql_reload.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_select.cc:
Updated call to my_init_dynamic_array() and init_sql_alloc() to mark memory thread specific.
Added MY_THREAD_SPECIFIC to allocated memory.
More DBUG
sql/sql_servers.cc:
Updated call to init_sql_alloc() to mark memory some memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_show.cc:
Updated call to my_init_dynamic_array()
Mark my_dir() memory thread specific.
Use my_pthread_setspecific_ptr(THR_THD,...) to mark that allocated memory should be allocated to calling thread.
More DBUG.
Added malloc_size and examined_row_count to SHOW PROCESSLIST.
Added MY_THREAD_SPECIFIC to allocated memory.
Updated call to init_sql_alloc()
Added parameter to warning_info() that it should be fully initialized.
sql/sql_statistics.cc:
Fixed compiler warning
sql/sql_string.cc:
String elements can now be marked as thread specific.
sql/sql_string.h:
String elements can now be marked as thread specific.
sql/sql_table.cc:
Updated call to init_sql_alloc() and my_malloc() to mark memory thread specific
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Fixed compiler warning
sql/sql_test.cc:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_trigger.cc:
Updated call to init_sql_alloc()
sql/sql_udf.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_update.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/table.cc:
Updated call to init_sql_alloc().
Mark memory used by temporary tables, that are not for slave threads, as MY_THREAD_SPECIFIC
Updated call to init_sql_alloc()
sql/thr_malloc.cc:
Added my_flags argument to init_sql_alloc() to be able to mark memory as MY_THREAD_SPECIFIC.
sql/thr_malloc.h:
Updated prototype for init_sql_alloc()
sql/tztime.cc:
Updated call to init_sql_alloc()
Updated call to init_alloc_root() to mark memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/uniques.cc:
Updated calls to init_tree(), my_init_dynamic_array() and my_malloc() to mark memory thread specific.
sql/unireg.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/csv/ha_tina.cc:
Updated call to init_alloc_root()
storage/federated/ha_federated.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Ensure that memory allocated by fedarated is registered for the system, not for the thread.
storage/federatedx/federatedx_io_mysql.cc:
Updated call to my_init_dynamic_array()
storage/federatedx/ha_federatedx.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
storage/heap/ha_heap.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/heap/heapdef.h:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_block.c:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_create.c:
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Use MY_TREE_WITH_DELETE instead of removed option 'with_delete'.
storage/heap/hp_open.c:
Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
storage/heap/hp_write.c:
Added new parameter to hp_get_new_block()
storage/maria/ma_bitmap.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_blockrec.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_check.c:
Updated call to init_alloc_root()
storage/maria/ma_ft_boolean_search.c:
Updated calls to init_tree() and init_alloc_root()
storage/maria/ma_ft_nlq_search.c:
Updated call to init_tree()
storage/maria/ma_ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/maria/ma_loghandler.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_open.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_sort.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_write.c:
Updated calls to my_init_dynamic_array() and init_tree()
storage/maria/maria_pack.c:
Updated call to init_tree()
storage/maria/unittest/sequence_storage.c:
Updated call to my_init_dynamic_array()
storage/myisam/ft_boolean_search.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_nlq_search.c:
Updated call to init_tree()
storage/myisam/ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_stopwords.c:
Updated call to init_tree()
storage/myisam/mi_check.c:
Updated call to init_alloc_root()
storage/myisam/mi_write.c:
Updated call to my_init_dynamic_array()
Updated call to init_tree()
storage/myisam/myisamlog.c:
Updated call to init_tree()
storage/myisam/myisampack.c:
Updated call to init_tree()
storage/myisam/sort.c:
Updated call to my_init_dynamic_array()
storage/myisammrg/ha_myisammrg.cc:
Updated call to init_sql_alloc()
storage/perfschema/pfs_check.cc:
Rest current_thd
storage/perfschema/pfs_instr.cc:
Removed DBUG_ENTER/DBUG_VOID_RETURN as at this point my_thread_var is not allocated anymore, which can cause problems.
support-files/compiler_warnings.supp:
Disable compiler warning from offsetof macro.
2013-01-23 16:16:14 +01:00
|
|
|
bool initialized; /* Set to 1 if init() has been called */
|
2011-04-15 14:02:22 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/** Read only status. */
|
|
|
|
bool m_read_only;
|
|
|
|
|
|
|
|
/** Pointers for participating in the stack of Warning_info objects. */
|
|
|
|
Warning_info *m_next_in_da;
|
|
|
|
Warning_info **m_prev_in_da;
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
List<Sql_condition> m_marked_sql_conditions;
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
public:
|
MDEV-4011 Added per thread memory counting and usage
Base code and idea from a patch from by plinux at Taobao.
The idea is that we mark all memory that are thread specific with MY_THREAD_SPECIFIC.
Memory counting is done per thread in the my_malloc_size_cb_func callback function from my_malloc().
There are plenty of new asserts to ensure that for a debug server the counting is correct.
Information_schema.processlist gets two new columns: MEMORY_USED and EXAMINED_ROWS.
- The later is there mainly to show how query is progressing.
The following changes in interfaces was needed to get this to work:
- init_alloc_root() amd init_sql_alloc() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- One now have to use alloc_root_set_min_malloc() to set min memory to be allocated by alloc_root()
- my_init_dynamic_array() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- my_net_init() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- Added flag for hash_init() so that one can mark hash table to be thread specific.
- Added flags to init_tree() so that one can mark tree to be thread specific.
- Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
- Added flag to Warning_info::Warning_info() if the structure should be fully initialized.
- String elements can now be marked as thread specific.
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Changed type of myf from int to ulong, as this is always a set of bit flags.
Other things:
- Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
- We now also show EXAMINED_ROWS in SHOW PROCESSLIST
- Added new variable 'memory_used'
- Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
- Removed calls to the obsoleted function init_dynamic_array()
- Use set_current_thd() instead of my_pthread_setspecific_ptr(THR_THD,...)
client/completion_hash.cc:
Updated call to init_alloc_root()
client/mysql.cc:
Updated call to init_alloc_root()
client/mysqlbinlog.cc:
init_dynamic_array() -> my_init_dynamic_array()
Updated call to init_alloc_root()
client/mysqlcheck.c:
Updated call to my_init_dynamic_array()
client/mysqldump.c:
Updated call to init_alloc_root()
client/mysqltest.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Fixed compiler warnings
extra/comp_err.c:
Updated call to my_init_dynamic_array()
extra/resolve_stack_dump.c:
Updated call to my_init_dynamic_array()
include/hash.h:
Added HASH_THREAD_SPECIFIC
include/heap.h:
Added flag is internal temporary table.
include/my_dir.h:
Safety fix: Ensure that MY_DONT_SORT and MY_WANT_STAT don't interfer with other mysys flags
include/my_global.h:
Changed type of myf from int to ulong, as this is always a set of bit flags.
include/my_sys.h:
Added MY_THREAD_SPECIFIC and MY_THREAD_MOVE
Added malloc_flags to DYNAMIC_ARRAY
Added extra mysys flag argument to my_init_dynamic_array()
Removed deprecated functions init_dynamic_array() and my_init_dynamic_array.._ci
Updated paramaters for init_alloc_root()
include/my_tree.h:
Added my_flags to allow one to use MY_THREAD_SPECIFIC with hash tables.
Removed with_delete. One should now instead use MY_TREE_WITH_DELETE_FLAG
Updated parameters to init_tree()
include/myisamchk.h:
Added malloc_flags to allow one to use MY_THREAD_SPECIFIC for checks.
include/mysql.h:
Added MYSQL_THREAD_SPECIFIC_MALLOC
Used 'unused1' to mark memory as thread specific.
include/mysql.h.pp:
Updated file
include/mysql_com.h:
Used 'unused1' to mark memory as thread specific.
Updated parameters for my_net_init()
libmysql/libmysql.c:
Updated call to init_alloc_root() to mark memory thread specific.
libmysqld/emb_qcache.cc:
Updated call to init_alloc_root()
libmysqld/lib_sql.cc:
Updated call to init_alloc_root()
mysql-test/r/create.result:
Updated results
mysql-test/r/user_var.result:
Updated results
mysql-test/suite/funcs_1/datadict/processlist_priv.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/datadict/processlist_val.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/is_columns_is.result:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result:
Updated results
mysql-test/suite/funcs_1/r/processlist_val_no_prot.result:
Updated results
mysql-test/t/show_explain.test:
Fixed usage of debug variable so that one can run test with --debug
mysql-test/t/user_var.test:
Added test of memory_usage variable.
mysys/array.c:
Added extra my_flags option to init_dynamic_array() and init_dynamic_array2() so that one can mark memory with MY_THREAD_SPECIFIC
All allocated memory is marked with the given my_flags.
Removed obsolete function init_dynamic_array()
mysys/default.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
mysys/hash.c:
Updated call to my_init_dynamic_array_ci().
Allocated memory is marked with MY_THREAD_SPECIFIC if HASH_THREAD_SPECIFIC is used.
mysys/ma_dyncol.c:
init_dynamic_array() -> my_init_dynamic_array()
Added #if to get rid of compiler warnings
mysys/mf_tempdir.c:
Updated call to my_init_dynamic_array()
mysys/my_alloc.c:
Added extra parameter to init_alloc_root() so that one can mark memory with MY_THREAD_SPECIFIC
Extend MEM_ROOT with a flag if memory is thread specific.
This is stored in block_size, to keep the size of the MEM_ROOT object identical as before.
Allocated memory is marked with MY_THREAD_SPECIFIC if used with init_alloc_root()
mysys/my_chmod.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_chsize.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_copy.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_create.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_delete.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_error.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fopen.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fstream.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_getwd.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_lib.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Updated DBUG_PRINT because of change of myf type
mysys/my_lock.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_malloc.c:
Store at start of each allocated memory block the size of the block and if the block is thread specific.
Call malloc_size_cb_func, if set, with the memory allocated/freed.
Updated DBUG_PRINT because of change of myf type
mysys/my_open.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_pread.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_read.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_redel.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_rename.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_seek.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_sync.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_thr_init.c:
Ensure that one can call my_thread_dbug_id() even if thread is not properly initialized.
mysys/my_write.c:
Updated DBUG_PRINT because of change of myf type
mysys/mysys_priv.h:
Updated parameters to sf_malloc and sf_realloc()
mysys/safemalloc.c:
Added checking that for memory marked with MY_THREAD_SPECIFIC that it's the same thread that is allocation and freeing the memory.
Added sf_malloc_dbug_id() to allow MariaDB to specify which THD is handling the memory.
Added my_flags arguments to sf_malloc() and sf_realloc() to be able to mark memory with MY_THREAD_SPECIFIC.
Added sf_report_leaked_memory() to get list of memory not freed by a thread.
mysys/tree.c:
Added flags to init_tree() so that one can mark tree to be thread specific.
Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
Updated call to init_alloc_root()
All allocated memory is marked with the given malloc flags
mysys/waiting_threads.c:
Updated call to my_init_dynamic_array()
sql-common/client.c:
Updated call to init_alloc_root() and my_net_init() to mark memory thread specific.
Updated call to my_init_dynamic_array().
Added MYSQL_THREAD_SPECIFIC_MALLOC so that client can mark memory as MY_THREAD_SPECIFIC.
sql-common/client_plugin.c:
Updated call to init_alloc_root()
sql/debug_sync.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/event_scheduler.cc:
Removed calls to net_end() as this is now done in ~THD()
Call set_current_thd() to ensure that memory is assigned to right thread.
sql/events.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/filesort.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/filesort_utils.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/ha_ndbcluster.cc:
Updated call to init_alloc_root()
Updated call to my_net_init()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_ndbcluster_binlog.cc:
Updated call to my_net_init()
Updated call to init_sql_alloc()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_partition.cc:
Updated call to init_alloc_root()
sql/handler.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
Added missing call to my_dir_end()
sql/item_func.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_subselect.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_sum.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/log.cc:
More DBUG
Updated call to init_alloc_root()
sql/mdl.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/mysqld.cc:
Added total_memory_used
Updated call to init_alloc_root()
Move mysql_cond_broadcast() before my_thread_end()
Added mariadb_dbug_id() to count memory per THD instead of per thread.
Added my_malloc_size_cb_func() callback function for my_malloc() to count memory.
Move initialization of mysqld_server_started and mysqld_server_initialized earlier.
Updated call to my_init_dynamic_array().
Updated call to my_net_init().
Call my_pthread_setspecific_ptr(THR_THD,...) to ensure that memory is assigned to right thread.
Added status variable 'memory_used'.
Updated call to init_alloc_root()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/mysqld.h:
Added set_current_thd()
sql/net_serv.cc:
Added new parameter to my_net_init() so that one can mark memory with MY_THREAD_SPECIFIC.
Store in net->thread_specific_malloc if memory is thread specific.
Mark memory to be thread specific if requested.
sql/opt_range.cc:
Updated call to my_init_dynamic_array()
Updated call to init_sql_alloc()
Added MY_THREAD_SPECIFIC to allocated memory.
sql/opt_subselect.cc:
Updated call to init_sql_alloc() to mark memory thread specific.
sql/protocol.cc:
Fixed compiler warning
sql/records.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/rpl_filter.cc:
Updated call to my_init_dynamic_array()
sql/rpl_handler.cc:
Updated call to my_init_dynamic_array2()
sql/rpl_handler.h:
Updated call to init_sql_alloc()
sql/rpl_mi.cc:
Updated call to my_init_dynamic_array()
sql/rpl_tblmap.cc:
Updated call to init_alloc_root()
sql/rpl_utility.cc:
Updated call to my_init_dynamic_array()
sql/slave.cc:
Initialize things properly before calling functions that allocate memory.
Removed calls to net_end() as this is now done in ~THD()
sql/sp_head.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
Added parameter to warning_info() that it should be fully initialized.
sql/sp_pcontext.cc:
Updated call to my_init_dynamic_array()
sql/sql_acl.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_admin.cc:
Added parameter to warning_info() that it should be fully initialized.
sql/sql_analyse.h:
Updated call to init_tree() to mark memory thread specific.
sql/sql_array.h:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_audit.cc:
Updated call to my_init_dynamic_array()
sql/sql_base.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_cache.cc:
Updated comment
sql/sql_class.cc:
Added parameter to warning_info() that not initialize it until THD is fully created.
Updated call to init_sql_alloc()
Mark THD::user_vars has to be thread specific.
Updated call to my_init_dynamic_array()
Ensure that memory allocated by THD is assigned to the THD.
More DBUG
Always acll net_end() in ~THD()
Assert that all memory signed to this THD is really deleted at ~THD.
Fixed set_status_var_init() to not reset memory_used.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_class.h:
Added MY_THREAD_SPECIFIC to allocated memory.
Added malloc_size to THD to record allocated memory per THD.
sql/sql_delete.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_error.cc:
Added 'initialize' parameter to Warning_info() to say if should allocate memory for it's structures.
This is used by THD::THD() to not allocate memory until THD is ready.
Added Warning_info::free_memory()
sql/sql_error.h:
Updated Warning_info() class.
sql/sql_handler.cc:
Updated call to init_alloc_root() to mark memory thread specific.
sql/sql_insert.cc:
More DBUG
sql/sql_join_cache.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_lex.cc:
Updated call to my_init_dynamic_array()
sql/sql_lex.h:
Updated call to my_init_dynamic_array()
sql/sql_load.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_parse.cc:
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
Ensure that examined_row_count() is reset before query.
Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Don't restore thd->status_var.memory_used when restoring thd->status_var
sql/sql_plugin.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Don't allocate THD on the stack, as this causes problems with valgrind when doing thd memory counting.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_prepare.cc:
Added parameter to warning_info() that it should be fully initialized.
Updated call to init_sql_alloc() to mark memory thread specific.
sql/sql_reload.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_select.cc:
Updated call to my_init_dynamic_array() and init_sql_alloc() to mark memory thread specific.
Added MY_THREAD_SPECIFIC to allocated memory.
More DBUG
sql/sql_servers.cc:
Updated call to init_sql_alloc() to mark memory some memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_show.cc:
Updated call to my_init_dynamic_array()
Mark my_dir() memory thread specific.
Use my_pthread_setspecific_ptr(THR_THD,...) to mark that allocated memory should be allocated to calling thread.
More DBUG.
Added malloc_size and examined_row_count to SHOW PROCESSLIST.
Added MY_THREAD_SPECIFIC to allocated memory.
Updated call to init_sql_alloc()
Added parameter to warning_info() that it should be fully initialized.
sql/sql_statistics.cc:
Fixed compiler warning
sql/sql_string.cc:
String elements can now be marked as thread specific.
sql/sql_string.h:
String elements can now be marked as thread specific.
sql/sql_table.cc:
Updated call to init_sql_alloc() and my_malloc() to mark memory thread specific
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Fixed compiler warning
sql/sql_test.cc:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_trigger.cc:
Updated call to init_sql_alloc()
sql/sql_udf.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_update.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/table.cc:
Updated call to init_sql_alloc().
Mark memory used by temporary tables, that are not for slave threads, as MY_THREAD_SPECIFIC
Updated call to init_sql_alloc()
sql/thr_malloc.cc:
Added my_flags argument to init_sql_alloc() to be able to mark memory as MY_THREAD_SPECIFIC.
sql/thr_malloc.h:
Updated prototype for init_sql_alloc()
sql/tztime.cc:
Updated call to init_sql_alloc()
Updated call to init_alloc_root() to mark memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/uniques.cc:
Updated calls to init_tree(), my_init_dynamic_array() and my_malloc() to mark memory thread specific.
sql/unireg.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/csv/ha_tina.cc:
Updated call to init_alloc_root()
storage/federated/ha_federated.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Ensure that memory allocated by fedarated is registered for the system, not for the thread.
storage/federatedx/federatedx_io_mysql.cc:
Updated call to my_init_dynamic_array()
storage/federatedx/ha_federatedx.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
storage/heap/ha_heap.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/heap/heapdef.h:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_block.c:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_create.c:
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Use MY_TREE_WITH_DELETE instead of removed option 'with_delete'.
storage/heap/hp_open.c:
Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
storage/heap/hp_write.c:
Added new parameter to hp_get_new_block()
storage/maria/ma_bitmap.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_blockrec.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_check.c:
Updated call to init_alloc_root()
storage/maria/ma_ft_boolean_search.c:
Updated calls to init_tree() and init_alloc_root()
storage/maria/ma_ft_nlq_search.c:
Updated call to init_tree()
storage/maria/ma_ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/maria/ma_loghandler.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_open.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_sort.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_write.c:
Updated calls to my_init_dynamic_array() and init_tree()
storage/maria/maria_pack.c:
Updated call to init_tree()
storage/maria/unittest/sequence_storage.c:
Updated call to my_init_dynamic_array()
storage/myisam/ft_boolean_search.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_nlq_search.c:
Updated call to init_tree()
storage/myisam/ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_stopwords.c:
Updated call to init_tree()
storage/myisam/mi_check.c:
Updated call to init_alloc_root()
storage/myisam/mi_write.c:
Updated call to my_init_dynamic_array()
Updated call to init_tree()
storage/myisam/myisamlog.c:
Updated call to init_tree()
storage/myisam/myisampack.c:
Updated call to init_tree()
storage/myisam/sort.c:
Updated call to my_init_dynamic_array()
storage/myisammrg/ha_myisammrg.cc:
Updated call to init_sql_alloc()
storage/perfschema/pfs_check.cc:
Rest current_thd
storage/perfschema/pfs_instr.cc:
Removed DBUG_ENTER/DBUG_VOID_RETURN as at this point my_thread_var is not allocated anymore, which can cause problems.
support-files/compiler_warnings.supp:
Disable compiler warning from offsetof macro.
2013-01-23 16:16:14 +01:00
|
|
|
Warning_info(ulonglong warn_id_arg, bool allow_unlimited_warnings,
|
2013-06-15 17:32:08 +02:00
|
|
|
bool initialized);
|
2009-09-10 11:18:29 +02:00
|
|
|
~Warning_info();
|
MDEV-4011 Added per thread memory counting and usage
Base code and idea from a patch from by plinux at Taobao.
The idea is that we mark all memory that are thread specific with MY_THREAD_SPECIFIC.
Memory counting is done per thread in the my_malloc_size_cb_func callback function from my_malloc().
There are plenty of new asserts to ensure that for a debug server the counting is correct.
Information_schema.processlist gets two new columns: MEMORY_USED and EXAMINED_ROWS.
- The later is there mainly to show how query is progressing.
The following changes in interfaces was needed to get this to work:
- init_alloc_root() amd init_sql_alloc() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- One now have to use alloc_root_set_min_malloc() to set min memory to be allocated by alloc_root()
- my_init_dynamic_array() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- my_net_init() has extra option so that one can mark memory with MY_THREAD_SPECIFIC
- Added flag for hash_init() so that one can mark hash table to be thread specific.
- Added flags to init_tree() so that one can mark tree to be thread specific.
- Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
- Added flag to Warning_info::Warning_info() if the structure should be fully initialized.
- String elements can now be marked as thread specific.
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Changed type of myf from int to ulong, as this is always a set of bit flags.
Other things:
- Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
- We now also show EXAMINED_ROWS in SHOW PROCESSLIST
- Added new variable 'memory_used'
- Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
- Removed calls to the obsoleted function init_dynamic_array()
- Use set_current_thd() instead of my_pthread_setspecific_ptr(THR_THD,...)
client/completion_hash.cc:
Updated call to init_alloc_root()
client/mysql.cc:
Updated call to init_alloc_root()
client/mysqlbinlog.cc:
init_dynamic_array() -> my_init_dynamic_array()
Updated call to init_alloc_root()
client/mysqlcheck.c:
Updated call to my_init_dynamic_array()
client/mysqldump.c:
Updated call to init_alloc_root()
client/mysqltest.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Fixed compiler warnings
extra/comp_err.c:
Updated call to my_init_dynamic_array()
extra/resolve_stack_dump.c:
Updated call to my_init_dynamic_array()
include/hash.h:
Added HASH_THREAD_SPECIFIC
include/heap.h:
Added flag is internal temporary table.
include/my_dir.h:
Safety fix: Ensure that MY_DONT_SORT and MY_WANT_STAT don't interfer with other mysys flags
include/my_global.h:
Changed type of myf from int to ulong, as this is always a set of bit flags.
include/my_sys.h:
Added MY_THREAD_SPECIFIC and MY_THREAD_MOVE
Added malloc_flags to DYNAMIC_ARRAY
Added extra mysys flag argument to my_init_dynamic_array()
Removed deprecated functions init_dynamic_array() and my_init_dynamic_array.._ci
Updated paramaters for init_alloc_root()
include/my_tree.h:
Added my_flags to allow one to use MY_THREAD_SPECIFIC with hash tables.
Removed with_delete. One should now instead use MY_TREE_WITH_DELETE_FLAG
Updated parameters to init_tree()
include/myisamchk.h:
Added malloc_flags to allow one to use MY_THREAD_SPECIFIC for checks.
include/mysql.h:
Added MYSQL_THREAD_SPECIFIC_MALLOC
Used 'unused1' to mark memory as thread specific.
include/mysql.h.pp:
Updated file
include/mysql_com.h:
Used 'unused1' to mark memory as thread specific.
Updated parameters for my_net_init()
libmysql/libmysql.c:
Updated call to init_alloc_root() to mark memory thread specific.
libmysqld/emb_qcache.cc:
Updated call to init_alloc_root()
libmysqld/lib_sql.cc:
Updated call to init_alloc_root()
mysql-test/r/create.result:
Updated results
mysql-test/r/user_var.result:
Updated results
mysql-test/suite/funcs_1/datadict/processlist_priv.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/datadict/processlist_val.inc:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/is_columns_is.result:
Update to handle new format of SHOW PROCESSLIST
mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result:
Updated results
mysql-test/suite/funcs_1/r/processlist_val_no_prot.result:
Updated results
mysql-test/t/show_explain.test:
Fixed usage of debug variable so that one can run test with --debug
mysql-test/t/user_var.test:
Added test of memory_usage variable.
mysys/array.c:
Added extra my_flags option to init_dynamic_array() and init_dynamic_array2() so that one can mark memory with MY_THREAD_SPECIFIC
All allocated memory is marked with the given my_flags.
Removed obsolete function init_dynamic_array()
mysys/default.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
mysys/hash.c:
Updated call to my_init_dynamic_array_ci().
Allocated memory is marked with MY_THREAD_SPECIFIC if HASH_THREAD_SPECIFIC is used.
mysys/ma_dyncol.c:
init_dynamic_array() -> my_init_dynamic_array()
Added #if to get rid of compiler warnings
mysys/mf_tempdir.c:
Updated call to my_init_dynamic_array()
mysys/my_alloc.c:
Added extra parameter to init_alloc_root() so that one can mark memory with MY_THREAD_SPECIFIC
Extend MEM_ROOT with a flag if memory is thread specific.
This is stored in block_size, to keep the size of the MEM_ROOT object identical as before.
Allocated memory is marked with MY_THREAD_SPECIFIC if used with init_alloc_root()
mysys/my_chmod.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_chsize.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_copy.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_create.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_delete.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_error.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fopen.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_fstream.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_getwd.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_lib.c:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Updated DBUG_PRINT because of change of myf type
mysys/my_lock.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_malloc.c:
Store at start of each allocated memory block the size of the block and if the block is thread specific.
Call malloc_size_cb_func, if set, with the memory allocated/freed.
Updated DBUG_PRINT because of change of myf type
mysys/my_open.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_pread.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_read.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_redel.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_rename.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_seek.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_sync.c:
Updated DBUG_PRINT because of change of myf type
mysys/my_thr_init.c:
Ensure that one can call my_thread_dbug_id() even if thread is not properly initialized.
mysys/my_write.c:
Updated DBUG_PRINT because of change of myf type
mysys/mysys_priv.h:
Updated parameters to sf_malloc and sf_realloc()
mysys/safemalloc.c:
Added checking that for memory marked with MY_THREAD_SPECIFIC that it's the same thread that is allocation and freeing the memory.
Added sf_malloc_dbug_id() to allow MariaDB to specify which THD is handling the memory.
Added my_flags arguments to sf_malloc() and sf_realloc() to be able to mark memory with MY_THREAD_SPECIFIC.
Added sf_report_leaked_memory() to get list of memory not freed by a thread.
mysys/tree.c:
Added flags to init_tree() so that one can mark tree to be thread specific.
Removed with_delete option to init_tree(). Now one should instead use MY_TREE_WITH_DELETE_FLAG.
Updated call to init_alloc_root()
All allocated memory is marked with the given malloc flags
mysys/waiting_threads.c:
Updated call to my_init_dynamic_array()
sql-common/client.c:
Updated call to init_alloc_root() and my_net_init() to mark memory thread specific.
Updated call to my_init_dynamic_array().
Added MYSQL_THREAD_SPECIFIC_MALLOC so that client can mark memory as MY_THREAD_SPECIFIC.
sql-common/client_plugin.c:
Updated call to init_alloc_root()
sql/debug_sync.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/event_scheduler.cc:
Removed calls to net_end() as this is now done in ~THD()
Call set_current_thd() to ensure that memory is assigned to right thread.
sql/events.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/filesort.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/filesort_utils.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/ha_ndbcluster.cc:
Updated call to init_alloc_root()
Updated call to my_net_init()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_ndbcluster_binlog.cc:
Updated call to my_net_init()
Updated call to init_sql_alloc()
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
sql/ha_partition.cc:
Updated call to init_alloc_root()
sql/handler.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
Added missing call to my_dir_end()
sql/item_func.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_subselect.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/item_sum.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/log.cc:
More DBUG
Updated call to init_alloc_root()
sql/mdl.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/mysqld.cc:
Added total_memory_used
Updated call to init_alloc_root()
Move mysql_cond_broadcast() before my_thread_end()
Added mariadb_dbug_id() to count memory per THD instead of per thread.
Added my_malloc_size_cb_func() callback function for my_malloc() to count memory.
Move initialization of mysqld_server_started and mysqld_server_initialized earlier.
Updated call to my_init_dynamic_array().
Updated call to my_net_init().
Call my_pthread_setspecific_ptr(THR_THD,...) to ensure that memory is assigned to right thread.
Added status variable 'memory_used'.
Updated call to init_alloc_root()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/mysqld.h:
Added set_current_thd()
sql/net_serv.cc:
Added new parameter to my_net_init() so that one can mark memory with MY_THREAD_SPECIFIC.
Store in net->thread_specific_malloc if memory is thread specific.
Mark memory to be thread specific if requested.
sql/opt_range.cc:
Updated call to my_init_dynamic_array()
Updated call to init_sql_alloc()
Added MY_THREAD_SPECIFIC to allocated memory.
sql/opt_subselect.cc:
Updated call to init_sql_alloc() to mark memory thread specific.
sql/protocol.cc:
Fixed compiler warning
sql/records.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/rpl_filter.cc:
Updated call to my_init_dynamic_array()
sql/rpl_handler.cc:
Updated call to my_init_dynamic_array2()
sql/rpl_handler.h:
Updated call to init_sql_alloc()
sql/rpl_mi.cc:
Updated call to my_init_dynamic_array()
sql/rpl_tblmap.cc:
Updated call to init_alloc_root()
sql/rpl_utility.cc:
Updated call to my_init_dynamic_array()
sql/slave.cc:
Initialize things properly before calling functions that allocate memory.
Removed calls to net_end() as this is now done in ~THD()
sql/sp_head.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
Added parameter to warning_info() that it should be fully initialized.
sql/sp_pcontext.cc:
Updated call to my_init_dynamic_array()
sql/sql_acl.cc:
Updated call to init_sql_alloc()
Updated call to my_init_dynamic_array()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_admin.cc:
Added parameter to warning_info() that it should be fully initialized.
sql/sql_analyse.h:
Updated call to init_tree() to mark memory thread specific.
sql/sql_array.h:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_audit.cc:
Updated call to my_init_dynamic_array()
sql/sql_base.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_cache.cc:
Updated comment
sql/sql_class.cc:
Added parameter to warning_info() that not initialize it until THD is fully created.
Updated call to init_sql_alloc()
Mark THD::user_vars has to be thread specific.
Updated call to my_init_dynamic_array()
Ensure that memory allocated by THD is assigned to the THD.
More DBUG
Always acll net_end() in ~THD()
Assert that all memory signed to this THD is really deleted at ~THD.
Fixed set_status_var_init() to not reset memory_used.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_class.h:
Added MY_THREAD_SPECIFIC to allocated memory.
Added malloc_size to THD to record allocated memory per THD.
sql/sql_delete.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_error.cc:
Added 'initialize' parameter to Warning_info() to say if should allocate memory for it's structures.
This is used by THD::THD() to not allocate memory until THD is ready.
Added Warning_info::free_memory()
sql/sql_error.h:
Updated Warning_info() class.
sql/sql_handler.cc:
Updated call to init_alloc_root() to mark memory thread specific.
sql/sql_insert.cc:
More DBUG
sql/sql_join_cache.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_lex.cc:
Updated call to my_init_dynamic_array()
sql/sql_lex.h:
Updated call to my_init_dynamic_array()
sql/sql_load.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/sql_parse.cc:
Removed calls to net_end() and thd->cleanup() as these are now done in ~THD()
Ensure that examined_row_count() is reset before query.
Fixed bug where kill_threads_for_user() was using the wrong mem_root to allocate memory.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Don't restore thd->status_var.memory_used when restoring thd->status_var
sql/sql_plugin.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Don't allocate THD on the stack, as this causes problems with valgrind when doing thd memory counting.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_prepare.cc:
Added parameter to warning_info() that it should be fully initialized.
Updated call to init_sql_alloc() to mark memory thread specific.
sql/sql_reload.cc:
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_select.cc:
Updated call to my_init_dynamic_array() and init_sql_alloc() to mark memory thread specific.
Added MY_THREAD_SPECIFIC to allocated memory.
More DBUG
sql/sql_servers.cc:
Updated call to init_sql_alloc() to mark memory some memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_show.cc:
Updated call to my_init_dynamic_array()
Mark my_dir() memory thread specific.
Use my_pthread_setspecific_ptr(THR_THD,...) to mark that allocated memory should be allocated to calling thread.
More DBUG.
Added malloc_size and examined_row_count to SHOW PROCESSLIST.
Added MY_THREAD_SPECIFIC to allocated memory.
Updated call to init_sql_alloc()
Added parameter to warning_info() that it should be fully initialized.
sql/sql_statistics.cc:
Fixed compiler warning
sql/sql_string.cc:
String elements can now be marked as thread specific.
sql/sql_string.h:
String elements can now be marked as thread specific.
sql/sql_table.cc:
Updated call to init_sql_alloc() and my_malloc() to mark memory thread specific
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
Fixed compiler warning
sql/sql_test.cc:
Updated call to my_init_dynamic_array() to mark memory thread specific.
sql/sql_trigger.cc:
Updated call to init_sql_alloc()
sql/sql_udf.cc:
Updated call to init_sql_alloc()
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/sql_update.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
sql/table.cc:
Updated call to init_sql_alloc().
Mark memory used by temporary tables, that are not for slave threads, as MY_THREAD_SPECIFIC
Updated call to init_sql_alloc()
sql/thr_malloc.cc:
Added my_flags argument to init_sql_alloc() to be able to mark memory as MY_THREAD_SPECIFIC.
sql/thr_malloc.h:
Updated prototype for init_sql_alloc()
sql/tztime.cc:
Updated call to init_sql_alloc()
Updated call to init_alloc_root() to mark memory thread specific.
my_pthread_setspecific_ptr(THR_THD,...) -> set_current_thd()
sql/uniques.cc:
Updated calls to init_tree(), my_init_dynamic_array() and my_malloc() to mark memory thread specific.
sql/unireg.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/csv/ha_tina.cc:
Updated call to init_alloc_root()
storage/federated/ha_federated.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
Ensure that memory allocated by fedarated is registered for the system, not for the thread.
storage/federatedx/federatedx_io_mysql.cc:
Updated call to my_init_dynamic_array()
storage/federatedx/ha_federatedx.cc:
Updated call to init_alloc_root()
Updated call to my_init_dynamic_array()
storage/heap/ha_heap.cc:
Added MY_THREAD_SPECIFIC to allocated memory.
storage/heap/heapdef.h:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_block.c:
Added parameter to hp_get_new_block() to be able to do thread specific memory tagging.
storage/heap/hp_create.c:
- Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
- Use MY_TREE_WITH_DELETE instead of removed option 'with_delete'.
storage/heap/hp_open.c:
Internal HEAP tables are now marking it's memory as MY_THREAD_SPECIFIC.
storage/heap/hp_write.c:
Added new parameter to hp_get_new_block()
storage/maria/ma_bitmap.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_blockrec.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_check.c:
Updated call to init_alloc_root()
storage/maria/ma_ft_boolean_search.c:
Updated calls to init_tree() and init_alloc_root()
storage/maria/ma_ft_nlq_search.c:
Updated call to init_tree()
storage/maria/ma_ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/maria/ma_loghandler.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_open.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_sort.c:
Updated call to my_init_dynamic_array()
storage/maria/ma_write.c:
Updated calls to my_init_dynamic_array() and init_tree()
storage/maria/maria_pack.c:
Updated call to init_tree()
storage/maria/unittest/sequence_storage.c:
Updated call to my_init_dynamic_array()
storage/myisam/ft_boolean_search.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_nlq_search.c:
Updated call to init_tree()
storage/myisam/ft_parser.c:
Updated call to init_tree()
Updated call to init_alloc_root()
storage/myisam/ft_stopwords.c:
Updated call to init_tree()
storage/myisam/mi_check.c:
Updated call to init_alloc_root()
storage/myisam/mi_write.c:
Updated call to my_init_dynamic_array()
Updated call to init_tree()
storage/myisam/myisamlog.c:
Updated call to init_tree()
storage/myisam/myisampack.c:
Updated call to init_tree()
storage/myisam/sort.c:
Updated call to my_init_dynamic_array()
storage/myisammrg/ha_myisammrg.cc:
Updated call to init_sql_alloc()
storage/perfschema/pfs_check.cc:
Rest current_thd
storage/perfschema/pfs_instr.cc:
Removed DBUG_ENTER/DBUG_VOID_RETURN as at this point my_thread_var is not allocated anymore, which can cause problems.
support-files/compiler_warnings.supp:
Disable compiler warning from offsetof macro.
2013-01-23 16:16:14 +01:00
|
|
|
/* Allocate memory for structures */
|
|
|
|
void init();
|
|
|
|
void free_memory();
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
private:
|
|
|
|
Warning_info(const Warning_info &rhs); /* Not implemented */
|
|
|
|
Warning_info& operator=(const Warning_info &rhs); /* Not implemented */
|
|
|
|
|
|
|
|
/**
|
|
|
|
Checks if Warning_info contains SQL-condition with the given message.
|
|
|
|
|
|
|
|
@param message_str Message string.
|
|
|
|
@param message_length Length of message string.
|
|
|
|
|
|
|
|
@return true if the Warning_info contains an SQL-condition with the given
|
|
|
|
message.
|
|
|
|
*/
|
|
|
|
bool has_sql_condition(const char *message_str, ulong message_length) const;
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
|
|
|
Reset the warning information. Clear all warnings,
|
|
|
|
the number of warnings, reset current row counter
|
|
|
|
to point to the first row.
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
@param new_id new Warning_info id.
|
2009-09-10 11:18:29 +02:00
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
void clear(ulonglong new_id);
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
|
|
|
Only clear warning info if haven't yet done that already
|
|
|
|
for the current query. Allows to be issued at any time
|
|
|
|
during the query, without risk of clearing some warnings
|
|
|
|
that have been generated by the current statement.
|
|
|
|
|
|
|
|
@todo: This is a sign of sloppy coding. Instead we need to
|
|
|
|
designate one place in a statement life cycle where we call
|
2013-06-15 17:32:08 +02:00
|
|
|
Warning_info::clear().
|
|
|
|
|
|
|
|
@param query_id Current query id.
|
2009-09-10 11:18:29 +02:00
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
void opt_clear(ulonglong query_id)
|
2009-09-10 11:18:29 +02:00
|
|
|
{
|
|
|
|
if (query_id != m_warn_id)
|
2013-06-15 17:32:08 +02:00
|
|
|
clear(query_id);
|
2005-04-01 14:04:50 +02:00
|
|
|
}
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Concatenate the list of warnings.
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
It's considered tolerable to lose an SQL-condition in case of OOM-error,
|
|
|
|
or if the number of SQL-conditions in the Warning_info reached top limit.
|
|
|
|
|
|
|
|
@param thd Thread context.
|
|
|
|
@param source Warning_info object to copy SQL-conditions from.
|
2009-09-10 11:18:29 +02:00
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
void append_warning_info(THD *thd, const Warning_info *source);
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Reset between two COM_ commands. Warnings are preserved
|
|
|
|
between commands, but statement_warn_count indicates
|
|
|
|
the number of warnings of this particular statement only.
|
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
void reset_for_next_command()
|
|
|
|
{ m_current_statement_warn_count= 0; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
Mark active SQL-conditions for later removal.
|
|
|
|
This is done to simulate stacked DAs for HANDLER statements.
|
|
|
|
*/
|
|
|
|
void mark_sql_conditions_for_removal();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Unmark SQL-conditions, which were marked for later removal.
|
|
|
|
This is done to simulate stacked DAs for HANDLER statements.
|
|
|
|
*/
|
|
|
|
void unmark_sql_conditions_from_removal()
|
|
|
|
{ m_marked_sql_conditions.empty(); }
|
|
|
|
|
|
|
|
/**
|
|
|
|
Remove SQL-conditions that are marked for deletion.
|
|
|
|
This is done to simulate stacked DAs for HANDLER statements.
|
|
|
|
*/
|
|
|
|
void remove_marked_sql_conditions();
|
|
|
|
|
|
|
|
/**
|
|
|
|
Check if the given SQL-condition is marked for removal in this Warning_info
|
|
|
|
instance.
|
|
|
|
|
|
|
|
@param cond the SQL-condition.
|
|
|
|
|
|
|
|
@retval true if the given SQL-condition is marked for removal in this
|
|
|
|
Warning_info instance.
|
|
|
|
@retval false otherwise.
|
|
|
|
*/
|
|
|
|
bool is_marked_for_removal(const Sql_condition *cond) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Mark a single SQL-condition for removal (add the given SQL-condition to the
|
|
|
|
removal list of this Warning_info instance).
|
|
|
|
*/
|
|
|
|
void mark_condition_for_removal(Sql_condition *cond)
|
|
|
|
{ m_marked_sql_conditions.push_back(cond, &m_warn_root); }
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Used for @@warning_count system variable, which prints
|
|
|
|
the number of rows returned by SHOW WARNINGS.
|
|
|
|
*/
|
|
|
|
ulong warn_count() const
|
|
|
|
{
|
|
|
|
/*
|
2013-06-15 17:32:08 +02:00
|
|
|
This may be higher than warn_list.elements() if we have
|
2009-09-10 11:18:29 +02:00
|
|
|
had more warnings than thd->variables.max_error_count.
|
|
|
|
*/
|
2013-06-15 17:32:08 +02:00
|
|
|
return (m_warn_count[(uint) Sql_condition::WARN_LEVEL_NOTE] +
|
|
|
|
m_warn_count[(uint) Sql_condition::WARN_LEVEL_ERROR] +
|
|
|
|
m_warn_count[(uint) Sql_condition::WARN_LEVEL_WARN]);
|
2009-09-10 11:18:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
The number of errors, or number of rows returned by SHOW ERRORS,
|
|
|
|
also the value of session variable @@error_count.
|
|
|
|
*/
|
|
|
|
ulong error_count() const
|
2013-06-15 17:32:08 +02:00
|
|
|
{ return m_warn_count[(uint) Sql_condition::WARN_LEVEL_ERROR]; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
The number of conditions (errors, warnings and notes) in the list.
|
|
|
|
*/
|
|
|
|
uint cond_count() const
|
2009-09-10 11:18:29 +02:00
|
|
|
{
|
2013-06-15 17:32:08 +02:00
|
|
|
return m_warn_list.elements();
|
2009-09-10 11:18:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Id of the warning information area. */
|
2013-06-15 17:32:08 +02:00
|
|
|
ulonglong id() const { return m_warn_id; }
|
|
|
|
|
|
|
|
/** Set id of the warning information area. */
|
2015-07-06 19:24:14 +02:00
|
|
|
void id(ulonglong id_arg) { m_warn_id= id_arg; }
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/** Do we have any errors and warnings that we can *show*? */
|
2013-06-15 17:32:08 +02:00
|
|
|
bool is_empty() const { return m_warn_list.is_empty(); }
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/** Increment the current row counter to point at the next row. */
|
|
|
|
void inc_current_row_for_warning() { m_current_row_for_warning++; }
|
2013-06-15 17:32:08 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/** Reset the current row counter. Start counting from the first row. */
|
|
|
|
void reset_current_row_for_warning() { m_current_row_for_warning= 1; }
|
2013-06-15 17:32:08 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/** Return the current counter value. */
|
|
|
|
ulong current_row_for_warning() const { return m_current_row_for_warning; }
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/** Return the number of warnings thrown by the current statement. */
|
|
|
|
ulong current_statement_warn_count() const
|
|
|
|
{ return m_current_statement_warn_count; }
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/** Make sure there is room for the given number of conditions. */
|
|
|
|
void reserve_space(THD *thd, uint count);
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/**
|
|
|
|
Add a new SQL-condition to the current list and increment the respective
|
|
|
|
counters.
|
|
|
|
|
|
|
|
@param thd Thread context.
|
|
|
|
@param sql_errno SQL-condition error number.
|
|
|
|
@param sqlstate SQL-condition state.
|
|
|
|
@param level SQL-condition level.
|
|
|
|
@param msg SQL-condition message.
|
|
|
|
|
|
|
|
@return a pointer to the added SQL-condition.
|
|
|
|
*/
|
|
|
|
Sql_condition *push_warning(THD *thd,
|
|
|
|
uint sql_errno,
|
|
|
|
const char* sqlstate,
|
|
|
|
Sql_condition::enum_warning_level level,
|
|
|
|
const char* msg);
|
|
|
|
|
|
|
|
/**
|
|
|
|
Add a new SQL-condition to the current list and increment the respective
|
|
|
|
counters.
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
@param thd Thread context.
|
|
|
|
@param sql_condition SQL-condition to copy values from.
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
@return a pointer to the added SQL-condition.
|
|
|
|
*/
|
|
|
|
Sql_condition *push_warning(THD *thd, const Sql_condition *sql_condition);
|
2011-04-15 14:02:22 +02:00
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
|
|
|
Set the read only status for this statement area.
|
|
|
|
This is a privileged operation, reserved for the implementation of
|
|
|
|
diagnostics related statements, to enforce that the statement area is
|
|
|
|
left untouched during execution.
|
|
|
|
The diagnostics statements are:
|
|
|
|
- SHOW WARNINGS
|
|
|
|
- SHOW ERRORS
|
|
|
|
- GET DIAGNOSTICS
|
2013-06-15 17:32:08 +02:00
|
|
|
@param read_only the read only property to set.
|
2009-09-10 11:18:29 +02:00
|
|
|
*/
|
2015-07-06 19:24:14 +02:00
|
|
|
void set_read_only(bool read_only_arg)
|
|
|
|
{ m_read_only= read_only_arg; }
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Read only status.
|
2013-06-15 17:32:08 +02:00
|
|
|
@return the read only property.
|
2009-09-10 11:18:29 +02:00
|
|
|
*/
|
|
|
|
bool is_read_only() const
|
|
|
|
{ return m_read_only; }
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/**
|
|
|
|
@return SQL-condition, which corresponds to the error state in
|
|
|
|
Diagnostics_area.
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
@see m_error_condition.
|
|
|
|
*/
|
|
|
|
const Sql_condition *get_error_condition() const
|
|
|
|
{ return m_error_condition; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
Set SQL-condition, which corresponds to the error state in Diagnostics_area.
|
|
|
|
|
|
|
|
@see m_error_condition.
|
|
|
|
*/
|
|
|
|
void set_error_condition(const Sql_condition *error_condition)
|
|
|
|
{ m_error_condition= error_condition; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
Reset SQL-condition, which corresponds to the error state in
|
|
|
|
Diagnostics_area.
|
|
|
|
|
|
|
|
@see m_error_condition.
|
|
|
|
*/
|
|
|
|
void clear_error_condition()
|
|
|
|
{ m_error_condition= NULL; }
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
// for:
|
|
|
|
// - m_next_in_da / m_prev_in_da
|
|
|
|
// - is_marked_for_removal()
|
|
|
|
friend class Diagnostics_area;
|
2005-04-01 14:04:50 +02:00
|
|
|
};
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
|
2009-10-15 14:23:43 +02:00
|
|
|
extern char *err_conv(char *buff, uint to_length, const char *from,
|
|
|
|
uint from_length, CHARSET_INFO *from_cs);
|
|
|
|
|
2011-10-19 21:45:18 +02:00
|
|
|
class ErrConv
|
2009-10-15 14:23:43 +02:00
|
|
|
{
|
2011-10-19 21:45:18 +02:00
|
|
|
protected:
|
|
|
|
mutable char err_buffer[MYSQL_ERRMSG_SIZE];
|
2009-10-15 14:23:43 +02:00
|
|
|
public:
|
2011-10-19 21:45:18 +02:00
|
|
|
ErrConv() {}
|
|
|
|
virtual ~ErrConv() {}
|
|
|
|
virtual const char *ptr() const = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
class ErrConvString : public ErrConv
|
|
|
|
{
|
|
|
|
const char *str;
|
|
|
|
size_t len;
|
|
|
|
CHARSET_INFO *cs;
|
|
|
|
public:
|
|
|
|
ErrConvString(const char *str_arg, size_t len_arg, CHARSET_INFO *cs_arg)
|
|
|
|
: ErrConv(), str(str_arg), len(len_arg), cs(cs_arg) {}
|
2013-10-02 13:04:07 +02:00
|
|
|
ErrConvString(const char *str_arg, CHARSET_INFO *cs_arg)
|
|
|
|
: ErrConv(), str(str_arg), len(strlen(str_arg)), cs(cs_arg) {}
|
2015-10-22 07:11:23 +02:00
|
|
|
ErrConvString(const String *s)
|
2011-10-19 21:45:18 +02:00
|
|
|
: ErrConv(), str(s->ptr()), len(s->length()), cs(s->charset()) {}
|
|
|
|
const char *ptr() const
|
|
|
|
{ return err_conv(err_buffer, sizeof(err_buffer), str, len, cs); }
|
|
|
|
};
|
2009-10-15 14:23:43 +02:00
|
|
|
|
2011-10-19 21:45:18 +02:00
|
|
|
class ErrConvInteger : public ErrConv
|
|
|
|
{
|
2014-06-04 19:53:15 +02:00
|
|
|
longlong m_value;
|
|
|
|
bool m_unsigned;
|
2011-10-19 21:45:18 +02:00
|
|
|
public:
|
2014-06-04 19:53:15 +02:00
|
|
|
ErrConvInteger(longlong num_arg, bool unsigned_flag= false) :
|
|
|
|
ErrConv(), m_value(num_arg), m_unsigned(unsigned_flag) {}
|
2011-10-19 21:45:18 +02:00
|
|
|
const char *ptr() const
|
2005-04-01 14:04:50 +02:00
|
|
|
{
|
2014-06-04 19:53:15 +02:00
|
|
|
return m_unsigned ? ullstr(m_value, err_buffer) :
|
|
|
|
llstr(m_value, err_buffer);
|
2005-04-01 14:04:50 +02:00
|
|
|
}
|
2011-10-19 21:45:18 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class ErrConvDouble: public ErrConv
|
|
|
|
{
|
|
|
|
double num;
|
|
|
|
public:
|
|
|
|
ErrConvDouble(double num_arg) : ErrConv(), num(num_arg) {}
|
|
|
|
const char *ptr() const
|
2009-10-15 14:23:43 +02:00
|
|
|
{
|
2011-10-19 21:45:18 +02:00
|
|
|
my_gcvt(num, MY_GCVT_ARG_DOUBLE, sizeof(err_buffer), err_buffer, 0);
|
|
|
|
return err_buffer;
|
2009-10-15 14:23:43 +02:00
|
|
|
}
|
2011-10-19 21:45:18 +02:00
|
|
|
};
|
2009-10-15 14:23:43 +02:00
|
|
|
|
2011-10-19 21:45:18 +02:00
|
|
|
class ErrConvTime : public ErrConv
|
|
|
|
{
|
|
|
|
const MYSQL_TIME *ltime;
|
|
|
|
public:
|
|
|
|
ErrConvTime(const MYSQL_TIME *ltime_arg) : ErrConv(), ltime(ltime_arg) {}
|
|
|
|
const char *ptr() const
|
2009-10-15 14:23:43 +02:00
|
|
|
{
|
2011-10-19 21:45:18 +02:00
|
|
|
my_TIME_to_str(ltime, err_buffer, AUTO_SEC_PART_DIGITS);
|
|
|
|
return err_buffer;
|
2009-10-15 14:23:43 +02:00
|
|
|
}
|
2011-10-19 21:45:18 +02:00
|
|
|
};
|
2009-10-15 14:23:43 +02:00
|
|
|
|
2011-10-19 21:45:18 +02:00
|
|
|
class ErrConvDecimal : public ErrConv
|
|
|
|
{
|
|
|
|
const decimal_t *d;
|
|
|
|
public:
|
|
|
|
ErrConvDecimal(const decimal_t *d_arg) : ErrConv(), d(d_arg) {}
|
|
|
|
const char *ptr() const
|
2009-10-15 14:23:43 +02:00
|
|
|
{
|
2011-10-19 21:45:18 +02:00
|
|
|
int len= sizeof(err_buffer);
|
|
|
|
decimal2string(d, err_buffer, &len, 0, 0, ' ');
|
|
|
|
return err_buffer;
|
2009-10-15 14:23:43 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
/**
|
|
|
|
Stores status of the currently executed statement.
|
|
|
|
Cleared at the beginning of the statement, and then
|
|
|
|
can hold either OK, ERROR, or EOF status.
|
|
|
|
Can not be assigned twice per statement.
|
|
|
|
*/
|
|
|
|
|
|
|
|
class Diagnostics_area
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
/** The type of the counted and doubly linked list of conditions. */
|
|
|
|
typedef I_P_List<Warning_info,
|
|
|
|
I_P_List_adapter<Warning_info,
|
|
|
|
&Warning_info::m_next_in_da,
|
|
|
|
&Warning_info::m_prev_in_da>,
|
|
|
|
I_P_List_counter,
|
|
|
|
I_P_List_fast_push_back<Warning_info> >
|
|
|
|
Warning_info_list;
|
|
|
|
|
|
|
|
public:
|
|
|
|
/** Const iterator used to iterate through the warning list. */
|
|
|
|
typedef Warning_info::Sql_condition_list::Const_Iterator
|
|
|
|
Sql_condition_iterator;
|
|
|
|
|
|
|
|
enum enum_diagnostics_status
|
|
|
|
{
|
|
|
|
/** The area is cleared at start of a statement. */
|
|
|
|
DA_EMPTY= 0,
|
|
|
|
/** Set whenever one calls my_ok(). */
|
|
|
|
DA_OK,
|
|
|
|
/** Set whenever one calls my_eof(). */
|
|
|
|
DA_EOF,
|
2016-06-29 20:03:06 +02:00
|
|
|
/** Set whenever one calls my_ok() in PS bulk mode. */
|
|
|
|
DA_OK_BULK,
|
2013-06-15 17:32:08 +02:00
|
|
|
/** Set whenever one calls my_error() or my_message(). */
|
|
|
|
DA_ERROR,
|
|
|
|
/** Set in case of a custom response, such as one from COM_STMT_PREPARE. */
|
|
|
|
DA_DISABLED
|
|
|
|
};
|
|
|
|
|
|
|
|
void set_overwrite_status(bool can_overwrite_status)
|
|
|
|
{ m_can_overwrite_status= can_overwrite_status; }
|
|
|
|
|
|
|
|
/** True if status information is sent to the client. */
|
|
|
|
bool is_sent() const { return m_is_sent; }
|
|
|
|
|
2015-07-06 19:24:14 +02:00
|
|
|
void set_is_sent(bool is_sent_arg) { m_is_sent= is_sent_arg; }
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
void set_ok_status(ulonglong affected_rows,
|
|
|
|
ulonglong last_insert_id,
|
|
|
|
const char *message);
|
|
|
|
|
|
|
|
void set_eof_status(THD *thd);
|
|
|
|
|
|
|
|
void set_error_status(uint sql_errno);
|
|
|
|
|
|
|
|
void set_error_status(uint sql_errno,
|
|
|
|
const char *message,
|
|
|
|
const char *sqlstate,
|
|
|
|
const Sql_condition *error_condition);
|
|
|
|
|
|
|
|
void disable_status();
|
|
|
|
|
|
|
|
void reset_diagnostics_area();
|
|
|
|
|
|
|
|
bool is_set() const { return m_status != DA_EMPTY; }
|
|
|
|
|
|
|
|
bool is_error() const { return m_status == DA_ERROR; }
|
|
|
|
|
|
|
|
bool is_eof() const { return m_status == DA_EOF; }
|
|
|
|
|
|
|
|
bool is_ok() const { return m_status == DA_OK; }
|
|
|
|
|
|
|
|
bool is_disabled() const { return m_status == DA_DISABLED; }
|
|
|
|
|
2016-06-29 20:03:06 +02:00
|
|
|
void set_bulk_execution(bool bulk) { is_bulk_execution= bulk; }
|
|
|
|
|
|
|
|
bool is_bulk_op() const { return is_bulk_execution; }
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
enum_diagnostics_status status() const { return m_status; }
|
|
|
|
|
|
|
|
const char *message() const
|
2016-06-29 20:03:06 +02:00
|
|
|
{ DBUG_ASSERT(m_status == DA_ERROR || m_status == DA_OK ||
|
|
|
|
m_status == DA_OK_BULK); return m_message; }
|
2013-06-15 17:32:08 +02:00
|
|
|
|
2016-05-09 15:26:18 +02:00
|
|
|
bool skip_flush() const
|
2016-06-29 20:03:06 +02:00
|
|
|
{
|
|
|
|
DBUG_ASSERT(m_status == DA_OK || m_status == DA_OK_BULK);
|
|
|
|
return m_skip_flush;
|
|
|
|
}
|
2016-05-09 15:26:18 +02:00
|
|
|
|
|
|
|
void set_skip_flush()
|
|
|
|
{ m_skip_flush= TRUE; }
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
uint sql_errno() const
|
|
|
|
{ DBUG_ASSERT(m_status == DA_ERROR); return m_sql_errno; }
|
|
|
|
|
|
|
|
const char* get_sqlstate() const
|
|
|
|
{ DBUG_ASSERT(m_status == DA_ERROR); return m_sqlstate; }
|
|
|
|
|
|
|
|
ulonglong affected_rows() const
|
2016-06-29 20:03:06 +02:00
|
|
|
{
|
|
|
|
DBUG_ASSERT(m_status == DA_OK || m_status == DA_OK_BULK);
|
|
|
|
return m_affected_rows;
|
|
|
|
}
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
ulonglong last_insert_id() const
|
2016-06-29 20:03:06 +02:00
|
|
|
{
|
|
|
|
DBUG_ASSERT(m_status == DA_OK || m_status == DA_OK_BULK);
|
|
|
|
return m_last_insert_id;
|
|
|
|
}
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
uint statement_warn_count() const
|
|
|
|
{
|
2016-06-29 20:03:06 +02:00
|
|
|
DBUG_ASSERT(m_status == DA_OK || m_status == DA_OK_BULK ||
|
|
|
|
m_status == DA_EOF);
|
2013-06-15 17:32:08 +02:00
|
|
|
return m_statement_warn_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Used to count any warnings pushed after calling set_ok_status(). */
|
|
|
|
void increment_warning()
|
|
|
|
{
|
|
|
|
if (m_status != DA_EMPTY)
|
|
|
|
m_statement_warn_count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
Diagnostics_area(bool initialize);
|
2013-06-19 21:57:46 +02:00
|
|
|
Diagnostics_area(ulonglong warning_info_id, bool allow_unlimited_warnings,
|
|
|
|
bool initialize);
|
2013-06-15 17:32:08 +02:00
|
|
|
void init() { m_main_wi.init() ; }
|
|
|
|
void free_memory() { m_main_wi.free_memory() ; }
|
|
|
|
|
|
|
|
void push_warning_info(Warning_info *wi)
|
|
|
|
{ m_wi_stack.push_front(wi); }
|
|
|
|
|
|
|
|
void pop_warning_info()
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(m_wi_stack.elements() > 0);
|
|
|
|
m_wi_stack.remove(m_wi_stack.front());
|
|
|
|
}
|
|
|
|
|
|
|
|
void set_warning_info_id(ulonglong id)
|
|
|
|
{ get_warning_info()->id(id); }
|
|
|
|
|
|
|
|
ulonglong warning_info_id() const
|
|
|
|
{ return get_warning_info()->id(); }
|
|
|
|
|
|
|
|
/**
|
|
|
|
Compare given current warning info and current warning info
|
|
|
|
and see if they are different. They will be different if
|
|
|
|
warnings have been generated or statements that use tables
|
|
|
|
have been executed. This is checked by comparing m_warn_id.
|
|
|
|
|
|
|
|
@param wi Warning info to compare with current Warning info.
|
|
|
|
|
|
|
|
@return false if they are equal, true if they are not.
|
|
|
|
*/
|
|
|
|
bool warning_info_changed(const Warning_info *wi) const
|
|
|
|
{ return get_warning_info()->id() != wi->id(); }
|
|
|
|
|
|
|
|
bool is_warning_info_empty() const
|
|
|
|
{ return get_warning_info()->is_empty(); }
|
|
|
|
|
|
|
|
ulong current_statement_warn_count() const
|
|
|
|
{ return get_warning_info()->current_statement_warn_count(); }
|
|
|
|
|
|
|
|
bool has_sql_condition(const char *message_str, ulong message_length) const
|
|
|
|
{ return get_warning_info()->has_sql_condition(message_str, message_length); }
|
|
|
|
|
|
|
|
void reset_for_next_command()
|
|
|
|
{ get_warning_info()->reset_for_next_command(); }
|
|
|
|
|
|
|
|
void clear_warning_info(ulonglong id)
|
|
|
|
{ get_warning_info()->clear(id); }
|
|
|
|
|
|
|
|
void opt_clear_warning_info(ulonglong query_id)
|
|
|
|
{ get_warning_info()->opt_clear(query_id); }
|
|
|
|
|
|
|
|
ulong current_row_for_warning() const
|
|
|
|
{ return get_warning_info()->current_row_for_warning(); }
|
|
|
|
|
|
|
|
void inc_current_row_for_warning()
|
|
|
|
{ get_warning_info()->inc_current_row_for_warning(); }
|
|
|
|
|
|
|
|
void reset_current_row_for_warning()
|
|
|
|
{ get_warning_info()->reset_current_row_for_warning(); }
|
|
|
|
|
|
|
|
bool is_warning_info_read_only() const
|
|
|
|
{ return get_warning_info()->is_read_only(); }
|
|
|
|
|
2015-07-06 19:24:14 +02:00
|
|
|
void set_warning_info_read_only(bool read_only_arg)
|
|
|
|
{ get_warning_info()->set_read_only(read_only_arg); }
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
ulong error_count() const
|
|
|
|
{ return get_warning_info()->error_count(); }
|
|
|
|
|
|
|
|
ulong warn_count() const
|
|
|
|
{ return get_warning_info()->warn_count(); }
|
|
|
|
|
|
|
|
uint cond_count() const
|
|
|
|
{ return get_warning_info()->cond_count(); }
|
|
|
|
|
|
|
|
Sql_condition_iterator sql_conditions() const
|
|
|
|
{ return get_warning_info()->m_warn_list; }
|
|
|
|
|
|
|
|
void reserve_space(THD *thd, uint count)
|
|
|
|
{ get_warning_info()->reserve_space(thd, count); }
|
|
|
|
|
|
|
|
Sql_condition *push_warning(THD *thd, const Sql_condition *sql_condition)
|
|
|
|
{ return get_warning_info()->push_warning(thd, sql_condition); }
|
|
|
|
|
|
|
|
Sql_condition *push_warning(THD *thd,
|
2015-07-06 19:24:14 +02:00
|
|
|
uint sql_errno_arg,
|
2013-06-15 17:32:08 +02:00
|
|
|
const char* sqlstate,
|
|
|
|
Sql_condition::enum_warning_level level,
|
|
|
|
const char* msg)
|
|
|
|
{
|
|
|
|
return get_warning_info()->push_warning(thd,
|
2015-07-06 19:24:14 +02:00
|
|
|
sql_errno_arg, sqlstate, level,
|
|
|
|
msg);
|
2013-06-15 17:32:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void mark_sql_conditions_for_removal()
|
|
|
|
{ get_warning_info()->mark_sql_conditions_for_removal(); }
|
|
|
|
|
|
|
|
void unmark_sql_conditions_from_removal()
|
|
|
|
{ get_warning_info()->unmark_sql_conditions_from_removal(); }
|
|
|
|
|
|
|
|
void remove_marked_sql_conditions()
|
|
|
|
{ get_warning_info()->remove_marked_sql_conditions(); }
|
|
|
|
|
|
|
|
const Sql_condition *get_error_condition() const
|
|
|
|
{ return get_warning_info()->get_error_condition(); }
|
|
|
|
|
|
|
|
void copy_sql_conditions_to_wi(THD *thd, Warning_info *dst_wi) const
|
|
|
|
{ dst_wi->append_warning_info(thd, get_warning_info()); }
|
|
|
|
|
|
|
|
void copy_sql_conditions_from_wi(THD *thd, const Warning_info *src_wi)
|
|
|
|
{ get_warning_info()->append_warning_info(thd, src_wi); }
|
|
|
|
|
|
|
|
void copy_non_errors_from_wi(THD *thd, const Warning_info *src_wi);
|
|
|
|
|
|
|
|
private:
|
|
|
|
Warning_info *get_warning_info() { return m_wi_stack.front(); }
|
|
|
|
|
|
|
|
const Warning_info *get_warning_info() const { return m_wi_stack.front(); }
|
|
|
|
|
|
|
|
private:
|
|
|
|
/** True if status information is sent to the client. */
|
|
|
|
bool m_is_sent;
|
|
|
|
|
|
|
|
/** Set to make set_error_status after set_{ok,eof}_status possible. */
|
|
|
|
bool m_can_overwrite_status;
|
|
|
|
|
2016-05-09 15:26:18 +02:00
|
|
|
/** Skip flushing network buffer after writing OK (for COM_MULTI) */
|
|
|
|
bool m_skip_flush;
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/** Message buffer. Can be used by OK or ERROR status. */
|
|
|
|
char m_message[MYSQL_ERRMSG_SIZE];
|
|
|
|
|
|
|
|
/**
|
|
|
|
SQL error number. One of ER_ codes from share/errmsg.txt.
|
|
|
|
Set by set_error_status.
|
|
|
|
*/
|
|
|
|
uint m_sql_errno;
|
|
|
|
|
|
|
|
char m_sqlstate[SQLSTATE_LENGTH+1];
|
|
|
|
|
|
|
|
/**
|
|
|
|
The number of rows affected by the last statement. This is
|
2014-11-29 19:49:42 +01:00
|
|
|
semantically close to thd->m_row_count_func, but has a different
|
|
|
|
life cycle. thd->m_row_count_func stores the value returned by
|
2013-06-15 17:32:08 +02:00
|
|
|
function ROW_COUNT() and is cleared only by statements that
|
|
|
|
update its value, such as INSERT, UPDATE, DELETE and few others.
|
|
|
|
This member is cleared at the beginning of the next statement.
|
|
|
|
|
2014-11-29 19:49:42 +01:00
|
|
|
We could possibly merge the two, but life cycle of thd->m_row_count_func
|
2013-06-15 17:32:08 +02:00
|
|
|
can not be changed.
|
|
|
|
*/
|
|
|
|
ulonglong m_affected_rows;
|
|
|
|
|
|
|
|
/**
|
|
|
|
Similarly to the previous member, this is a replacement of
|
|
|
|
thd->first_successful_insert_id_in_prev_stmt, which is used
|
|
|
|
to implement LAST_INSERT_ID().
|
|
|
|
*/
|
|
|
|
|
|
|
|
ulonglong m_last_insert_id;
|
|
|
|
/**
|
|
|
|
Number of warnings of this last statement. May differ from
|
|
|
|
the number of warnings returned by SHOW WARNINGS e.g. in case
|
|
|
|
the statement doesn't clear the warnings, and doesn't generate
|
|
|
|
them.
|
|
|
|
*/
|
|
|
|
uint m_statement_warn_count;
|
|
|
|
|
|
|
|
enum_diagnostics_status m_status;
|
|
|
|
|
2016-06-29 20:03:06 +02:00
|
|
|
my_bool is_bulk_execution;
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
Warning_info m_main_wi;
|
|
|
|
|
|
|
|
Warning_info_list m_wi_stack;
|
|
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
void push_warning(THD *thd, Sql_condition::enum_warning_level level,
|
2009-09-10 11:18:29 +02:00
|
|
|
uint code, const char *msg);
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
void push_warning_printf(THD *thd, Sql_condition::enum_warning_level level,
|
|
|
|
uint code, const char *format, ...);
|
|
|
|
|
2005-04-01 14:04:50 +02:00
|
|
|
bool mysqld_show_warnings(THD *thd, ulong levels_to_show);
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
uint32 convert_error_message(char *to, uint32 to_length,
|
|
|
|
CHARSET_INFO *to_cs,
|
2009-10-15 14:23:43 +02:00
|
|
|
const char *from, uint32 from_length,
|
|
|
|
CHARSET_INFO *from_cs, uint *errors);
|
fix for bug #17619 Scheduler race conditions
- Scheduler is either initialized at server start or never.
Starting & stopping is now suspending & resuming.
- The scheduler has clear OO interface
- Now all calls to the scheduler are synchronous
- GLOBAL event_scheduler uses thd::sys_var_tmp (see set_var.cc)
- External API is encapsulated into class Events
- Includes fixes for all comments of Kostja's review of 19.05.2005
Starting to merge into 5.1-release (5.1.10) and push
BitKeeper/etc/ignore:
Added libmysqld/event_scheduler.cc to the ignore list
libmysqld/Makefile.am:
executor -> scheduler
mysql-test/r/events.result:
update result
mysql-test/r/events_bugs.result:
update result
mysql-test/r/events_logs_tests.result:
update result
mysql-test/r/events_microsec.result:
update result
mysql-test/r/events_scheduling.result:
update result
mysql-test/r/events_stress.result:
update result
mysql-test/t/disabled.def:
enable these tests
mysql-test/t/events.test:
optimize the test a bit for speed, save some seconds runtime
remove FULL from SHOW EVENTS
mostly use I_S.EVENTS
mysql-test/t/events_bugs.test:
Skip irrelevant for the current design tests - all events are loaded
on server startup. Change in mysql.event will be visible on next server start.
Don't use numeric error codes.
mysql-test/t/events_logs_tests.test:
optimize the test a bit for speed
mysql-test/t/events_microsec.test:
Skip irrelevant for the current design tests - all events are loaded
on server startup. Change in mysql.event will be visible on next server start.
Don't use numeric error codes.
mysql-test/t/events_scheduling.test:
broader test
mysql-test/t/events_stress.test:
Rework the test to the new architecture of suspending/resuming.
Use less events, no need for thousands, hundreds is still ok.
sql/Makefile.am:
executor -> scheduler
sql/cmakelists.txt:
executor -> scheduler
sql/event.cc:
- remove todo comments
- remove unneded evex_queue abstraction functions
- move events_init() and events_shutdown() from event_executor.cc to here
- export db_create_event
- remove evex_load_and_compile_event, part of class Event_scheduler
- integrate the public interface found in event.h and used by sql_parse.cc
to use the new class Event_scheduler.
sql/event.h:
- add COND_finished so if one thread kills a running event it waits on this
- export callback event_timed_definer_equal, event_timed_identifier_equal(),
event_timed_name_equal and event_timed_db_equal()
to be used by Event_scheduler::drop_matching_events()
- cleanup event.h
- encapsulated all external interface into class Events
sql/event_executor.cc:
make it empty, will delete after that
sql/event_priv.h:
- more things in the private header
- remove event queue abstraction functions. tightly bind to QUEUE
- export privately db_drop_event, db_find_event, db_create_event()
- made change_security_context() and restore_security_context() free functions
sql/event_timed.cc:
- fix calculation of time when ENDS is set (STARTS is always set)
- during Event_timed::compile() set the right Security_ctx. Prevents a crash
during Event_scheduler::load_events_from_db()
- add Event_timed::kill_thread()
- implement event_timed_*_equal()
- made change_security_context() and restore_security_context() free functions.
- Comments cleanups
sql/lex.h:
new word scheduler for SHOW SCHEDULER STATUS (available only debug builds)
sql/log.cc:
move these from event_scheduler.cc
sql/mysql_priv.h:
refactor kill_one_thread
export sql_print_message_func and sql_print_message_handlers
sql/mysqld.cc:
In close_connections, called by kill_server() skip the main scheduler
thread and use events_shutdown() for shutting down the scheduler, in the same
manner it's done for RPL.
Add a new value to --event-scheduler :
0 <- No scheduler available
1 <- Start with scheduler enabled
2 <- Start with scheduler suspended
sql/repl_failsafe.cc:
refactor thd::system_thread to be an enum
sql/set_var.cc:
move sys_var_event_executor::update() to set_var.cc
executor -> scheduler
use thd::sys_var_tmp
sql/set_var.h:
executor -> scheduler
sql/share/errmsg.txt:
3 new error messages
sql/sql_class.cc:
refactor thd::system_thread to be an enum . more type-safety
sql/sql_class.h:
refactor thd::system_thread to be an enum . more type-safety
sql/sql_db.cc:
get the error from evex_drop_schema_events
sql/sql_error.h:
export warning_level_names
sql/sql_lex.h:
new command SHOW SCHEDULER STATUS, available only in debug build and
for debug purposes.
sql/sql_parse.cc:
refactor kill_one_thread() -> does the *dirty* work, and sql_kill
just the reporting.
add handler for SQLCOM_SHOW_SCHEDULER_STATUS
sql/sql_show.cc:
fix verbosity handling (this will be obsoleted anyway by the fix for 17394).
sql/sql_yacc.yy:
remove FULL from SHOW EVENTS
add SHOW SCHEDULER STATUS in debug builds
sql/table.cc:
Fix valgrind warning.
2006-05-22 20:46:13 +02:00
|
|
|
|
2006-08-17 18:13:45 +02:00
|
|
|
extern const LEX_STRING warning_level_names[];
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
bool is_sqlstate_valid(const LEX_STRING *sqlstate);
|
|
|
|
/**
|
|
|
|
Checks if the specified SQL-state-string defines COMPLETION condition.
|
|
|
|
This function assumes that the given string contains a valid SQL-state.
|
|
|
|
|
|
|
|
@param s the condition SQLSTATE.
|
|
|
|
|
|
|
|
@retval true if the given string defines COMPLETION condition.
|
|
|
|
@retval false otherwise.
|
|
|
|
*/
|
|
|
|
inline bool is_sqlstate_completion(const char *s)
|
|
|
|
{ return s[0] == '0' && s[1] == '0'; }
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Checks if the specified SQL-state-string defines WARNING condition.
|
|
|
|
This function assumes that the given string contains a valid SQL-state.
|
|
|
|
|
|
|
|
@param s the condition SQLSTATE.
|
|
|
|
|
|
|
|
@retval true if the given string defines WARNING condition.
|
|
|
|
@retval false otherwise.
|
|
|
|
*/
|
|
|
|
inline bool is_sqlstate_warning(const char *s)
|
|
|
|
{ return s[0] == '0' && s[1] == '1'; }
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Checks if the specified SQL-state-string defines NOT FOUND condition.
|
|
|
|
This function assumes that the given string contains a valid SQL-state.
|
|
|
|
|
|
|
|
@param s the condition SQLSTATE.
|
|
|
|
|
|
|
|
@retval true if the given string defines NOT FOUND condition.
|
|
|
|
@retval false otherwise.
|
|
|
|
*/
|
|
|
|
inline bool is_sqlstate_not_found(const char *s)
|
|
|
|
{ return s[0] == '0' && s[1] == '2'; }
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Checks if the specified SQL-state-string defines EXCEPTION condition.
|
|
|
|
This function assumes that the given string contains a valid SQL-state.
|
|
|
|
|
|
|
|
@param s the condition SQLSTATE.
|
|
|
|
|
|
|
|
@retval true if the given string defines EXCEPTION condition.
|
|
|
|
@retval false otherwise.
|
|
|
|
*/
|
|
|
|
inline bool is_sqlstate_exception(const char *s)
|
|
|
|
{ return s[0] != '0' || s[1] > '2'; }
|
|
|
|
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
#endif // SQL_ERROR_H
|