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
5853823b
Commit
5853823b
authored
Jul 01, 2006
by
mikael@dator5.(none)
Browse files
Options
Browse Files
Download
Plain Diff
Merge dator5.(none):/home/pappa/clean-mysql-5.1
into dator5.(none):/home/pappa/bug17138
parents
b6559681
4e390d71
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
129 additions
and
38 deletions
+129
-38
mysql-test/r/partition.result
mysql-test/r/partition.result
+17
-0
mysql-test/t/partition.test
mysql-test/t/partition.test
+29
-0
sql/ha_ndbcluster.h
sql/ha_ndbcluster.h
+7
-0
sql/ha_partition.h
sql/ha_partition.h
+7
-0
sql/handler.h
sql/handler.h
+27
-7
sql/item_sum.cc
sql/item_sum.cc
+1
-2
sql/sql_acl.cc
sql/sql_acl.cc
+4
-5
sql/sql_insert.cc
sql/sql_insert.cc
+18
-4
sql/sql_select.cc
sql/sql_select.cc
+4
-5
sql/sql_table.cc
sql/sql_table.cc
+3
-5
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/r/partition.result
View file @
5853823b
...
...
@@ -1057,4 +1057,21 @@ alter table t1 add partition (partition p2 values in (3));
alter table t1 drop partition p2;
use test;
drop database db99;
drop procedure if exists mysqltest_1;
create table t1 (a int)
partition by list (a)
(partition p0 values in (0));
insert into t1 values (0);
create procedure mysqltest_1 ()
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 mysqltest_1()//
drop table t1;
drop procedure mysqltest_1;
End of 5.1 tests
mysql-test/t/partition.test
View file @
5853823b
...
...
@@ -1223,4 +1223,33 @@ alter table t1 drop partition p2;
use
test
;
drop
database
db99
;
#
#BUG 17138 Problem with stored procedure and analyze partition
#
--
disable_warnings
drop
procedure
if
exists
mysqltest_1
;
--
enable_warnings
create
table
t1
(
a
int
)
partition
by
list
(
a
)
(
partition
p0
values
in
(
0
));
insert
into
t1
values
(
0
);
delimiter
//;
create
procedure
mysqltest_1
()
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
mysqltest_1
()
//
delimiter
;
//
drop
table
t1
;
drop
procedure
mysqltest_1
;
--
echo
End
of
5.1
tests
sql/ha_ndbcluster.h
View file @
5853823b
...
...
@@ -655,6 +655,13 @@ class ha_ndbcluster: public handler
int
get_default_no_partitions
(
HA_CREATE_INFO
*
info
);
bool
get_no_parts
(
const
char
*
name
,
uint
*
no_parts
);
void
set_auto_partitions
(
partition_info
*
part_info
);
virtual
bool
is_fatal_error
(
int
error
,
uint
flags
)
{
if
(
!
handler
::
is_fatal_error
(
error
,
flags
)
||
error
==
HA_ERR_NO_PARTITION_FOUND
)
return
FALSE
;
return
TRUE
;
}
THR_LOCK_DATA
**
store_lock
(
THD
*
thd
,
THR_LOCK_DATA
**
to
,
...
...
sql/ha_partition.h
View file @
5853823b
...
...
@@ -302,6 +302,13 @@ class ha_partition :public handler
virtual
void
start_bulk_insert
(
ha_rows
rows
);
virtual
int
end_bulk_insert
();
virtual
bool
is_fatal_error
(
int
error
,
uint
flags
)
{
if
(
!
handler
::
is_fatal_error
(
error
,
flags
)
||
error
==
HA_ERR_NO_PARTITION_FOUND
)
return
FALSE
;
return
TRUE
;
}
/*
-------------------------------------------------------------------------
MODULE full table scan
...
...
sql/handler.h
View file @
5853823b
...
...
@@ -218,11 +218,6 @@
#define HA_BLOCK_LOCK 256
/* unlock when reading some records */
#define HA_OPEN_TEMPORARY 512
/* Errors on write which is recoverable (Key exist) */
#define HA_WRITE_SKIP 121
/* Duplicate key on write */
#define HA_READ_CHECK 123
/* Update with is recoverable */
#define HA_CANT_DO_THAT 131
/* Databasehandler can't do it */
/* Some key definitions */
#define HA_KEY_NULL_LENGTH 1
#define HA_KEY_BLOB_LENGTH 2
...
...
@@ -242,6 +237,11 @@
/* Options of START TRANSACTION statement (and later of SET TRANSACTION stmt) */
#define MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT 1
/* Flags for method is_fatal_error */
#define HA_CHECK_DUP_KEY 1
#define HA_CHECK_DUP_UNIQUE 2
#define HA_CHECK_DUP (HA_CHECK_DUP_KEY + HA_CHECK_DUP_UNIQUE)
enum
legacy_db_type
{
DB_TYPE_UNKNOWN
=
0
,
DB_TYPE_DIAB_ISAM
=
1
,
...
...
@@ -973,6 +973,26 @@ class handler :public Sql_alloc
{
return
(
ha_table_flags
()
&
HA_NO_TRANSACTIONS
)
==
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.
HA_ERR_FOUND_DUP_UNIQUE is a special case in MyISAM that means the
same thing as HA_ERR_FOUND_DUP_KEY but can in some cases lead to
a slightly different error message.
*/
virtual
bool
is_fatal_error
(
int
error
,
uint
flags
)
{
if
(
!
error
||
((
flags
&
HA_CHECK_DUP_KEY
)
&&
(
error
==
HA_ERR_FOUND_DUPP_KEY
||
error
==
HA_ERR_FOUND_DUPP_UNIQUE
)))
return
FALSE
;
return
TRUE
;
}
/*
Number of rows in table. It will only be called if
(table_flags() & (HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT)) != 0
...
...
sql/item_sum.cc
View file @
5853823b
...
...
@@ -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
->
is_fatal_error
(
error
,
HA_CHECK_DUP
))
return
TRUE
;
return
FALSE
;
}
...
...
sql/sql_acl.cc
View file @
5853823b
...
...
@@ -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
{
// This should never happen
if
(
error
&&
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
)
/* purecov: inspected */
if
(
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP
))
{
table
->
file
->
print_error
(
error
,
MYF
(
0
));
/* purecov: deadcode */
error
=
-
1
;
/* purecov: deadcode */
...
...
@@ -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
])))
{
if
(
error
&&
error
!=
HA_ERR_FOUND_DUPP_KEY
)
/* purecov: inspected */
if
(
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP_KEY
))
goto
table_error
;
/* purecov: deadcode */
}
...
...
@@ -2744,7 +2743,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
else
{
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
]);
if
(
error
&&
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP_KEY
)
)
goto
table_error
;
/* purecov: deadcode */
}
...
...
@@ -2862,7 +2861,7 @@ static int replace_routine_table(THD *thd, GRANT_NAME *grant_name,
else
{
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
]);
if
(
error
&&
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP_KEY
)
)
goto
table_error
;
}
...
...
sql/sql_insert.cc
View file @
5853823b
...
...
@@ -976,12 +976,25 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
while
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
{
uint
key_nr
;
if
(
error
!=
HA_WRITE_SKIP
)
bool
is_duplicate_key_error
;
if
(
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP
))
goto
err
;
table
->
file
->
restore_auto_increment
();
// it's too early here! BUG#20188
is_duplicate_key_error
=
table
->
file
->
is_fatal_error
(
error
,
0
);
if
(
!
is_duplicate_key_error
)
{
/*
We come here when we had an ignorable error which is not a duplicate
key error. In this we ignore error if ignore flag is set, otherwise
report error as usual. We will not do any duplicate key processing.
*/
if
(
info
->
ignore
)
goto
ok_or_after_trg_err
;
/* Ignoring a not fatal error, return 0 */
goto
err
;
}
if
((
int
)
(
key_nr
=
table
->
file
->
get_dup_key
(
error
))
<
0
)
{
error
=
HA_WRITE_SKIP
;
/* Database can't find key */
error
=
HA_ERR_FOUND_DUPP_KEY
;
/* Database can't find key */
goto
err
;
}
/* Read all columns for the row we are going to replace */
...
...
@@ -1062,7 +1075,8 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
if
((
error
=
table
->
file
->
ha_update_row
(
table
->
record
[
1
],
table
->
record
[
0
])))
{
if
((
error
==
HA_ERR_FOUND_DUPP_KEY
)
&&
info
->
ignore
)
if
(
info
->
ignore
&&
!
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP_KEY
))
goto
ok_or_after_trg_err
;
goto
err
;
}
...
...
@@ -1145,7 +1159,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
else
if
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
{
if
(
!
info
->
ignore
||
(
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
))
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP
))
goto
err
;
table
->
file
->
restore_auto_increment
();
goto
ok_or_after_trg_err
;
...
...
sql/sql_select.cc
View file @
5853823b
...
...
@@ -9355,8 +9355,8 @@ 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
)
if
(
new_table
.
file
->
is_fatal_error
(
write_err
,
HA_CHECK_DUP
)
||
!
ignore_last_dupp_key_error
)
goto
err
;
}
...
...
@@ -10778,8 +10778,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
->
is_fatal_error
(
error
,
HA_CHECK_DUP
))
goto
end
;
if
(
create_myisam_from_heap
(
join
->
thd
,
table
,
&
join
->
tmp_table_param
,
error
,
1
))
...
...
sql/sql_table.cc
View file @
5853823b
...
...
@@ -6322,12 +6322,10 @@ copy_data_between_tables(TABLE *from,TABLE *to,
}
if
((
error
=
to
->
file
->
ha_write_row
((
byte
*
)
to
->
record
[
0
])))
{
if
((
!
ignore
&&
handle_duplicates
!=
DUP_REPLACE
)
||
(
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
))
if
(
!
ignore
||
handle_duplicates
!=
DUP_ERROR
||
to
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP
))
{
if
(
error
==
HA_ERR_FOUND_DUPP_KEY
)
if
(
!
to
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP
)
)
{
uint
key_nr
=
to
->
file
->
get_dup_key
(
error
);
if
((
int
)
key_nr
>=
0
)
...
...
sql/sql_union.cc
View file @
5853823b
...
...
@@ -65,7 +65,7 @@ bool select_union::send_data(List<Item> &values)
if
((
error
=
table
->
file
->
ha_write_row
(
table
->
record
[
0
])))
{
/* 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
->
is_fatal_error
(
error
,
HA_CHECK_DUP
)
&&
create_myisam_from_heap
(
thd
,
table
,
&
tmp_table_param
,
error
,
1
))
return
1
;
}
...
...
sql/sql_update.cc
View file @
5853823b
...
...
@@ -541,13 +541,14 @@ int mysql_update(THD *thd,
break
;
}
}
else
if
(
!
ignore
||
error
!=
HA_ERR_FOUND_DUPP_KEY
)
else
if
(
!
ignore
||
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP_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...
*/
if
(
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP_KEY
)
)
thd
->
fatal_error
();
/* Other handler errors are fatal */
table
->
file
->
print_error
(
error
,
MYF
(
0
));
error
=
1
;
...
...
@@ -1422,13 +1423,14 @@ bool multi_update::send_data(List<Item> ¬_used_values)
table
->
record
[
0
])))
{
updated
--
;
if
(
!
ignore
||
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
!
ignore
||
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP_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...
*/
if
(
error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP_KEY
)
)
thd
->
fatal_error
();
/* Other handler errors are fatal */
table
->
file
->
print_error
(
error
,
MYF
(
0
));
DBUG_RETURN
(
1
);
...
...
@@ -1457,8 +1459,7 @@ bool multi_update::send_data(List<Item> ¬_used_values)
/* Write row, ignoring duplicated updates to a row */
if
((
error
=
tmp_table
->
file
->
ha_write_row
(
tmp_table
->
record
[
0
])))
{
if
(
error
!=
HA_ERR_FOUND_DUPP_KEY
&&
error
!=
HA_ERR_FOUND_DUPP_UNIQUE
&&
if
(
tmp_table
->
file
->
is_fatal_error
(
error
,
HA_CHECK_DUP
)
&&
create_myisam_from_heap
(
thd
,
tmp_table
,
tmp_table_param
+
offset
,
error
,
1
))
{
...
...
@@ -1581,7 +1582,8 @@ int multi_update::do_updates(bool from_send_error)
if
((
local_error
=
table
->
file
->
ha_update_row
(
table
->
record
[
1
],
table
->
record
[
0
])))
{
if
(
!
ignore
||
local_error
!=
HA_ERR_FOUND_DUPP_KEY
)
if
(
!
ignore
||
table
->
file
->
is_fatal_error
(
local_error
,
HA_CHECK_DUP_KEY
))
goto
err
;
}
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