summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <mikael@dator5.(none)>2006-06-20 16:52:40 -0400
committerunknown <mikael@dator5.(none)>2006-06-20 16:52:40 -0400
commit5a737577e637dce91728e2cc0259719d7fe36774 (patch)
treed43f6fb2c0aaaf7ae238d1e51a722360cfd04522 /sql
parent86d16c98d668d7c3ab9cf1b3d5d5af6d6d245575 (diff)
downloadmariadb-git-5a737577e637dce91728e2cc0259719d7fe36774.tar.gz
BUG#17138: Crash in stored procedure after fatal error that wasn't a real fatal error
sql/handler.h: Handle HA_ERR_FOUND_DUPP_KEY and HA_ERR_FOUND_DUPP_UNIQUE similarly sql/item_sum.cc: fix sql/sql_select.cc: fix
Diffstat (limited to 'sql')
-rw-r--r--sql/handler.h8
-rw-r--r--sql/item_sum.cc3
-rw-r--r--sql/sql_select.cc9
3 files changed, 10 insertions, 10 deletions
diff --git a/sql/handler.h b/sql/handler.h
index b53c0a9c101..048657e419b 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -977,6 +977,9 @@ public:
ignorable than others. E.g. the partition handler can get inserts
into a range where there is no partition and this is an ignorable
error.
+ HA_ERR_FOUND_DUPP_UNIQUE is a special case in MyISAM that means the
+ same thing as HA_ERR_FOUND_DUPP_KEY but can in some cases lead to
+ a slightly different error message.
*/
#define HA_CHECK_DUPP_KEY 1
#define HA_CHECK_DUPP_UNIQUE 2
@@ -985,9 +988,8 @@ public:
{
if (!error ||
((flags & HA_CHECK_DUPP_KEY) &&
- error == HA_ERR_FOUND_DUPP_KEY) ||
- ((flags & HA_CHECK_DUPP_UNIQUE) &&
- error == HA_ERR_FOUND_DUPP_UNIQUE))
+ (error == HA_ERR_FOUND_DUPP_KEY ||
+ error == HA_ERR_FOUND_DUPP_UNIQUE)))
return FALSE;
return TRUE;
}
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index d6bc2c326d6..ff37ceaa6fe 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -2663,8 +2663,7 @@ bool Item_sum_count_distinct::add()
return tree->unique_add(table->record[0] + table->s->null_bytes);
}
if ((error= table->file->ha_write_row(table->record[0])) &&
- error != HA_ERR_FOUND_DUPP_KEY &&
- error != HA_ERR_FOUND_DUPP_UNIQUE)
+ table->file->cannot_ignore_error(error, HA_CHECK_DUPP))
return TRUE;
return FALSE;
}
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index e9e2a4ed1e0..add4746c819 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -9354,9 +9354,9 @@ bool create_myisam_from_heap(THD *thd, TABLE *table, TMP_TABLE_PARAM *param,
/* copy row that filled HEAP table */
if ((write_err=new_table.file->write_row(table->record[0])))
{
- if (write_err != HA_ERR_FOUND_DUPP_KEY &&
- write_err != HA_ERR_FOUND_DUPP_UNIQUE || !ignore_last_dupp_key_error)
- goto err;
+ if (new_table.file->cannot_ignore_error(write_err, HA_CHECK_DUPP) ||
+ !ignore_last_dupp_key_error)
+ goto err;
}
/* remove heap table and change to use myisam table */
@@ -10777,8 +10777,7 @@ end_write(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
join->found_records++;
if ((error=table->file->write_row(table->record[0])))
{
- if (error == HA_ERR_FOUND_DUPP_KEY ||
- error == HA_ERR_FOUND_DUPP_UNIQUE)
+ if (table->file->cannot_ignore_error(error, HA_CHECK_DUPP))
goto end;
if (create_myisam_from_heap(join->thd, table, &join->tmp_table_param,
error,1))