2011-04-15 14:02:22 +02:00
|
|
|
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
2017-03-01 07:27:39 +01:00
|
|
|
Copyright (c) 2017, MariaDB Corporation.
|
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
|
2019-05-11 20:29:06 +02:00
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 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
|
|
|
|
|
2017-06-18 07:43:55 +02:00
|
|
|
#include "sql_list.h" /* Sql_alloc, MEM_ROOT, list */
|
2018-09-20 14:02:58 +02:00
|
|
|
#include "sql_type_int.h" // Longlong_hybrid
|
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;
|
2016-10-14 14:52:33 +02:00
|
|
|
class sp_condition_value;
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2016-10-12 16:16:38 +02:00
|
|
|
class Sql_state
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
/**
|
|
|
|
This member is always NUL terminated.
|
|
|
|
*/
|
|
|
|
char m_sqlstate[SQLSTATE_LENGTH + 1];
|
|
|
|
public:
|
|
|
|
Sql_state()
|
|
|
|
{
|
|
|
|
memset(m_sqlstate, 0, sizeof(m_sqlstate));
|
|
|
|
}
|
|
|
|
|
|
|
|
Sql_state(const char *sqlstate)
|
|
|
|
{
|
|
|
|
set_sqlstate(sqlstate);
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* get_sqlstate() const
|
|
|
|
{ return m_sqlstate; }
|
|
|
|
|
|
|
|
void set_sqlstate(const Sql_state *other)
|
|
|
|
{
|
|
|
|
*this= *other;
|
|
|
|
}
|
|
|
|
void set_sqlstate(const char *sqlstate)
|
|
|
|
{
|
|
|
|
memcpy(m_sqlstate, sqlstate, SQLSTATE_LENGTH);
|
|
|
|
m_sqlstate[SQLSTATE_LENGTH]= '\0';
|
|
|
|
}
|
|
|
|
bool eq(const Sql_state *other) const
|
|
|
|
{
|
|
|
|
return strcmp(m_sqlstate, other->m_sqlstate) == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool has_sql_state() const { return m_sqlstate[0] != '\0'; }
|
|
|
|
|
|
|
|
/**
|
|
|
|
Checks if this SQL state defines a WARNING condition.
|
|
|
|
Note: m_sqlstate must contain a valid SQL-state.
|
|
|
|
|
|
|
|
@retval true if this SQL state defines a WARNING condition.
|
|
|
|
@retval false otherwise.
|
|
|
|
*/
|
|
|
|
inline bool is_warning() const
|
|
|
|
{ return m_sqlstate[0] == '0' && m_sqlstate[1] == '1'; }
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Checks if this SQL state defines a NOT FOUND condition.
|
|
|
|
Note: m_sqlstate must contain a valid SQL-state.
|
|
|
|
|
|
|
|
@retval true if this SQL state defines a NOT FOUND condition.
|
|
|
|
@retval false otherwise.
|
|
|
|
*/
|
|
|
|
inline bool is_not_found() const
|
|
|
|
{ return m_sqlstate[0] == '0' && m_sqlstate[1] == '2'; }
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Checks if this SQL state defines an EXCEPTION condition.
|
|
|
|
Note: m_sqlstate must contain a valid SQL-state.
|
|
|
|
|
|
|
|
@retval true if this SQL state defines an EXCEPTION condition.
|
|
|
|
@retval false otherwise.
|
|
|
|
*/
|
|
|
|
inline bool is_exception() const
|
|
|
|
{ return m_sqlstate[0] != '0' || m_sqlstate[1] > '2'; }
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class Sql_state_errno: public Sql_state
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
/**
|
|
|
|
MySQL extension, MYSQL_ERRNO condition item.
|
|
|
|
SQL error number. One of ER_ codes from share/errmsg.txt.
|
|
|
|
Set by set_error_status.
|
|
|
|
*/
|
|
|
|
uint m_sql_errno;
|
|
|
|
|
|
|
|
public:
|
|
|
|
Sql_state_errno()
|
|
|
|
:m_sql_errno(0)
|
|
|
|
{ }
|
|
|
|
Sql_state_errno(uint sql_errno)
|
|
|
|
:m_sql_errno(sql_errno)
|
|
|
|
{ }
|
|
|
|
Sql_state_errno(uint sql_errno, const char *sql_state)
|
|
|
|
:Sql_state(sql_state),
|
|
|
|
m_sql_errno(sql_errno)
|
|
|
|
{ }
|
|
|
|
/**
|
|
|
|
Get the SQL_ERRNO of this condition.
|
|
|
|
@return the sql error number condition item.
|
|
|
|
*/
|
|
|
|
uint get_sql_errno() const
|
|
|
|
{ return m_sql_errno; }
|
|
|
|
|
2016-10-14 14:52:33 +02:00
|
|
|
void set(uint sql_errno, const char *sqlstate)
|
2016-10-12 16:16:38 +02:00
|
|
|
{
|
|
|
|
m_sql_errno= sql_errno;
|
|
|
|
set_sqlstate(sqlstate);
|
|
|
|
}
|
2016-10-13 16:19:58 +02:00
|
|
|
void clear()
|
|
|
|
{
|
|
|
|
m_sql_errno= 0;
|
|
|
|
}
|
2016-10-12 16:16:38 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class Sql_state_errno_level: public Sql_state_errno
|
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
|
|
|
|
2016-10-12 16:16:38 +02:00
|
|
|
protected:
|
|
|
|
/** Severity (error, warning, note) of this condition. */
|
|
|
|
enum_warning_level m_level;
|
|
|
|
|
|
|
|
void assign_defaults(const Sql_state_errno *value);
|
|
|
|
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
Get the error level of this condition.
|
|
|
|
@return the error level condition item.
|
|
|
|
*/
|
|
|
|
enum_warning_level get_level() const
|
|
|
|
{ return m_level; }
|
|
|
|
|
|
|
|
Sql_state_errno_level()
|
|
|
|
:m_level(WARN_LEVEL_ERROR)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
Sql_state_errno_level(uint sqlerrno, const char* sqlstate,
|
|
|
|
enum_warning_level level)
|
|
|
|
:Sql_state_errno(sqlerrno, sqlstate),
|
|
|
|
m_level(level)
|
|
|
|
{ }
|
2016-10-13 16:19:58 +02:00
|
|
|
Sql_state_errno_level(const Sql_state_errno &state_errno,
|
|
|
|
enum_warning_level level)
|
|
|
|
:Sql_state_errno(state_errno),
|
|
|
|
m_level(level)
|
|
|
|
{ }
|
|
|
|
void clear()
|
|
|
|
{
|
|
|
|
m_level= WARN_LEVEL_ERROR;
|
|
|
|
Sql_state_errno::clear();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-10-14 14:52:33 +02:00
|
|
|
/*
|
|
|
|
class Sql_user_condition_identity.
|
|
|
|
Instances of this class uniquely idetify user defined conditions (EXCEPTION).
|
|
|
|
|
|
|
|
SET sql_mode=ORACLE;
|
|
|
|
CREATE PROCEDURE p1
|
|
|
|
AS
|
|
|
|
a EXCEPTION;
|
|
|
|
BEGIN
|
|
|
|
RAISE a;
|
|
|
|
EXCEPTION
|
|
|
|
WHEN a THEN NULL;
|
|
|
|
END;
|
|
|
|
|
|
|
|
Currently a user defined condition is identified by a pointer to
|
|
|
|
its parse time sp_condition_value instance. This can change when
|
|
|
|
we add packages. See MDEV-10591.
|
|
|
|
*/
|
|
|
|
class Sql_user_condition_identity
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
const sp_condition_value *m_user_condition_value;
|
|
|
|
public:
|
|
|
|
Sql_user_condition_identity()
|
|
|
|
:m_user_condition_value(NULL)
|
|
|
|
{ }
|
|
|
|
Sql_user_condition_identity(const sp_condition_value *value)
|
|
|
|
:m_user_condition_value(value)
|
|
|
|
{ }
|
|
|
|
const sp_condition_value *get_user_condition_value() const
|
|
|
|
{ return m_user_condition_value; }
|
|
|
|
|
|
|
|
void set(const Sql_user_condition_identity &identity)
|
|
|
|
{
|
|
|
|
*this= identity;
|
|
|
|
}
|
|
|
|
void clear()
|
|
|
|
{
|
|
|
|
m_user_condition_value= NULL;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
class Sql_condition_identity.
|
|
|
|
Instances of this class uniquely identify conditions
|
|
|
|
(including user-defined exceptions for sql_mode=ORACLE)
|
|
|
|
and store everything that is needed for handler search
|
|
|
|
purposes in sp_pcontext::find_handler().
|
|
|
|
*/
|
|
|
|
class Sql_condition_identity: public Sql_state_errno_level,
|
|
|
|
public Sql_user_condition_identity
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Sql_condition_identity()
|
|
|
|
{ }
|
|
|
|
Sql_condition_identity(const Sql_state_errno_level &st,
|
|
|
|
const Sql_user_condition_identity &ucid)
|
|
|
|
:Sql_state_errno_level(st),
|
|
|
|
Sql_user_condition_identity(ucid)
|
|
|
|
{ }
|
|
|
|
Sql_condition_identity(const Sql_state_errno &st,
|
|
|
|
enum_warning_level level,
|
|
|
|
const Sql_user_condition_identity &ucid)
|
|
|
|
:Sql_state_errno_level(st, level),
|
|
|
|
Sql_user_condition_identity(ucid)
|
|
|
|
{ }
|
|
|
|
Sql_condition_identity(uint sqlerrno,
|
|
|
|
const char* sqlstate,
|
|
|
|
enum_warning_level level,
|
|
|
|
const Sql_user_condition_identity &ucid)
|
|
|
|
:Sql_state_errno_level(sqlerrno, sqlstate, level),
|
|
|
|
Sql_user_condition_identity(ucid)
|
|
|
|
{ }
|
|
|
|
void clear()
|
|
|
|
{
|
|
|
|
Sql_state_errno_level::clear();
|
|
|
|
Sql_user_condition_identity::clear();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-10-13 16:19:58 +02:00
|
|
|
class Sql_condition_items
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
/** 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;
|
|
|
|
|
|
|
|
/** 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;
|
|
|
|
|
2021-09-29 10:48:40 +02:00
|
|
|
/** SQL ROW_NUMBER condition item. */
|
|
|
|
ulong m_row_number;
|
2021-09-15 15:54:49 +02:00
|
|
|
|
2016-10-13 16:19:58 +02:00
|
|
|
Sql_condition_items()
|
2019-06-28 07:05:12 +02:00
|
|
|
:m_class_origin((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
|
|
|
m_subclass_origin((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
|
|
|
m_constraint_catalog((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
|
|
|
m_constraint_schema((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
|
|
|
m_constraint_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
|
|
|
m_catalog_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
|
|
|
m_schema_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
|
|
|
m_table_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
|
|
|
m_column_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
2021-09-15 15:54:49 +02:00
|
|
|
m_cursor_name((const char*) NULL, 0, & my_charset_utf8mb3_bin),
|
2021-09-29 10:48:40 +02:00
|
|
|
m_row_number(0)
|
2016-10-13 16:19:58 +02:00
|
|
|
{ }
|
|
|
|
|
|
|
|
void clear()
|
|
|
|
{
|
|
|
|
m_class_origin.length(0);
|
|
|
|
m_subclass_origin.length(0);
|
|
|
|
m_constraint_catalog.length(0);
|
|
|
|
m_constraint_schema.length(0);
|
|
|
|
m_constraint_name.length(0);
|
|
|
|
m_catalog_name.length(0);
|
|
|
|
m_schema_name.length(0);
|
|
|
|
m_table_name.length(0);
|
|
|
|
m_column_name.length(0);
|
|
|
|
m_cursor_name.length(0);
|
2021-09-29 10:48:40 +02:00
|
|
|
m_row_number= 0;
|
2016-10-13 16:19:58 +02:00
|
|
|
}
|
2016-10-12 16:16:38 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Representation of a SQL condition.
|
|
|
|
A SQL condition can be a completion condition (note, warning),
|
|
|
|
or an exception condition (error, not found).
|
|
|
|
*/
|
2016-10-13 16:19:58 +02:00
|
|
|
class Sql_condition : public Sql_alloc,
|
2016-10-14 14:52:33 +02:00
|
|
|
public Sql_condition_identity,
|
2016-10-13 16:19:58 +02:00
|
|
|
public Sql_condition_items
|
2016-10-12 16:16:38 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2013-08-15 13:24:34 +02:00
|
|
|
/**
|
|
|
|
Convert a bitmask consisting of MYSQL_TIME_{NOTE|WARN}_XXX bits
|
|
|
|
to WARN_LEVEL_XXX
|
|
|
|
*/
|
2017-03-01 07:27:39 +01:00
|
|
|
static enum_warning_level time_warn_level(uint warnings)
|
2013-08-15 13:24:34 +02:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
|
|
|
|
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
|
|
|
*/
|
2016-10-13 16:19:58 +02:00
|
|
|
Sql_condition()
|
|
|
|
:m_mem_root(NULL)
|
2021-09-15 15:54:49 +02:00
|
|
|
{ }
|
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
|
|
|
|
*/
|
2016-10-13 16:19:58 +02:00
|
|
|
void init(MEM_ROOT *mem_root)
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(mem_root != NULL);
|
|
|
|
DBUG_ASSERT(m_mem_root == NULL);
|
|
|
|
m_mem_root= mem_root;
|
|
|
|
}
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
Constructor.
|
|
|
|
@param mem_root The memory root to use for the condition items
|
|
|
|
of this condition
|
|
|
|
*/
|
2016-10-13 16:19:58 +02:00
|
|
|
Sql_condition(MEM_ROOT *mem_root)
|
|
|
|
:m_mem_root(mem_root)
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(mem_root != NULL);
|
|
|
|
}
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2016-10-14 14:52:33 +02:00
|
|
|
Sql_condition(MEM_ROOT *mem_root, const Sql_user_condition_identity &ucid)
|
|
|
|
:Sql_condition_identity(Sql_state_errno_level(), ucid),
|
|
|
|
m_mem_root(mem_root)
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(mem_root != NULL);
|
|
|
|
}
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
2016-10-13 16:19:58 +02:00
|
|
|
Constructor for a fixed message text.
|
|
|
|
@param mem_root - memory root
|
|
|
|
@param value - the error number and the sql state for this condition
|
|
|
|
@param level - the error level for this condition
|
|
|
|
@param msg - the message text for this condition
|
2009-09-10 11:18:29 +02:00
|
|
|
*/
|
2021-09-15 15:54:49 +02:00
|
|
|
Sql_condition(MEM_ROOT *mem_root, const Sql_condition_identity &value,
|
|
|
|
const char *msg, ulong current_row_for_warning)
|
|
|
|
: Sql_condition_identity(value), m_mem_root(mem_root)
|
2016-10-12 16:16:38 +02:00
|
|
|
{
|
2016-10-13 16:19:58 +02:00
|
|
|
DBUG_ASSERT(mem_root != NULL);
|
2016-10-14 14:52:33 +02:00
|
|
|
DBUG_ASSERT(value.get_sql_errno() != 0);
|
2016-10-13 16:19:58 +02:00
|
|
|
DBUG_ASSERT(msg != NULL);
|
|
|
|
set_builtin_message_text(msg);
|
2021-09-29 10:48:40 +02:00
|
|
|
m_row_number= current_row_for_warning;
|
2016-10-12 16:16:38 +02:00
|
|
|
}
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2016-10-13 16:19:58 +02:00
|
|
|
/** Destructor. */
|
|
|
|
~Sql_condition()
|
|
|
|
{}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Copy optional condition items attributes.
|
|
|
|
@param cond the condition to copy.
|
|
|
|
*/
|
|
|
|
void copy_opt_attributes(const Sql_condition *cond);
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
|
|
|
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);
|
|
|
|
|
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();
|
|
|
|
|
2016-10-12 16:16:38 +02:00
|
|
|
/**
|
|
|
|
Assign the condition items 'MYSQL_ERRNO', 'level' and 'MESSAGE_TEXT'
|
|
|
|
default values of a condition.
|
|
|
|
@param thd - current thread, to access to localized error messages
|
|
|
|
@param from - copy condition items from here (can be NULL)
|
|
|
|
*/
|
|
|
|
void assign_defaults(THD *thd, const Sql_state_errno *from);
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
/**
|
|
|
|
Clear this SQL condition.
|
|
|
|
*/
|
2016-10-13 16:19:58 +02:00
|
|
|
void clear()
|
|
|
|
{
|
2016-10-14 14:52:33 +02:00
|
|
|
Sql_condition_identity::clear();
|
2016-10-13 16:19:58 +02:00
|
|
|
Sql_condition_items::clear();
|
|
|
|
m_message_text.length(0);
|
|
|
|
}
|
2009-09-10 11:18:29 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
/** Message text, expressed in the character set implied by --language. */
|
|
|
|
String m_message_text;
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/** 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.
|
|
|
|
*/
|
2018-02-06 13:55:58 +01:00
|
|
|
bool has_sql_condition(const char *message_str, size_t message_length) const;
|
2013-06-15 17:32:08 +02:00
|
|
|
|
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.
|
2016-10-14 14:52:33 +02:00
|
|
|
@param identity SQL-condition identity
|
2013-06-15 17:32:08 +02:00
|
|
|
@param msg SQL-condition message.
|
|
|
|
|
|
|
|
@return a pointer to the added SQL-condition.
|
|
|
|
*/
|
|
|
|
Sql_condition *push_warning(THD *thd,
|
2016-10-14 14:52:33 +02:00
|
|
|
const Sql_condition_identity *identity,
|
2013-06-15 17:32:08 +02:00
|
|
|
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
|
|
|
|
2020-08-14 19:22:43 +02:00
|
|
|
extern size_t err_conv(char *buff, uint to_length, const char *from,
|
|
|
|
uint from_length, CHARSET_INFO *from_cs);
|
2009-10-15 14:23:43 +02:00
|
|
|
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
class ErrBuff
|
2009-10-15 14:23:43 +02:00
|
|
|
{
|
2011-10-19 21:45:18 +02:00
|
|
|
protected:
|
|
|
|
mutable char err_buffer[MYSQL_ERRMSG_SIZE];
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
public:
|
|
|
|
ErrBuff()
|
|
|
|
{
|
|
|
|
err_buffer[0]= '\0';
|
|
|
|
}
|
|
|
|
const char *ptr() const { return err_buffer; }
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING set_longlong(const Longlong_hybrid &nr) const
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
{
|
2020-08-14 19:22:43 +02:00
|
|
|
int radix= nr.is_unsigned() ? 10 : -10;
|
|
|
|
const char *end= longlong10_to_str(nr.value(), err_buffer, radix);
|
|
|
|
DBUG_ASSERT(end >= err_buffer);
|
|
|
|
return {err_buffer, (size_t) (end - err_buffer)};
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
}
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING set_double(double nr) const
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
{
|
2020-08-14 19:22:43 +02:00
|
|
|
size_t length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE,
|
|
|
|
sizeof(err_buffer), err_buffer, 0);
|
|
|
|
return {err_buffer, length};
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
}
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING set_decimal(const decimal_t *d) const
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
{
|
2020-08-14 19:22:43 +02:00
|
|
|
int length= sizeof(err_buffer);
|
|
|
|
decimal2string(d, err_buffer, &length, 0, 0, ' ');
|
|
|
|
DBUG_ASSERT(length >= 0);
|
|
|
|
return {err_buffer, (size_t) length};
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
}
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING set_str(const char *str, size_t len, CHARSET_INFO *cs) const
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
{
|
|
|
|
DBUG_ASSERT(len < UINT_MAX32);
|
2020-08-14 19:22:43 +02:00
|
|
|
len= err_conv(err_buffer, (uint) sizeof(err_buffer), str, (uint) len, cs);
|
|
|
|
return {err_buffer, len};
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
}
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING set_mysql_time(const MYSQL_TIME *ltime) const
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
{
|
2020-08-14 19:22:43 +02:00
|
|
|
int length= my_TIME_to_str(ltime, err_buffer, AUTO_SEC_PART_DIGITS);
|
|
|
|
DBUG_ASSERT(length >= 0);
|
|
|
|
return {err_buffer, (size_t) length};
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class ErrConv: public ErrBuff
|
|
|
|
{
|
2009-10-15 14:23:43 +02:00
|
|
|
public:
|
2011-10-19 21:45:18 +02:00
|
|
|
ErrConv() {}
|
|
|
|
virtual ~ErrConv() {}
|
2020-08-14 19:22:43 +02:00
|
|
|
virtual LEX_CSTRING lex_cstring() const= 0;
|
|
|
|
inline const char *ptr() const
|
|
|
|
{
|
|
|
|
return lex_cstring().str;
|
|
|
|
}
|
2011-10-19 21:45:18 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
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()) {}
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING lex_cstring() const override
|
2017-09-23 13:48:47 +02:00
|
|
|
{
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
return set_str(str, len, cs);
|
2017-09-23 13:48:47 +02:00
|
|
|
}
|
2011-10-19 21:45:18 +02:00
|
|
|
};
|
2009-10-15 14:23:43 +02:00
|
|
|
|
2018-09-20 14:02:58 +02:00
|
|
|
class ErrConvInteger : public ErrConv, public Longlong_hybrid
|
2011-10-19 21:45:18 +02:00
|
|
|
{
|
|
|
|
public:
|
MDEV-17216 Assertion `!dt->fraction_remainder(decimals())' failed in Field_temporal_with_date::store_TIME_with_warning
The problem happened because {{Field_xxx::store(longlong nr, bool unsigned_val)}} erroneously passed {{unsigned_flag}} to the {{usec}} parameter of this constructor:
{code:cpp}
Datetime(int *warn, longlong sec, ulong usec, date_conv_mode_t flags)
{code}
1. Changing Time and Datetime constructors to accept data as Sec6 rather than as
longlong/double/my_decimal, so it's not possible to do such mistakes
in the future. Additional good effect of these changes:
- This reduced some amount of similar code (minus ~35 lines).
- The code now does not rely on the fact that "unsigned_flag" is
not important inside Datetime().
The constructor always gets all three parts: sign, integer part,
fractional part. The simple the better.
2. Fixing Field_xxx::store() to use the new Datetime constructor format.
This change actually fixes the problem.
3. Adding "explicit" keyword to all Sec6 constructors,
to avoid automatic hidden conversion from double/my_decimal to Sec6,
as well as from longlong/ulonglong through double to Sec6.
4. Change#1 caused (as a dependency) changes in a few places
with code like this:
bool neg= nr < 0 && !unsigned_val;
ulonglong value= m_neg ? (ulonglong) -nr : (ulonglong) nr;
These fragments relied on a non-standard behavior with
the operator "minus" applied to the lowest possible negative
signed long long value. This can lead to different results
depending on the platform and compilation flags.
We have fixed such bugs a few times already.
So instead of modifying the old wrong code to a new wrong code,
replacing all such fragments to use Longlong_hybrid,
which correctly handles this special case with -LONGLONG_MIN
in its method abs().
This also reduced the amount of similar code
(1 or 2 new lines instead 3 old lines in all 6 such fragments).
5. Removing ErrConvInteger(longlong nr, bool unsigned_flag= false)
and adding ErrConvInteger(Longlong_hybrid) instead, to encourage
use of safe Longlong_hybrid instead of unsafe pairs nr+neg.
6. Removing unused ErrConvInteger from Item_cache_temporal::get_date()
2018-10-09 10:02:35 +02:00
|
|
|
ErrConvInteger(const Longlong_hybrid &nr)
|
|
|
|
: ErrConv(), Longlong_hybrid(nr) { }
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING lex_cstring() const override
|
2005-04-01 14:04:50 +02:00
|
|
|
{
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
return set_longlong(static_cast<Longlong_hybrid>(*this));
|
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) {}
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING lex_cstring() const override
|
2009-10-15 14:23:43 +02:00
|
|
|
{
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
return set_double(num);
|
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) {}
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING lex_cstring() const override
|
2009-10-15 14:23:43 +02:00
|
|
|
{
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
return set_mysql_time(ltime);
|
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) {}
|
2020-08-14 19:22:43 +02:00
|
|
|
LEX_CSTRING lex_cstring() const override
|
2009-10-15 14:23:43 +02:00
|
|
|
{
|
MDEV-17563 Different results using table or view when comparing values of time type
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
2018-11-07 16:00:14 +01:00
|
|
|
return set_decimal(d);
|
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.
|
|
|
|
*/
|
|
|
|
|
2016-10-14 14:52:33 +02:00
|
|
|
class Diagnostics_area: public Sql_state_errno,
|
|
|
|
public Sql_user_condition_identity
|
2013-06-15 17:32:08 +02:00
|
|
|
{
|
|
|
|
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,
|
2020-06-22 18:21:21 +02:00
|
|
|
/** Set whenever one calls my_eof() in PS bulk mode. */
|
|
|
|
DA_EOF_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,
|
2016-10-14 14:52:33 +02:00
|
|
|
const Sql_user_condition_identity &ucid,
|
2013-06-15 17:32:08 +02:00
|
|
|
const Sql_condition *error_condition);
|
|
|
|
|
2016-10-14 14:52:33 +02:00
|
|
|
void set_error_status(uint sql_errno,
|
|
|
|
const char *message,
|
|
|
|
const char *sqlstate,
|
|
|
|
const Sql_condition *error_condition)
|
|
|
|
{
|
|
|
|
set_error_status(sql_errno, message, sqlstate,
|
|
|
|
Sql_user_condition_identity(),
|
|
|
|
error_condition);
|
|
|
|
}
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
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
|
2020-06-22 18:21:21 +02:00
|
|
|
{
|
|
|
|
DBUG_ASSERT(m_status == DA_ERROR || m_status == DA_OK ||
|
|
|
|
m_status == DA_OK_BULK || m_status == DA_EOF_BULK);
|
|
|
|
return m_message;
|
|
|
|
}
|
2013-06-15 17:32:08 +02:00
|
|
|
|
2016-05-09 15:26:18 +02:00
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
uint sql_errno() const
|
2016-10-12 16:16:38 +02:00
|
|
|
{
|
|
|
|
DBUG_ASSERT(m_status == DA_ERROR);
|
|
|
|
return Sql_state_errno::get_sql_errno();
|
|
|
|
}
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
const char* get_sqlstate() const
|
2016-10-12 16:16:38 +02:00
|
|
|
{ DBUG_ASSERT(m_status == DA_ERROR); return Sql_state::get_sqlstate(); }
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
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 ||
|
2020-06-22 18:21:21 +02:00
|
|
|
m_status == DA_EOF ||m_status == DA_EOF_BULK );
|
2013-06-15 17:32:08 +02:00
|
|
|
return m_statement_warn_count;
|
|
|
|
}
|
|
|
|
|
2016-10-14 14:52:33 +02:00
|
|
|
/**
|
|
|
|
Get the current errno, state and id of the user defined condition
|
|
|
|
and return them as Sql_condition_identity.
|
|
|
|
*/
|
|
|
|
Sql_condition_identity get_error_condition_identity() const
|
|
|
|
{
|
|
|
|
DBUG_ASSERT(m_status == DA_ERROR);
|
|
|
|
return Sql_condition_identity(*this /*Sql_state_errno*/,
|
|
|
|
Sql_condition::WARN_LEVEL_ERROR,
|
|
|
|
*this /*Sql_user_condition_identity*/);
|
|
|
|
}
|
|
|
|
|
2013-06-15 17:32:08 +02:00
|
|
|
/* 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(); }
|
|
|
|
|
2018-02-06 13:55:58 +01:00
|
|
|
bool has_sql_condition(const char *message_str, size_t message_length) const
|
2013-06-15 17:32:08 +02:00
|
|
|
{ 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,
|
2016-10-14 14:52:33 +02:00
|
|
|
const Sql_user_condition_identity &ucid,
|
2013-06-15 17:32:08 +02:00
|
|
|
const char* msg)
|
|
|
|
{
|
2016-10-14 14:52:33 +02:00
|
|
|
Sql_condition_identity tmp(sql_errno_arg, sqlstate, level, ucid);
|
2016-10-12 16:16:38 +02:00
|
|
|
return get_warning_info()->push_warning(thd, &tmp, msg);
|
2013-06-15 17:32:08 +02:00
|
|
|
}
|
|
|
|
|
2016-10-14 14:52:33 +02:00
|
|
|
Sql_condition *push_warning(THD *thd,
|
|
|
|
uint sqlerrno,
|
|
|
|
const char* sqlstate,
|
|
|
|
Sql_condition::enum_warning_level level,
|
|
|
|
const char* msg)
|
|
|
|
{
|
|
|
|
return push_warning(thd, sqlerrno, sqlstate, level,
|
|
|
|
Sql_user_condition_identity(), 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);
|
|
|
|
|
2018-02-26 17:17:17 +01:00
|
|
|
private:
|
2013-06-15 17:32:08 +02:00
|
|
|
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;
|
|
|
|
|
|
|
|
/** Message buffer. Can be used by OK or ERROR status. */
|
|
|
|
char m_message[MYSQL_ERRMSG_SIZE];
|
|
|
|
|
|
|
|
/**
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2019-07-06 09:09:06 +02:00
|
|
|
void convert_error_to_warning(THD *thd);
|
2013-06-15 17:32:08 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
2018-02-06 13:55:58 +01:00
|
|
|
size_t convert_error_message(char *to, size_t to_length,
|
2013-06-15 17:32:08 +02:00
|
|
|
CHARSET_INFO *to_cs,
|
2018-02-06 13:55:58 +01:00
|
|
|
const char *from, size_t from_length,
|
2009-10-15 14:23:43 +02:00
|
|
|
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
|
|
|
|
2018-01-08 14:33:23 +01:00
|
|
|
extern const LEX_CSTRING warning_level_names[];
|
2009-09-10 11:18:29 +02:00
|
|
|
|
2017-04-23 18:39:57 +02:00
|
|
|
bool is_sqlstate_valid(const LEX_CSTRING *sqlstate);
|
2013-06-15 17:32:08 +02:00
|
|
|
/**
|
|
|
|
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'; }
|
|
|
|
|
|
|
|
|
2009-09-10 11:18:29 +02:00
|
|
|
#endif // SQL_ERROR_H
|