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
ccd4e77b
Commit
ccd4e77b
authored
Apr 20, 2005
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/psergey/mysql-4.1-bug9103
parents
955ec71f
254dfb2b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
150 additions
and
95 deletions
+150
-95
innobase/row/row0ins.c
innobase/row/row0ins.c
+23
-18
mysql-test/r/func_sapdb.result
mysql-test/r/func_sapdb.result
+3
-0
mysql-test/t/func_sapdb.test
mysql-test/t/func_sapdb.test
+1
-0
ndb/test/ndbapi/Makefile.am
ndb/test/ndbapi/Makefile.am
+2
-2
sql/ha_innodb.cc
sql/ha_innodb.cc
+17
-6
sql/item_timefunc.cc
sql/item_timefunc.cc
+104
-69
No files found.
innobase/row/row0ins.c
View file @
ccd4e77b
...
...
@@ -51,14 +51,19 @@ innobase_invalidate_query_cache(
chars count */
/**********************************************************************
This function returns true if SQL-query in the current thread
This function returns true if
1) SQL-query in the current thread
is either REPLACE or LOAD DATA INFILE REPLACE.
2) SQL-query in the current thread
is INSERT ON DUPLICATE KEY UPDATE.
NOTE that /mysql/innobase/row/row0ins.c must contain the
prototype for this function ! */
ibool
innobase_query_is_replace
(
void
);
/*===========================*/
innobase_query_is_update
(
void
);
/*************************************************************************
Creates an insert node struct. */
...
...
@@ -1562,12 +1567,12 @@ row_ins_scan_sec_index_for_duplicate(
trx
=
thr_get_trx
(
thr
);
ut_ad
(
trx
);
if
(
innobase_query_is_
replac
e
())
{
if
(
innobase_query_is_
updat
e
())
{
/*
The manual defines the REPLACE semantics that it
is either an INSERT or DELETE(s) for duplicate key
+ INSERT. Therefore, we should take X-lock for
duplicates
*/
/*
If the SQL-query will update or replace
duplicate key we will take X-lock for
duplicates ( REPLACE, LOAD DATAFILE REPLACE,
INSERT ON DUPLICATE KEY UPDATE).
*/
err
=
row_ins_set_exclusive_rec_lock
(
LOCK_ORDINARY
,
rec
,
index
,
thr
);
...
...
@@ -1675,12 +1680,12 @@ row_ins_duplicate_error_in_clust(
sure that in roll-forward we get the same duplicate
errors as in original execution */
if
(
innobase_query_is_
replac
e
())
{
if
(
innobase_query_is_
updat
e
())
{
/*
The manual defines the REPLACE semantics
that it is either an INSERT or DELETE(s)
for duplicate key + INSERT. Therefore, we
should take X-lock for duplicates
*/
/*
If the SQL-query will update or replace
duplicate key we will take X-lock for
duplicates ( REPLACE, LOAD DATAFILE REPLACE,
INSERT ON DUPLICATE KEY UPDATE).
*/
err
=
row_ins_set_exclusive_rec_lock
(
LOCK_REC_NOT_GAP
,
rec
,
cursor
->
index
,
...
...
@@ -1713,12 +1718,12 @@ row_ins_duplicate_error_in_clust(
if
(
rec
!=
page_get_supremum_rec
(
page
))
{
/* The manual defines the REPLACE semantics that it
is either an INSERT or DELETE(s) for duplicate key
+ INSERT. Therefore, we should take X-lock for
duplicates. */
if
(
innobase_query_is_update
())
{
if
(
innobase_query_is_replace
())
{
/* If the SQL-query will update or replace
duplicate key we will take X-lock for
duplicates ( REPLACE, LOAD DATAFILE REPLACE,
INSERT ON DUPLICATE KEY UPDATE). */
err
=
row_ins_set_exclusive_rec_lock
(
LOCK_REC_NOT_GAP
,
...
...
mysql-test/r/func_sapdb.result
View file @
ccd4e77b
...
...
@@ -185,6 +185,7 @@ insert into test values
('2001-01-01 01:01:01', '-01:01:01', '-23:59:59', "1997-12-31 23:59:59.000001"),
('1997-12-31 23:59:59.000001', '-23:59:59', '-01:01:01', '2001-01-01 01:01:01'),
('2001-01-01 01:01:01', '01:01:01', '-1 01:01:01', null),
('2001-01-01 01:01:01', '-01:01:01', '1 01:01:01', '2001-01-01 01:01:01'),
('2001-01-01 01:01:01', null, '-1 01:01:01', null),
(null, null, null, null),
('2001-01-01 01:01:01', '01:01:01', '1 01:01:01', '2001-01-01 01:01:01');
...
...
@@ -194,6 +195,7 @@ ttt qqq
2001-01-01 00:00:00 -25:01:00
1997-12-31 00:00:00 -25:01:00
2001-01-01 02:02:02 -24:00:00
2001-01-01 00:00:00 24:00:00
NULL NULL
NULL NULL
2001-01-01 02:02:02 26:02:02
...
...
@@ -203,6 +205,7 @@ ttt qqq
26305:01:02 22:58:58
-26305:01:02 -22:58:58
NULL 26:02:02
00:00:00 -26:02:02
NULL NULL
NULL NULL
00:00:00 -24:00:00
...
...
mysql-test/t/func_sapdb.test
View file @
ccd4e77b
...
...
@@ -100,6 +100,7 @@ insert into test values
(
'2001-01-01 01:01:01'
,
'-01:01:01'
,
'-23:59:59'
,
"1997-12-31 23:59:59.000001"
),
(
'1997-12-31 23:59:59.000001'
,
'-23:59:59'
,
'-01:01:01'
,
'2001-01-01 01:01:01'
),
(
'2001-01-01 01:01:01'
,
'01:01:01'
,
'-1 01:01:01'
,
null
),
(
'2001-01-01 01:01:01'
,
'-01:01:01'
,
'1 01:01:01'
,
'2001-01-01 01:01:01'
),
(
'2001-01-01 01:01:01'
,
null
,
'-1 01:01:01'
,
null
),
(
null
,
null
,
null
,
null
),
(
'2001-01-01 01:01:01'
,
'01:01:01'
,
'1 01:01:01'
,
'2001-01-01 01:01:01'
);
...
...
ndb/test/ndbapi/Makefile.am
View file @
ccd4e77b
...
...
@@ -70,8 +70,8 @@ test_event_SOURCES = test_event.cpp
ndbapi_slow_select_SOURCES
=
slow_select.cpp
testReadPerf_SOURCES
=
testReadPerf.cpp
testLcp_SOURCES
=
testLcp.cpp
DbCreate_SOURCES
=
bench/mainPopulate.cpp bench/dbPopulate.cpp bench/userInterface.cpp
DbAsyncGenerator_SOURCES
=
bench/mainAsyncGenerator.cpp bench/asyncGenerator.cpp bench/ndb_async2.cpp
DbCreate_SOURCES
=
bench/mainPopulate.cpp bench/dbPopulate.cpp bench/userInterface.cpp
bench/dbPopulate.h bench/userInterface.h bench/testData.h bench/testDefinitions.h bench/ndb_schema.hpp bench/ndb_error.hpp
DbAsyncGenerator_SOURCES
=
bench/mainAsyncGenerator.cpp bench/asyncGenerator.cpp bench/ndb_async2.cpp
bench/dbGenerator.h bench/macros.h bench/userInterface.h bench/testData.h bench/testDefinitions.h bench/ndb_schema.hpp bench/ndb_error.hpp
INCLUDES_LOC
=
-I
$(top_srcdir)
/ndb/include/kernel
...
...
sql/ha_innodb.cc
View file @
ccd4e77b
...
...
@@ -5653,14 +5653,20 @@ innobase_get_at_most_n_mbchars(
extern
"C"
{
/**********************************************************************
This function returns true if SQL-query in the current thread
This function returns true if
1) SQL-query in the current thread
is either REPLACE or LOAD DATA INFILE REPLACE.
2) SQL-query in the current thread
is INSERT ON DUPLICATE KEY UPDATE.
NOTE that /mysql/innobase/row/row0ins.c must contain the
prototype for this function ! */
ibool
innobase_query_is_
replac
e
(
void
)
/*==========================
=
*/
innobase_query_is_
updat
e
(
void
)
/*==========================*/
{
THD
*
thd
;
...
...
@@ -5670,10 +5676,15 @@ innobase_query_is_replace(void)
thd
->
lex
->
sql_command
==
SQLCOM_REPLACE_SELECT
||
(
thd
->
lex
->
sql_command
==
SQLCOM_LOAD
&&
thd
->
lex
->
duplicates
==
DUP_REPLACE
))
{
return
true
;
}
else
{
return
false
;
return
(
1
);
}
if
(
thd
->
lex
->
sql_command
==
SQLCOM_INSERT
&&
thd
->
lex
->
duplicates
==
DUP_UPDATE
)
{
return
(
1
);
}
return
(
0
);
}
}
...
...
sql/item_timefunc.cc
View file @
ccd4e77b
...
...
@@ -761,6 +761,81 @@ static bool get_interval_info(const char *str,uint length,CHARSET_INFO *cs,
}
/*
Calculate difference between two datetime values as seconds + microseconds.
SYNOPSIS
calc_time_diff()
l_time1 - TIME/DATE/DATETIME value
l_time2 - TIME/DATE/DATETIME value
l_sign - 1 absolute values are substracted,
-1 absolute values are added.
seconds_out - Out parameter where difference between
l_time1 and l_time2 in seconds is stored.
microseconds_out- Out parameter where microsecond part of difference
between l_time1 and l_time2 is stored.
NOTE
This function calculates difference between l_time1 and l_time2 absolute
values. So one should set l_sign and correct result if he want to take
signs into account (i.e. for TIME values).
RETURN VALUES
Returns sign of difference.
1 means negative result
0 means positive result
*/
static
bool
calc_time_diff
(
TIME
*
l_time1
,
TIME
*
l_time2
,
int
l_sign
,
longlong
*
seconds_out
,
long
*
microseconds_out
)
{
long
days
;
bool
neg
;
longlong
microseconds
;
/*
We suppose that if first argument is MYSQL_TIMESTAMP_TIME
the second argument should be TIMESTAMP_TIME also.
We should check it before calc_time_diff call.
*/
if
(
l_time1
->
time_type
==
MYSQL_TIMESTAMP_TIME
)
// Time value
days
=
l_time1
->
day
-
l_sign
*
l_time2
->
day
;
else
{
days
=
calc_daynr
((
uint
)
l_time1
->
year
,
(
uint
)
l_time1
->
month
,
(
uint
)
l_time1
->
day
);
if
(
l_time2
->
time_type
==
MYSQL_TIMESTAMP_TIME
)
days
-=
l_sign
*
l_time2
->
day
;
else
days
-=
l_sign
*
calc_daynr
((
uint
)
l_time2
->
year
,
(
uint
)
l_time2
->
month
,
(
uint
)
l_time2
->
day
);
}
microseconds
=
((
longlong
)
days
*
LL
(
86400
)
+
(
longlong
)(
l_time1
->
hour
*
3600L
+
l_time1
->
minute
*
60L
+
l_time1
->
second
)
-
l_sign
*
(
longlong
)(
l_time2
->
hour
*
3600L
+
l_time2
->
minute
*
60L
+
l_time2
->
second
))
*
LL
(
1000000
)
+
(
longlong
)
l_time1
->
second_part
-
l_sign
*
(
longlong
)
l_time2
->
second_part
;
neg
=
0
;
if
(
microseconds
<
0
)
{
microseconds
=
-
microseconds
;
neg
=
1
;
}
*
seconds_out
=
microseconds
/
1000000L
;
*
microseconds_out
=
(
long
)
(
microseconds
%
1000000L
);
return
neg
;
}
longlong
Item_func_period_add
::
val_int
()
{
DBUG_ASSERT
(
fixed
==
1
);
...
...
@@ -2332,11 +2407,11 @@ String *Item_func_add_time::val_str(String *str)
DBUG_ASSERT
(
fixed
==
1
);
TIME
l_time1
,
l_time2
,
l_time3
;
bool
is_time
=
0
;
long
microseconds
,
seconds
,
days
=
0
;
long
days
,
microseconds
;
longlong
seconds
;
int
l_sign
=
sign
;
null_value
=
0
;
l_time3
.
neg
=
0
;
if
(
is_date
)
// TIMESTAMP function
{
if
(
get_arg0_date
(
&
l_time1
,
1
)
||
...
...
@@ -2352,51 +2427,26 @@ String *Item_func_add_time::val_str(String *str)
l_time2
.
time_type
==
MYSQL_TIMESTAMP_DATETIME
)
goto
null_date
;
is_time
=
(
l_time1
.
time_type
==
MYSQL_TIMESTAMP_TIME
);
if
(
is_time
&&
(
l_time2
.
neg
==
l_time1
.
neg
&&
l_time1
.
neg
))
l_time3
.
neg
=
1
;
}
if
(
l_time1
.
neg
!=
l_time2
.
neg
)
l_sign
=
-
l_sign
;
microseconds
=
l_time1
.
second_part
+
l_sign
*
l_time2
.
second_part
;
seconds
=
(
l_time1
.
hour
*
3600L
+
l_time1
.
minute
*
60L
+
l_time1
.
second
+
(
l_time2
.
day
*
86400L
+
l_time2
.
hour
*
3600L
+
l_time2
.
minute
*
60L
+
l_time2
.
second
)
*
l_sign
);
if
(
is_time
)
seconds
+=
l_time1
.
day
*
86400L
;
else
days
+=
calc_daynr
((
uint
)
l_time1
.
year
,(
uint
)
l_time1
.
month
,
(
uint
)
l_time1
.
day
);
seconds
=
seconds
+
microseconds
/
1000000L
;
microseconds
=
microseconds
%
1000000L
;
days
+=
seconds
/
86400L
;
seconds
=
seconds
%
86400L
;
l_time3
.
neg
=
calc_time_diff
(
&
l_time1
,
&
l_time2
,
-
l_sign
,
&
seconds
,
&
microseconds
);
if
(
microseconds
<
0
)
{
microseconds
+=
1000000L
;
seconds
--
;
}
if
(
seconds
<
0
)
{
days
+=
seconds
/
86400L
-
1
;
seconds
+=
86400L
;
}
if
(
days
<
0
)
{
if
(
!
is_time
)
goto
null_date
;
if
(
microseconds
)
{
microseconds
=
1000000L
-
microseconds
;
seconds
++
;
}
seconds
=
86400L
-
seconds
;
days
=
-
(
++
days
);
l_time3
.
neg
=
1
;
}
/*
If first argument was negative and diff between arguments
is non-zero we need to swap sign to get proper result.
*/
if
(
l_time1
.
neg
&&
(
seconds
||
microseconds
))
l_time3
.
neg
=
1
-
l_time3
.
neg
;
// Swap sign of result
calc_time_from_sec
(
&
l_time3
,
seconds
,
microseconds
);
if
(
!
is_time
&&
l_time3
.
neg
)
goto
null_date
;
days
=
(
long
)(
seconds
/
86400L
);
calc_time_from_sec
(
&
l_time3
,
(
long
)(
seconds
%
86400L
),
microseconds
);
if
(
!
is_time
)
{
get_date_from_daynr
(
days
,
&
l_time3
.
year
,
&
l_time3
.
month
,
&
l_time3
.
day
);
...
...
@@ -2452,8 +2502,8 @@ void Item_func_add_time::print(String *str)
String
*
Item_func_timediff
::
val_str
(
String
*
str
)
{
DBUG_ASSERT
(
fixed
==
1
);
longlong
micro
seconds
;
long
day
s
;
longlong
seconds
;
long
microsecond
s
;
int
l_sign
=
1
;
TIME
l_time1
,
l_time2
,
l_time3
;
...
...
@@ -2466,33 +2516,18 @@ String *Item_func_timediff::val_str(String *str)
if
(
l_time1
.
neg
!=
l_time2
.
neg
)
l_sign
=
-
l_sign
;
if
(
l_time1
.
time_type
==
MYSQL_TIMESTAMP_TIME
)
// Time value
days
=
l_time1
.
day
-
l_sign
*
l_time2
.
day
;
else
// DateTime value
days
=
(
calc_daynr
((
uint
)
l_time1
.
year
,
(
uint
)
l_time1
.
month
,
(
uint
)
l_time1
.
day
)
-
l_sign
*
calc_daynr
((
uint
)
l_time2
.
year
,
(
uint
)
l_time2
.
month
,
(
uint
)
l_time2
.
day
));
microseconds
=
((
longlong
)
days
*
86400L
+
l_time1
.
hour
*
3600L
+
l_time1
.
minute
*
60L
+
l_time1
.
second
-
(
longlong
)
l_sign
*
(
l_time2
.
hour
*
3600L
+
l_time2
.
minute
*
60L
+
l_time2
.
second
))
*
1000000
+
l_time1
.
second_part
-
l_sign
*
l_time2
.
second_part
;
l_time3
.
neg
=
0
;
if
(
microseconds
<
0
)
{
microseconds
=
-
microseconds
;
l_time3
.
neg
=
1
;
}
if
((
l_time2
.
neg
==
l_time1
.
neg
)
&&
l_time1
.
neg
&&
microseconds
)
l_time3
.
neg
=
l_time3
.
neg
?
0
:
1
;
l_time3
.
neg
=
calc_time_diff
(
&
l_time1
,
&
l_time2
,
l_sign
,
&
seconds
,
&
microseconds
);
/*
For MYSQL_TIMESTAMP_TIME only:
If first argument was negative and diff between arguments
is non-zero we need to swap sign to get proper result.
*/
if
(
l_time1
.
neg
&&
(
seconds
||
microseconds
))
l_time3
.
neg
=
1
-
l_time3
.
neg
;
// Swap sign of result
calc_time_from_sec
(
&
l_time3
,
(
long
)(
microseconds
/
1000000
),
(
long
)(
microseconds
%
1000000
));
calc_time_from_sec
(
&
l_time3
,
(
long
)
seconds
,
microseconds
);
if
(
!
make_datetime
(
l_time1
.
second_part
||
l_time2
.
second_part
?
TIME_MICROSECOND
:
TIME_ONLY
,
...
...
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