Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
8bd81e1f
Commit
8bd81e1f
authored
Jun 19, 2006
by
mikael@dator5.(none)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BUG#17138: Error in stored procedure due to fatal error when not really
a fatal error. New handling of ignore error in place.
parent
d2b04770
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
86 additions
and
23 deletions
+86
-23
mysql-test/t/partition.test
mysql-test/t/partition.test
+23
-0
sql/ha_ndbcluster.h
sql/ha_ndbcluster.h
+8
-0
sql/ha_partition.h
sql/ha_partition.h
+8
-0
sql/handler.h
sql/handler.h
+23
-2
sql/sql_acl.cc
sql/sql_acl.cc
+4
-5
sql/sql_insert.cc
sql/sql_insert.cc
+6
-2
sql/sql_table.cc
sql/sql_table.cc
+2
-4
sql/sql_union.cc
sql/sql_union.cc
+1
-1
sql/sql_update.cc
sql/sql_update.cc
+11
-9
No files found.
mysql-test/t/partition.test
View file @
8bd81e1f
...
@@ -1135,4 +1135,27 @@ alter table t1 drop partition p2;
...
@@ -1135,4 +1135,27 @@ alter table t1 drop partition p2;
use
test
;
use
test
;
drop
database
db99
;
drop
database
db99
;
#
#BUG 17138 Problem with stored procedure and analyze partition
#
create
table
t1
(
a
int
)
partition
by
list
(
a
)
(
partition
p0
values
in
(
0
));
insert
into
t1
values
(
0
);
delimiter
//;
create
procedure
po
()
begin
begin
declare
continue
handler
for
sqlexception
begin
end
;
update
ignore
t1
set
a
=
1
where
a
=
0
;
end
;
prepare
stmt1
from
'alter table t1'
;
execute
stmt1
;
end
//
call
po
()
//
delimiter
;
//
drop
table
t1
;
--
echo
End
of
5.1
tests
--
echo
End
of
5.1
tests
sql/ha_ndbcluster.h
View file @
8bd81e1f
...
@@ -654,6 +654,14 @@ class ha_ndbcluster: public handler
...
@@ -654,6 +654,14 @@ class ha_ndbcluster: public handler
int
get_default_no_partitions
(
ulonglong
max_rows
);
int
get_default_no_partitions
(
ulonglong
max_rows
);
bool
get_no_parts
(
const
char
*
name
,
uint
*
no_parts
);
bool
get_no_parts
(
const
char
*
name
,
uint
*
no_parts
);
void
set_auto_partitions
(
partition_info
*
part_info
);
void
set_auto_partitions
(
partition_info
*
part_info
);
virtual
bool
cannot_ignore_error
(
int
error
,
uint
flags
)
{
if
(
!
handler
::
cannot_ignore_error
(
error
,
flags
))
return
FALSE
;
if
(
error
==
HA_ERR_NO_PARTITION_FOUND
)
return
FALSE
;
return
TRUE
;
}
THR_LOCK_DATA
**
store_lock
(
THD
*
thd
,
THR_LOCK_DATA
**
store_lock
(
THD
*
thd
,
THR_LOCK_DATA
**
to
,
THR_LOCK_DATA
**
to
,
...
...
sql/ha_partition.h
View file @
8bd81e1f
...
@@ -302,6 +302,14 @@ class ha_partition :public handler
...
@@ -302,6 +302,14 @@ class ha_partition :public handler
virtual
void
start_bulk_insert
(
ha_rows
rows
);
virtual
void
start_bulk_insert
(
ha_rows
rows
);
virtual
int
end_bulk_insert
();
virtual
int
end_bulk_insert
();
virtual
bool
cannot_ignore_error
(
int
error
,
uint
flags
)
{
if
(
!
handler
::
cannot_ignore_error
(
error
,
flags
))
return
FALSE
;
if
(
error
==
HA_ERR_NO_PARTITION_FOUND
)
return
FALSE
;
return
TRUE
;
}
/*
/*
-------------------------------------------------------------------------
-------------------------------------------------------------------------
MODULE full table scan
MODULE full table scan
...
...
sql/handler.h
View file @
8bd81e1f
...
@@ -974,7 +974,28 @@ class handler :public Sql_alloc
...
@@ -974,7 +974,28 @@ class handler :public Sql_alloc
bool
has_transactions
()
bool
has_transactions
()
{
return
(
ha_table_flags
()
&
HA_NO_TRANSACTIONS
)
==
0
;
}
{
return
(
ha_table_flags
()
&
HA_NO_TRANSACTIONS
)
==
0
;
}
virtual
uint
extra_rec_buf_length
()
const
{
return
0
;
}
virtual
uint
extra_rec_buf_length
()
const
{
return
0
;
}
/*
This method is used to analyse the error to see whether the error
is ignorable or not, certain handlers can have more error that are
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.
*/
#define HA_CHECK_DUPP_KEY 1
#define HA_CHECK_DUPP_UNIQUE 2
#define HA_CHECK_DUPP (CHECK_DUPP_KEY + CHECK_DUPP_UNIQUE)
virtual
bool
cannot_ignore_error
(
int
error
,
uint
flags
)
{
if
(
!
error
||
((
flags
&
HA_CHECK_DUPP_KEY
)
&&
error
==
HA_ERR_FOUND_DUPP_KEY
)
||
((
flags
&
HA_CHECK_DUPP_UNIQUE
)
&&
error
==
HA_ERR_FOUND_DUPP_UNIQUE
))
return
FALSE
;
return
TRUE
;
}
/*
/*
Number of rows in table. It will only be called if
Number of rows in table. It will only be called if
(table_flags() & (HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT)) != 0
(table_flags() & (HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT)) != 0
...
@@ -1026,7 +1047,7 @@ class handler :public Sql_alloc
...
@@ -1026,7 +1047,7 @@ class handler :public Sql_alloc
DBUG_RETURN
(
rnd_end
());
DBUG_RETURN
(
rnd_end
());
}
}
int
ha_reset
();
int
ha_reset
();
/* this is necessary in many places, e.g. in HANDLER command */
/* this is necessary in many places, e.g. in HANDLER command */
int
ha_index_or_rnd_end
()
int
ha_index_or_rnd_end
()
{
{
...
...
sql/sql_acl.cc
View file @
8bd81e1f
...
@@ -2049,8 +2049,7 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
...
@@ -2049,8 +2049,7 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
}
}
else
if
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
// insert
else
if
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
// insert
{
// This should never happen
{
// This should never happen
if
(
error
&&
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
if
(
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP
))
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
)
/* purecov: inspected */
{
{
table
->
file
->
print_error
(
error
,
MYF
(
0
));
/* purecov: deadcode */
table
->
file
->
print_error
(
error
,
MYF
(
0
));
/* purecov: deadcode */
error
=
-
1
;
/* purecov: deadcode */
error
=
-
1
;
/* purecov: deadcode */
...
@@ -2172,7 +2171,7 @@ static int replace_db_table(TABLE *table, const char *db,
...
@@ -2172,7 +2171,7 @@ static int replace_db_table(TABLE *table, const char *db,
}
}
else
if
(
rights
&&
(
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
else
if
(
rights
&&
(
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
{
{
if
(
error
&&
error
!=
HA_ERR_FOUND_DUPP_KEY
)
/* purecov: inspected */
if
(
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP_KEY
))
goto
table_error
;
/* purecov: deadcode */
goto
table_error
;
/* purecov: deadcode */
}
}
...
@@ -2744,7 +2743,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
...
@@ -2744,7 +2743,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
else
else
{
{
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
]);
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
]);
if
(
error
&&
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP_KEY
)
)
goto
table_error
;
/* purecov: deadcode */
goto
table_error
;
/* purecov: deadcode */
}
}
...
@@ -2862,7 +2861,7 @@ static int replace_routine_table(THD *thd, GRANT_NAME *grant_name,
...
@@ -2862,7 +2861,7 @@ static int replace_routine_table(THD *thd, GRANT_NAME *grant_name,
else
else
{
{
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
]);
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
]);
if
(
error
&&
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP_KEY
)
)
goto
table_error
;
goto
table_error
;
}
}
...
...
sql/sql_insert.cc
View file @
8bd81e1f
...
@@ -979,6 +979,9 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
...
@@ -979,6 +979,9 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
if
(
error
!=
HA_WRITE_SKIP
)
if
(
error
!=
HA_WRITE_SKIP
)
goto
err
;
goto
err
;
table
->
file
->
restore_auto_increment
();
// it's too early here! BUG#20188
table
->
file
->
restore_auto_increment
();
// it's too early here! BUG#20188
if
(
info
->
ignore
&&
!
table
->
file
->
cannot_ignore_error
(
error
,
0
))
goto
ok_or_after_trg_err
;
if
((
int
)
(
key_nr
=
table
->
file
->
get_dup_key
(
error
))
<
0
)
if
((
int
)
(
key_nr
=
table
->
file
->
get_dup_key
(
error
))
<
0
)
{
{
error
=
HA_WRITE_SKIP
;
/* Database can't find key */
error
=
HA_WRITE_SKIP
;
/* Database can't find key */
...
@@ -1062,7 +1065,8 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
...
@@ -1062,7 +1065,8 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
if
((
error
=
table
->
file
->
ha_update_row
(
table
->
record
[
1
],
if
((
error
=
table
->
file
->
ha_update_row
(
table
->
record
[
1
],
table
->
record
[
0
])))
table
->
record
[
0
])))
{
{
if
((
error
==
HA_ERR_FOUND_DUPP_KEY
)
&&
info
->
ignore
)
if
(
info
->
ignore
&&
!
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP_KEY
))
goto
ok_or_after_trg_err
;
goto
ok_or_after_trg_err
;
goto
err
;
goto
err
;
}
}
...
@@ -1148,7 +1152,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
...
@@ -1148,7 +1152,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
else
if
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
else
if
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
{
{
if
(
!
info
->
ignore
||
if
(
!
info
->
ignore
||
(
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
))
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP
))
goto
err
;
goto
err
;
table
->
file
->
restore_auto_increment
();
table
->
file
->
restore_auto_increment
();
}
}
...
...
sql/sql_table.cc
View file @
8bd81e1f
...
@@ -6235,10 +6235,8 @@ copy_data_between_tables(TABLE *from,TABLE *to,
...
@@ -6235,10 +6235,8 @@ copy_data_between_tables(TABLE *from,TABLE *to,
}
}
if
((
error
=
to
->
file
->
ha_write_row
((
byte
*
)
to
->
record
[
0
])))
if
((
error
=
to
->
file
->
ha_write_row
((
byte
*
)
to
->
record
[
0
])))
{
{
if
((
!
ignore
&&
if
(
!
ignore
||
handle_duplicates
!=
DUP_REPLACE
)
||
to
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP
))
(
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
))
{
{
if
(
error
==
HA_ERR_FOUND_DUPP_KEY
)
if
(
error
==
HA_ERR_FOUND_DUPP_KEY
)
{
{
...
...
sql/sql_union.cc
View file @
8bd81e1f
...
@@ -65,7 +65,7 @@ bool select_union::send_data(List<Item> &values)
...
@@ -65,7 +65,7 @@ bool select_union::send_data(List<Item> &values)
if
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
if
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
{
{
/* create_myisam_from_heap will generate error if needed */
/* create_myisam_from_heap will generate error if needed */
if
(
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
&&
if
(
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP
)
&&
create_myisam_from_heap
(
thd
,
table
,
&
tmp_table_param
,
error
,
1
))
create_myisam_from_heap
(
thd
,
table
,
&
tmp_table_param
,
error
,
1
))
return
1
;
return
1
;
}
}
...
...
sql/sql_update.cc
View file @
8bd81e1f
...
@@ -541,13 +541,14 @@ int mysql_update(THD *thd,
...
@@ -541,13 +541,14 @@ int mysql_update(THD *thd,
break
;
break
;
}
}
}
}
else
if
(
!
ignore
||
error
!=
HA_ERR_FOUND_DUPP_KEY
)
else
if
(
!
ignore
||
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP_KEY
))
{
{
/*
/*
If (ignore && error
== HA_ERR_FOUND_DUPP_KEY
) we don't have to
If (ignore && error
is ignorable
) we don't have to
do anything; otherwise...
do anything; otherwise...
*/
*/
if
(
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP_KEY
)
)
thd
->
fatal_error
();
/* Other handler errors are fatal */
thd
->
fatal_error
();
/* Other handler errors are fatal */
table
->
file
->
print_error
(
error
,
MYF
(
0
));
table
->
file
->
print_error
(
error
,
MYF
(
0
));
error
=
1
;
error
=
1
;
...
@@ -1417,13 +1418,14 @@ bool multi_update::send_data(List<Item> ¬_used_values)
...
@@ -1417,13 +1418,14 @@ bool multi_update::send_data(List<Item> ¬_used_values)
table
->
record
[
0
])))
table
->
record
[
0
])))
{
{
updated
--
;
updated
--
;
if
(
!
ignore
||
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
!
ignore
||
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP_KEY
))
{
{
/*
/*
If (ignore && error ==
HA_ERR_FOUND_DUPP_KEY
) we don't have to
If (ignore && error ==
is ignorable
) we don't have to
do anything; otherwise...
do anything; otherwise...
*/
*/
if
(
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP_KEY
)
)
thd
->
fatal_error
();
/* Other handler errors are fatal */
thd
->
fatal_error
();
/* Other handler errors are fatal */
table
->
file
->
print_error
(
error
,
MYF
(
0
));
table
->
file
->
print_error
(
error
,
MYF
(
0
));
DBUG_RETURN
(
1
);
DBUG_RETURN
(
1
);
...
@@ -1452,8 +1454,7 @@ bool multi_update::send_data(List<Item> ¬_used_values)
...
@@ -1452,8 +1454,7 @@ bool multi_update::send_data(List<Item> ¬_used_values)
/* Write row, ignoring duplicated updates to a row */
/* Write row, ignoring duplicated updates to a row */
if
((
error
=
tmp_table
->
file
->
ha_write_row
(
tmp_table
->
record
[
0
])))
if
((
error
=
tmp_table
->
file
->
ha_write_row
(
tmp_table
->
record
[
0
])))
{
{
if
(
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
if
(
tmp_table
->
file
->
cannot_ignore_error
(
error
,
HA_CHECK_DUPP
)
&&
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
&&
create_myisam_from_heap
(
thd
,
tmp_table
,
create_myisam_from_heap
(
thd
,
tmp_table
,
tmp_table_param
+
offset
,
error
,
1
))
tmp_table_param
+
offset
,
error
,
1
))
{
{
...
@@ -1576,7 +1577,8 @@ int multi_update::do_updates(bool from_send_error)
...
@@ -1576,7 +1577,8 @@ int multi_update::do_updates(bool from_send_error)
if
((
local_error
=
table
->
file
->
ha_update_row
(
table
->
record
[
1
],
if
((
local_error
=
table
->
file
->
ha_update_row
(
table
->
record
[
1
],
table
->
record
[
0
])))
table
->
record
[
0
])))
{
{
if
(
!
ignore
||
local_error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
!
ignore
||
table
->
file
->
cannot_ignore_error
(
local_error
,
HA_CHECK_DUPP_KEY
))
goto
err
;
goto
err
;
}
}
updated
++
;
updated
++
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment