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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
00a87f08
Commit
00a87f08
authored
Oct 23, 2012
by
Tor Didriksen
Browse files
Options
Browse Files
Download
Plain Diff
local merge
parents
8d890363
6360509b
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
170 additions
and
32 deletions
+170
-32
cmake/info_macros.cmake.in
cmake/info_macros.cmake.in
+5
-3
cmake/mysql_version.cmake
cmake/mysql_version.cmake
+1
-1
cmake/package_name.cmake
cmake/package_name.cmake
+1
-1
mysql-test/suite/innodb/r/innodb_bug14704286.result
mysql-test/suite/innodb/r/innodb_bug14704286.result
+15
-3
mysql-test/suite/innodb/t/innodb_bug14704286.test
mysql-test/suite/innodb/t/innodb_bug14704286.test
+7
-2
sql/log_event.cc
sql/log_event.cc
+56
-5
sql/log_event.h
sql/log_event.h
+2
-2
sql/opt_range.cc
sql/opt_range.cc
+31
-0
sql/sql_priv.h
sql/sql_priv.h
+35
-0
sql/sql_select.cc
sql/sql_select.cc
+0
-7
storage/innobase/handler/handler0alter.cc
storage/innobase/handler/handler0alter.cc
+5
-1
storage/innobase/row/row0sel.c
storage/innobase/row/row0sel.c
+12
-7
No files found.
cmake/info_macros.cmake.in
View file @
00a87f08
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2011,
2012,
Oracle and/or its affiliates. All rights reserved.
#
# 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
...
...
@@ -82,9 +82,11 @@ MACRO(CREATE_INFO_BIN)
FILE(WRITE ${INFO_BIN} "===== Information about the build process: =====\n")
IF (WIN32)
EXECUTE_PROCESS(COMMAND cmd /c date /T OUTPUT_VARIABLE TMP_DATE)
EXECUTE_PROCESS(COMMAND cmd /c date /T
OUTPUT_VARIABLE TMP_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
ELSEIF(UNIX)
EXECUTE_PROCESS(COMMAND date "+%Y-%m-%d %H:%M:%S" OUTPUT_VARIABLE TMP_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS(COMMAND date "+%Y-%m-%d %H:%M:%S"
OUTPUT_VARIABLE TMP_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
ELSE()
SET(TMP_DATE "(no date command known for this platform)")
ENDIF()
...
...
cmake/mysql_version.cmake
View file @
00a87f08
...
...
@@ -54,7 +54,7 @@ MACRO(GET_MYSQL_VERSION)
ENDIF
()
SET
(
VERSION
"
${
MAJOR_VERSION
}
.
${
MINOR_VERSION
}
.
${
PATCH_VERSION
}${
EXTRA_VERSION
}
"
)
MESSAGE
(
"--
MySQL
${
VERSION
}
"
)
MESSAGE
(
STATUS
"
MySQL
${
VERSION
}
"
)
SET
(
MYSQL_BASE_VERSION
"
${
MAJOR_VERSION
}
.
${
MINOR_VERSION
}
"
CACHE INTERNAL
"MySQL Base version"
)
SET
(
MYSQL_NO_DASH_VERSION
"
${
MAJOR_VERSION
}
.
${
MINOR_VERSION
}
.
${
PATCH_VERSION
}
"
)
# Use NDBVERSION irregardless of whether this is Cluster or not, if not
...
...
cmake/package_name.cmake
View file @
00a87f08
...
...
@@ -123,7 +123,7 @@ IF(NOT VERSION)
SET
(
package_name
"mysql
${
PRODUCT_TAG
}
-
${
VERSION
}
-
${
SYSTEM_NAME_AND_PROCESSOR
}
"
)
ENDIF
()
MESSAGE
(
"--
Packaging as:
${
package_name
}
"
)
MESSAGE
(
STATUS
"
Packaging as:
${
package_name
}
"
)
# Sometimes package suffix is added (something like "-icc-glibc23")
IF
(
PACKAGE_SUFFIX
)
...
...
mysql-test/suite/innodb/r/innodb_bug14704286.result
View file @
00a87f08
...
...
@@ -17,6 +17,7 @@ update test.t1 set value2=value2+1, value3=value3+1 where id=12;
SET i = i + 1;
END WHILE;
END|
set autocommit=0;
CALL update_t1();
select * from t1;
id value value2 value3
...
...
@@ -31,11 +32,22 @@ id value value2 value3
18 18 18 18
19 19 19 19
20 20 20 20
set autocommit=1;
select * from t1;
id value value2 value3
10 10 10 10
11 11 11 11
12 12 5012 5012
13 13 13 13
14 14 14 14
15 15 15 15
16 16 16 16
17 17 17 17
18 18 18 18
19 19 19 19
20 20 20 20
select * from t1 force index(value) where value=12;
kill query @id;
ERROR 70100: Query execution was interrupted
select * from t1 where value = 12;
id value value2 value3
12 12 12 12
drop procedure if exists update_t1;
drop table if exists t1;
mysql-test/suite/innodb/t/innodb_bug14704286.test
View file @
00a87f08
...
...
@@ -48,9 +48,11 @@ BEGIN
END
|
delimiter
;
|
set
autocommit
=
0
;
CALL
update_t1
();
select
*
from
t1
;
set
autocommit
=
1
;
select
*
from
t1
;
#
# Now try to fire select query from connection-1 enforcing
...
...
@@ -66,6 +68,10 @@ select * from t1 force index(value) where value=12;
# select is going to take good time so let's kill query.
#
connection
conn3
;
let
$wait_condition
=
select
*
from
information_schema
.
processlist
where
state
=
'Sending data'
and
info
=
'select * from t1 force index(value) where value=12'
;
--
source
include
/
wait_condition
.
inc
let
$ignore
=
`SELECT @id := $ID`
;
kill
query
@
id
;
...
...
@@ -75,7 +81,6 @@ kill query @id;
connection
conn1
;
--
error
ER_QUERY_INTERRUPTED
reap
;
select
*
from
t1
where
value
=
12
;
#
# clean test-bed.
...
...
sql/log_event.cc
View file @
00a87f08
...
...
@@ -66,6 +66,22 @@
*/
#define FMT_G_BUFSIZE(PREC) (3 + (PREC) + 5 + 1)
/*
Explicit instantiation to unsigned int of template available_buffer
function.
*/
template
unsigned
int
available_buffer
<
unsigned
int
>(
const
char
*
,
const
char
*
,
unsigned
int
);
/*
Explicit instantiation to unsigned int of template valid_buffer_range
function.
*/
template
bool
valid_buffer_range
<
unsigned
int
>(
unsigned
int
,
const
char
*
,
const
char
*
,
unsigned
int
);
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
static
int
rows_event_stmt_cleanup
(
Relay_log_info
const
*
rli
,
THD
*
thd
);
...
...
@@ -1299,7 +1315,7 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len,
ev
=
new
Rand_log_event
(
buf
,
description_event
);
break
;
case
USER_VAR_EVENT
:
ev
=
new
User_var_log_event
(
buf
,
description_event
);
ev
=
new
User_var_log_event
(
buf
,
event_len
,
description_event
);
break
;
case
FORMAT_DESCRIPTION_EVENT
:
ev
=
new
Format_description_log_event
(
buf
,
event_len
,
description_event
);
...
...
@@ -5812,19 +5828,35 @@ void User_var_log_event::pack_info(Protocol* protocol)
User_var_log_event
::
User_var_log_event
(
const
char
*
buf
,
User_var_log_event
(
const
char
*
buf
,
uint
event_len
,
const
Format_description_log_event
*
description_event
)
:
Log_event
(
buf
,
description_event
)
#ifndef MYSQL_CLIENT
,
deferred
(
false
)
#endif
{
bool
error
=
false
;
const
char
*
buf_start
=
buf
;
/* The Post-Header is empty. The Variable Data part begins immediately. */
const
char
*
start
=
buf
;
buf
+=
description_event
->
common_header_len
+
description_event
->
post_header_len
[
USER_VAR_EVENT
-
1
];
name_len
=
uint4korr
(
buf
);
name
=
(
char
*
)
buf
+
UV_NAME_LEN_SIZE
;
/*
We don't know yet is_null value, so we must assume that name_len
may have the bigger value possible, is_null= True and there is no
payload for val.
*/
if
(
0
==
name_len
||
!
valid_buffer_range
<
uint
>
(
name_len
,
buf_start
,
name
,
event_len
-
UV_VAL_IS_NULL
))
{
error
=
true
;
goto
err
;
}
buf
+=
UV_NAME_LEN_SIZE
+
name_len
;
is_null
=
(
bool
)
*
buf
;
flags
=
User_var_log_event
::
UNDEF_F
;
// defaults to UNDEF_F
...
...
@@ -5837,6 +5869,14 @@ User_var_log_event(const char* buf,
}
else
{
if
(
!
valid_buffer_range
<
uint
>
(
UV_VAL_IS_NULL
+
UV_VAL_TYPE_SIZE
+
UV_CHARSET_NUMBER_SIZE
+
UV_VAL_LEN_SIZE
,
buf_start
,
buf
,
event_len
))
{
error
=
true
;
goto
err
;
}
type
=
(
Item_result
)
buf
[
UV_VAL_IS_NULL
];
charset_number
=
uint4korr
(
buf
+
UV_VAL_IS_NULL
+
UV_VAL_TYPE_SIZE
);
val_len
=
uint4korr
(
buf
+
UV_VAL_IS_NULL
+
UV_VAL_TYPE_SIZE
+
...
...
@@ -5844,6 +5884,12 @@ User_var_log_event(const char* buf,
val
=
(
char
*
)
(
buf
+
UV_VAL_IS_NULL
+
UV_VAL_TYPE_SIZE
+
UV_CHARSET_NUMBER_SIZE
+
UV_VAL_LEN_SIZE
);
if
(
!
valid_buffer_range
<
uint
>
(
val_len
,
buf_start
,
val
,
event_len
))
{
error
=
true
;
goto
err
;
}
/**
We need to check if this is from an old server
that did not pack information for flags.
...
...
@@ -5865,6 +5911,10 @@ User_var_log_event(const char* buf,
val_len
);
}
}
err:
if
(
error
)
name
=
0
;
}
...
...
@@ -6014,8 +6064,9 @@ void User_var_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
char
*
hex_str
;
CHARSET_INFO
*
cs
;
if
(
!
(
hex_str
=
(
char
*
)
my_alloca
(
2
*
val_len
+
1
+
2
)))
// 2 hex digits / byte
break
;
// no error, as we are 'void'
hex_str
=
(
char
*
)
my_malloc
(
2
*
val_len
+
1
+
2
,
MYF
(
MY_WME
));
// 2 hex digits / byte
if
(
!
hex_str
)
return
;
str_to_hex
(
hex_str
,
val
,
val_len
);
/*
For proper behaviour when mysqlbinlog|mysql, we need to explicitely
...
...
@@ -6033,7 +6084,7 @@ void User_var_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info)
my_b_printf
(
&
cache
,
":=_%s %s COLLATE `%s`%s
\n
"
,
cs
->
csname
,
hex_str
,
cs
->
name
,
print_event_info
->
delimiter
);
my_
a
free
(
hex_str
);
my_free
(
hex_str
);
}
break
;
case
ROW_RESULT
:
...
...
sql/log_event.h
View file @
00a87f08
...
...
@@ -2577,7 +2577,7 @@ public:
void
print
(
FILE
*
file
,
PRINT_EVENT_INFO
*
print_event_info
);
#endif
User_var_log_event
(
const
char
*
buf
,
User_var_log_event
(
const
char
*
buf
,
uint
event_len
,
const
Format_description_log_event
*
description_event
);
~
User_var_log_event
()
{}
Log_event_type
get_type_code
()
{
return
USER_VAR_EVENT
;}
...
...
@@ -2591,7 +2591,7 @@ public:
bool
is_deferred
()
{
return
deferred
;
}
void
set_deferred
()
{
deferred
=
true
;
}
#endif
bool
is_valid
()
const
{
return
1
;
}
bool
is_valid
()
const
{
return
name
!=
0
;
}
private:
#if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION)
...
...
sql/opt_range.cc
View file @
00a87f08
...
...
@@ -8412,6 +8412,13 @@ int QUICK_INDEX_MERGE_SELECT::get_next()
If a Clustered PK scan is present, it is used only to check if row
satisfies its condition (and never used for row retrieval).
Locking: to ensure that exclusive locks are only set on records that
are included in the final result we must release the lock
on all rows we read but do not include in the final result. This
must be done on each index that reads the record and the lock
must be released using the same handler (the same quick object) as
used when reading the record.
RETURN
0 - Ok
other - Error code if any error occurred.
...
...
@@ -8421,6 +8428,12 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
{
List_iterator_fast
<
QUICK_RANGE_SELECT
>
quick_it
(
quick_selects
);
QUICK_RANGE_SELECT
*
quick
;
/* quick that reads the given rowid first. This is needed in order
to be able to unlock the row using the same handler object that locked
it */
QUICK_RANGE_SELECT
*
quick_with_last_rowid
;
int
error
,
cmp
;
uint
last_rowid_count
=
0
;
DBUG_ENTER
(
"QUICK_ROR_INTERSECT_SELECT::get_next"
);
...
...
@@ -8433,14 +8446,18 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
if
(
cpk_quick
)
{
while
(
!
error
&&
!
cpk_quick
->
row_in_ranges
())
{
quick
->
file
->
unlock_row
();
/* row not in range; unlock */
error
=
quick
->
get_next
();
}
}
if
(
error
)
DBUG_RETURN
(
error
);
quick
->
file
->
position
(
quick
->
record
);
memcpy
(
last_rowid
,
quick
->
file
->
ref
,
head
->
file
->
ref_length
);
last_rowid_count
=
1
;
quick_with_last_rowid
=
quick
;
while
(
last_rowid_count
<
quick_selects
.
elements
)
{
...
...
@@ -8453,9 +8470,17 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
do
{
if
((
error
=
quick
->
get_next
()))
{
quick_with_last_rowid
->
file
->
unlock_row
();
DBUG_RETURN
(
error
);
}
quick
->
file
->
position
(
quick
->
record
);
cmp
=
head
->
file
->
cmp_ref
(
quick
->
file
->
ref
,
last_rowid
);
if
(
cmp
<
0
)
{
/* This row is being skipped. Release lock on it. */
quick
->
file
->
unlock_row
();
}
}
while
(
cmp
<
0
);
/* Ok, current select 'caught up' and returned ref >= cur_ref */
...
...
@@ -8466,13 +8491,19 @@ int QUICK_ROR_INTERSECT_SELECT::get_next()
{
while
(
!
cpk_quick
->
row_in_ranges
())
{
quick
->
file
->
unlock_row
();
/* row not in range; unlock */
if
((
error
=
quick
->
get_next
()))
{
quick_with_last_rowid
->
file
->
unlock_row
();
DBUG_RETURN
(
error
);
}
}
quick
->
file
->
position
(
quick
->
record
);
}
memcpy
(
last_rowid
,
quick
->
file
->
ref
,
head
->
file
->
ref_length
);
quick_with_last_rowid
->
file
->
unlock_row
();
last_rowid_count
=
1
;
quick_with_last_rowid
=
quick
;
}
else
{
...
...
sql/sql_priv.h
View file @
00a87f08
...
...
@@ -151,6 +151,41 @@
*/
#define OPTION_ALLOW_BATCH (ULL(1) << 36) // THD, intern (slave)
/*
Check how many bytes are available on buffer.
@param buf_start Pointer to buffer start.
@param buf_current Pointer to the current position on buffer.
@param buf_len Buffer length.
@return Number of bytes available on event buffer.
*/
template
<
class
T
>
T
available_buffer
(
const
char
*
buf_start
,
const
char
*
buf_current
,
T
buf_len
)
{
return
buf_len
-
(
buf_current
-
buf_start
);
}
/*
Check if jump value is within buffer limits.
@param jump Number of positions we want to advance.
@param buf_start Pointer to buffer start
@param buf_current Pointer to the current position on buffer.
@param buf_len Buffer length.
@return True If jump value is within buffer limits.
False Otherwise.
*/
template
<
class
T
>
bool
valid_buffer_range
(
T
jump
,
const
char
*
buf_start
,
const
char
*
buf_current
,
T
buf_len
)
{
return
(
jump
<=
available_buffer
(
buf_start
,
buf_current
,
buf_len
));
}
/* The rest of the file is included in the server only */
#ifndef MYSQL_CLIENT
...
...
sql/sql_select.cc
View file @
00a87f08
...
...
@@ -7196,15 +7196,8 @@ void JOIN::cleanup(bool full)
}
}
}
/*
We are not using tables anymore
Unlock all tables. We may be in an INSERT .... SELECT statement.
*/
if
(
full
)
{
if
(
tmp_join
)
tmp_table_param
.
copy_field
=
0
;
/*
Ensure that the following delete_elements() would not be called
twice for the same list.
...
...
storage/innobase/handler/handler0alter.cc
View file @
00a87f08
...
...
@@ -112,13 +112,17 @@ innobase_col_to_mysql(
/* These column types should never be shipped to MySQL. */
ut_ad
(
0
);
case
DATA_CHAR
:
case
DATA_FIXBINARY
:
case
DATA_FLOAT
:
case
DATA_DOUBLE
:
case
DATA_DECIMAL
:
/* Above are the valid column types for MySQL data. */
ut_ad
(
flen
==
len
);
/* fall through */
case
DATA_CHAR
:
/* We may have flen > len when there is a shorter
prefix on a CHAR column. */
ut_ad
(
flen
>=
len
);
#else
/* UNIV_DEBUG */
default:
#endif
/* UNIV_DEBUG */
...
...
storage/innobase/row/row0sel.c
View file @
00a87f08
...
...
@@ -4847,11 +4847,15 @@ row_search_autoinc_read_column(
rec_offs_init
(
offsets_
);
offsets
=
rec_get_offsets
(
rec
,
index
,
offsets
,
ULINT_UNDEFINED
,
&
heap
);
offsets
=
rec_get_offsets
(
rec
,
index
,
offsets
,
col_no
+
1
,
&
heap
);
data
=
rec_get_nth_field
(
rec
,
offsets
,
col_no
,
&
len
);
if
(
rec_offs_nth_sql_null
(
offsets
,
col_no
))
{
/* There is no non-NULL value in the auto-increment column. */
value
=
0
;
goto
func_exit
;
}
ut_a
(
len
!=
UNIV_SQL_NULL
);
data
=
rec_get_nth_field
(
rec
,
offsets
,
col_no
,
&
len
);
switch
(
mtype
)
{
case
DATA_INT
:
...
...
@@ -4873,14 +4877,15 @@ row_search_autoinc_read_column(
ut_error
;
}
if
(
UNIV_LIKELY_NULL
(
heap
))
{
mem_heap_free
(
heap
);
}
if
(
!
unsigned_type
&&
(
ib_int64_t
)
value
<
0
)
{
value
=
0
;
}
func_exit:
if
(
UNIV_LIKELY_NULL
(
heap
))
{
mem_heap_free
(
heap
);
}
return
(
value
);
}
...
...
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