summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2016-10-13 18:19:58 +0400
committerAlexander Barkov <bar@mariadb.org>2017-04-05 15:02:53 +0400
commit4d3818d30d97e6fbdb5130d73716401e883c7371 (patch)
treef2440171d9faa1c804b5df73f542c17e4a7e755b /sql
parent6010662cb328c10b1ef92c3ed43b2b3858c49863 (diff)
downloadmariadb-git-4d3818d30d97e6fbdb5130d73716401e883c7371.tar.gz
MDEV-11037 Diagnostics_area refactoring for user defined exceptions
Part 2: Moving the part of Sql_condition that contain condition items (such as m_class_origin, m_cursor_name, etc) into a separate class Sql_condition_items. This allows to remove duplicate code in different Sql_condition constructors. Also, introducing new Sql_condition constructors and removing the method Sql_condition::set(). All code sequences that called an Sql_condition constructor followed by Sql_condition::set() are now replaced to the new constructor calls. This gives light performance improvement, as the relevant members are now initialized only one time.
Diffstat (limited to 'sql')
-rw-r--r--sql/sp_rcontext.cc7
-rw-r--r--sql/sql_error.cc63
-rw-r--r--sql/sql_error.h186
-rw-r--r--sql/sql_signal.cc3
4 files changed, 134 insertions, 125 deletions
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc
index 338fe51d251..242e1b122d5 100644
--- a/sql/sp_rcontext.cc
+++ b/sql/sp_rcontext.cc
@@ -242,10 +242,9 @@ bool sp_rcontext::handle_sql_condition(THD *thd,
*/
if (!found_condition)
{
- Sql_condition *condition=
- new (callers_arena->mem_root) Sql_condition(callers_arena->mem_root);
- condition->set(da, Sql_condition::WARN_LEVEL_ERROR, da->message());
- found_condition= condition;
+ found_condition=
+ new (callers_arena->mem_root) Sql_condition(callers_arena->mem_root,
+ da, da->message());
}
}
else if (da->current_statement_warn_count())
diff --git a/sql/sql_error.cc b/sql/sql_error.cc
index a7de8a00009..2e9b1dabea4 100644
--- a/sql/sql_error.cc
+++ b/sql/sql_error.cc
@@ -172,64 +172,6 @@ This file contains the implementation of error and warnings related
See WL#2111 (Stored Procedures: Implement GET DIAGNOSTICS)
*/
-Sql_condition::Sql_condition()
- : Sql_alloc(),
- m_class_origin((const char*) NULL, 0, & my_charset_utf8_bin),
- m_subclass_origin((const char*) NULL, 0, & my_charset_utf8_bin),
- m_constraint_catalog((const char*) NULL, 0, & my_charset_utf8_bin),
- m_constraint_schema((const char*) NULL, 0, & my_charset_utf8_bin),
- m_constraint_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_catalog_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_schema_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_table_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_column_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_cursor_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_message_text(),
- m_mem_root(NULL)
-{
-}
-
-void Sql_condition::init(MEM_ROOT *mem_root)
-{
- DBUG_ASSERT(mem_root != NULL);
- DBUG_ASSERT(m_mem_root == NULL);
- m_mem_root= mem_root;
-}
-
-void Sql_condition::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);
- m_message_text.length(0);
- m_sql_errno= 0;
- m_level= Sql_condition::WARN_LEVEL_ERROR;
-}
-
-Sql_condition::Sql_condition(MEM_ROOT *mem_root)
- : Sql_alloc(),
- m_class_origin((const char*) NULL, 0, & my_charset_utf8_bin),
- m_subclass_origin((const char*) NULL, 0, & my_charset_utf8_bin),
- m_constraint_catalog((const char*) NULL, 0, & my_charset_utf8_bin),
- m_constraint_schema((const char*) NULL, 0, & my_charset_utf8_bin),
- m_constraint_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_catalog_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_schema_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_table_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_column_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_cursor_name((const char*) NULL, 0, & my_charset_utf8_bin),
- m_message_text(),
- m_mem_root(mem_root)
-{
- DBUG_ASSERT(mem_root != NULL);
-}
static void copy_string(MEM_ROOT *mem_root, String* dst, const String* src)
{
@@ -715,12 +657,9 @@ Sql_condition *Warning_info::push_warning(THD *thd,
if (m_allow_unlimited_warnings ||
m_warn_list.elements() < thd->variables.max_error_count)
{
- cond= new (& m_warn_root) Sql_condition(& m_warn_root);
+ cond= new (& m_warn_root) Sql_condition(& m_warn_root, value, msg);
if (cond)
- {
- cond->set(value, msg);
m_warn_list.push_back(cond);
- }
}
m_warn_count[(uint) value->get_level()]++;
}
diff --git a/sql/sql_error.h b/sql/sql_error.h
index 1fe6d6f1699..d80ce218769 100644
--- a/sql/sql_error.h
+++ b/sql/sql_error.h
@@ -139,6 +139,10 @@ public:
{
*this= *other;
}
+ void clear()
+ {
+ m_sql_errno= 0;
+ }
};
@@ -177,6 +181,78 @@ public:
:Sql_state_errno(sqlerrno, sqlstate),
m_level(level)
{ }
+ 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();
+ }
+};
+
+
+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;
+
+ Sql_condition_items()
+ :m_class_origin((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_subclass_origin((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_constraint_catalog((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_constraint_schema((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_constraint_name((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_catalog_name((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_schema_name((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_table_name((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_column_name((const char*) NULL, 0, & my_charset_utf8_bin),
+ m_cursor_name((const char*) NULL, 0, & my_charset_utf8_bin)
+ { }
+
+ 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);
+ }
};
@@ -185,7 +261,9 @@ public:
A SQL condition can be a completion condition (note, warning),
or an exception condition (error, not found).
*/
-class Sql_condition : public Sql_alloc, public Sql_state_errno_level
+class Sql_condition : public Sql_alloc,
+ public Sql_state_errno_level,
+ public Sql_condition_items
{
public:
@@ -237,55 +315,74 @@ private:
This constructor is usefull when allocating arrays.
Note that the init() method should be called to complete the Sql_condition.
*/
- Sql_condition();
+ Sql_condition()
+ :m_mem_root(NULL)
+ { }
/**
Complete the Sql_condition initialisation.
@param mem_root The memory root to use for the condition items
of this condition
*/
- void init(MEM_ROOT *mem_root);
+ void init(MEM_ROOT *mem_root)
+ {
+ DBUG_ASSERT(mem_root != NULL);
+ DBUG_ASSERT(m_mem_root == NULL);
+ m_mem_root= mem_root;
+ }
/**
Constructor.
@param mem_root The memory root to use for the condition items
of this condition
*/
- Sql_condition(MEM_ROOT *mem_root);
-
- /** Destructor. */
- ~Sql_condition()
- {}
-
- /**
- Copy optional condition items attributes.
- @param cond the condition to copy.
- */
- void copy_opt_attributes(const Sql_condition *cond);
+ Sql_condition(MEM_ROOT *mem_root)
+ :m_mem_root(mem_root)
+ {
+ DBUG_ASSERT(mem_root != NULL);
+ }
/**
- Set this condition area with a fixed message text.
- @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.
+ 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
*/
- void set(const Sql_state_errno *value,
- Sql_condition::enum_warning_level level,
- const char* msg)
+ Sql_condition(MEM_ROOT *mem_root,
+ const Sql_state_errno_level *value,
+ const char *msg)
+ :Sql_state_errno_level(*value),
+ m_mem_root(mem_root)
{
+ DBUG_ASSERT(mem_root != NULL);
DBUG_ASSERT(value->get_sql_errno() != 0);
- DBUG_ASSERT(value->get_sqlstate() != NULL);
DBUG_ASSERT(msg != NULL);
- set_condition_value(value);
set_builtin_message_text(msg);
- m_level= level;
}
- void set(const Sql_state_errno_level *cond, const char* msg)
+ Sql_condition(MEM_ROOT *mem_root,
+ const Sql_state_errno *value,
+ const char *msg)
+ :Sql_state_errno_level(*value, Sql_condition::WARN_LEVEL_ERROR),
+ m_mem_root(mem_root)
{
- set(cond, cond->get_level(), msg);
+ DBUG_ASSERT(mem_root != NULL);
+ DBUG_ASSERT(value->get_sql_errno() != 0);
+ DBUG_ASSERT(msg != NULL);
+ set_builtin_message_text(msg);
}
+ /** Destructor. */
+ ~Sql_condition()
+ {}
+
+ /**
+ Copy optional condition items attributes.
+ @param cond the condition to copy.
+ */
+ void copy_opt_attributes(const Sql_condition *cond);
+
/**
Set the condition message test.
@param str Message text, expressed in the character set derived from
@@ -310,39 +407,14 @@ private:
/**
Clear this SQL condition.
*/
- void clear();
+ void clear()
+ {
+ Sql_state_errno_level::clear();
+ Sql_condition_items::clear();
+ m_message_text.length(0);
+ }
private:
- /** SQL CLASS_ORIGIN condition item. */
- String m_class_origin;
-
- /** SQL SUBCLASS_ORIGIN condition item. */
- String m_subclass_origin;
-
- /** SQL CONSTRAINT_CATALOG condition item. */
- String m_constraint_catalog;
-
- /** SQL CONSTRAINT_SCHEMA condition item. */
- String m_constraint_schema;
-
- /** SQL CONSTRAINT_NAME condition item. */
- String m_constraint_name;
-
- /** SQL CATALOG_NAME condition item. */
- String m_catalog_name;
-
- /** SQL SCHEMA_NAME condition item. */
- String m_schema_name;
-
- /** SQL TABLE_NAME condition item. */
- String m_table_name;
-
- /** SQL COLUMN_NAME condition item. */
- String m_column_name;
-
- /** SQL CURSOR_NAME condition item. */
- String m_cursor_name;
-
/** Message text, expressed in the character set implied by --language. */
String m_message_text;
diff --git a/sql/sql_signal.cc b/sql/sql_signal.cc
index 86f3958d24d..a4a31207a7d 100644
--- a/sql/sql_signal.cc
+++ b/sql/sql_signal.cc
@@ -427,8 +427,7 @@ bool Sql_cmd_resignal::execute(THD *thd)
DBUG_RETURN(result);
}
- Sql_condition signaled_err(thd->mem_root);
- signaled_err.set(signaled, signaled->message);
+ Sql_condition signaled_err(thd->mem_root, signaled, signaled->message);
if (m_cond)
{