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
6d690898
Commit
6d690898
authored
Dec 16, 2009
by
MySQL Build Team
Browse files
Options
Browse Files
Download
Plain Diff
Merge
parents
d24b8794
c5e6a11e
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
501 additions
and
106 deletions
+501
-106
mysql-test/r/select.result
mysql-test/r/select.result
+25
-0
mysql-test/r/show_check.result
mysql-test/r/show_check.result
+6
-0
mysql-test/r/type_year.result
mysql-test/r/type_year.result
+264
-0
mysql-test/t/select.test
mysql-test/t/select.test
+23
-0
mysql-test/t/show_check.test
mysql-test/t/show_check.test
+22
-0
mysql-test/t/type_year.test
mysql-test/t/type_year.test
+106
-0
sql/item_cmpfunc.cc
sql/item_cmpfunc.cc
+50
-98
sql/item_cmpfunc.h
sql/item_cmpfunc.h
+4
-7
sql/sql_show.cc
sql/sql_show.cc
+1
-1
No files found.
mysql-test/r/select.result
View file @
6d690898
...
@@ -4609,4 +4609,29 @@ HAVING v <= 't'
...
@@ -4609,4 +4609,29 @@ HAVING v <= 't'
ORDER BY pk;
ORDER BY pk;
v
v
DROP TABLE t1;
DROP TABLE t1;
#
# Bug#49489 Uninitialized cache led to a wrong result.
#
CREATE TABLE t1(c1 DOUBLE(5,4));
INSERT INTO t1 VALUES (9.1234);
SELECT * FROM t1 WHERE c1 < 9.12345;
c1
9.1234
DROP TABLE t1;
# End of test for bug#49489.
#
# Bug #49517: Inconsistent behavior while using
# NULLable BIGINT and INT columns in comparison
#
CREATE TABLE t1(a BIGINT UNSIGNED NOT NULL, b BIGINT NULL, c INT NULL);
INSERT INTO t1 VALUES(105, NULL, NULL);
SELECT * FROM t1 WHERE b < 102;
a b c
SELECT * FROM t1 WHERE c < 102;
a b c
SELECT * FROM t1 WHERE 102 < b;
a b c
SELECT * FROM t1 WHERE 102 < c;
a b c
DROP TABLE t1;
End of 5.1 tests
End of 5.1 tests
mysql-test/r/show_check.result
View file @
6d690898
...
@@ -1454,4 +1454,10 @@ GRANT PROCESS ON *.* TO test_u@localhost;
...
@@ -1454,4 +1454,10 @@ GRANT PROCESS ON *.* TO test_u@localhost;
SHOW ENGINE MYISAM MUTEX;
SHOW ENGINE MYISAM MUTEX;
SHOW ENGINE MYISAM STATUS;
SHOW ENGINE MYISAM STATUS;
DROP USER test_u@localhost;
DROP USER test_u@localhost;
#
# Bug #48985: show create table crashes if previous access to the table
# was killed
#
SHOW CREATE TABLE non_existent;
ERROR 70100: Query execution was interrupted
End of 5.1 tests
End of 5.1 tests
mysql-test/r/type_year.result
View file @
6d690898
...
@@ -46,3 +46,267 @@ a
...
@@ -46,3 +46,267 @@ a
2001
2001
drop table t1;
drop table t1;
End of 5.0 tests
End of 5.0 tests
#
# Bug #49480: WHERE using YEAR columns returns unexpected results
#
CREATE TABLE t2(yy YEAR(2), c2 CHAR(4));
CREATE TABLE t4(yyyy YEAR(4), c4 CHAR(4));
INSERT INTO t2 (c2) VALUES (NULL),(1970),(1999),(2000),(2001),(2069);
INSERT INTO t4 (c4) SELECT c2 FROM t2;
UPDATE t2 SET yy = c2;
UPDATE t4 SET yyyy = c4;
SELECT * FROM t2;
yy c2
NULL NULL
70 1970
99 1999
00 2000
01 2001
69 2069
SELECT * FROM t4;
yyyy c4
NULL NULL
1970 1970
1999 1999
2000 2000
2001 2001
2069 2069
# Comparison of YEAR(2) with YEAR(4)
SELECT * FROM t2, t4 WHERE yy = yyyy;
yy c2 yyyy c4
70 1970 1970 1970
99 1999 1999 1999
00 2000 2000 2000
01 2001 2001 2001
69 2069 2069 2069
SELECT * FROM t2, t4 WHERE yy <=> yyyy;
yy c2 yyyy c4
NULL NULL NULL NULL
70 1970 1970 1970
99 1999 1999 1999
00 2000 2000 2000
01 2001 2001 2001
69 2069 2069 2069
SELECT * FROM t2, t4 WHERE yy < yyyy;
yy c2 yyyy c4
70 1970 1999 1999
70 1970 2000 2000
99 1999 2000 2000
70 1970 2001 2001
99 1999 2001 2001
00 2000 2001 2001
70 1970 2069 2069
99 1999 2069 2069
00 2000 2069 2069
01 2001 2069 2069
SELECT * FROM t2, t4 WHERE yy > yyyy;
yy c2 yyyy c4
99 1999 1970 1970
00 2000 1970 1970
01 2001 1970 1970
69 2069 1970 1970
00 2000 1999 1999
01 2001 1999 1999
69 2069 1999 1999
01 2001 2000 2000
69 2069 2000 2000
69 2069 2001 2001
# Comparison of YEAR(2) with YEAR(2)
SELECT * FROM t2 a, t2 b WHERE a.yy = b.yy;
yy c2 yy c2
70 1970 70 1970
99 1999 99 1999
00 2000 00 2000
01 2001 01 2001
69 2069 69 2069
SELECT * FROM t2 a, t2 b WHERE a.yy <=> b.yy;
yy c2 yy c2
NULL NULL NULL NULL
70 1970 70 1970
99 1999 99 1999
00 2000 00 2000
01 2001 01 2001
69 2069 69 2069
SELECT * FROM t2 a, t2 b WHERE a.yy < b.yy;
yy c2 yy c2
70 1970 99 1999
70 1970 00 2000
99 1999 00 2000
70 1970 01 2001
99 1999 01 2001
00 2000 01 2001
70 1970 69 2069
99 1999 69 2069
00 2000 69 2069
01 2001 69 2069
# Comparison of YEAR(4) with YEAR(4)
SELECT * FROM t4 a, t4 b WHERE a.yyyy = b.yyyy;
yyyy c4 yyyy c4
1970 1970 1970 1970
1999 1999 1999 1999
2000 2000 2000 2000
2001 2001 2001 2001
2069 2069 2069 2069
SELECT * FROM t4 a, t4 b WHERE a.yyyy <=> b.yyyy;
yyyy c4 yyyy c4
NULL NULL NULL NULL
1970 1970 1970 1970
1999 1999 1999 1999
2000 2000 2000 2000
2001 2001 2001 2001
2069 2069 2069 2069
SELECT * FROM t4 a, t4 b WHERE a.yyyy < b.yyyy;
yyyy c4 yyyy c4
1970 1970 1999 1999
1970 1970 2000 2000
1999 1999 2000 2000
1970 1970 2001 2001
1999 1999 2001 2001
2000 2000 2001 2001
1970 1970 2069 2069
1999 1999 2069 2069
2000 2000 2069 2069
2001 2001 2069 2069
# Comparison with constants:
SELECT * FROM t2 WHERE yy = NULL;
yy c2
SELECT * FROM t4 WHERE yyyy = NULL;
yyyy c4
SELECT * FROM t2 WHERE yy <=> NULL;
yy c2
NULL NULL
SELECT * FROM t4 WHERE yyyy <=> NULL;
yyyy c4
NULL NULL
SELECT * FROM t2 WHERE yy < NULL;
yy c2
SELECT * FROM t2 WHERE yy > NULL;
yy c2
SELECT * FROM t2 WHERE yy = NOW();
yy c2
SELECT * FROM t4 WHERE yyyy = NOW();
yyyy c4
SELECT * FROM t2 WHERE yy = 99;
yy c2
99 1999
SELECT * FROM t2 WHERE 99 = yy;
yy c2
99 1999
SELECT * FROM t4 WHERE yyyy = 99;
yyyy c4
1999 1999
SELECT * FROM t2 WHERE yy = 'test';
yy c2
00 2000
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'test'
SELECT * FROM t4 WHERE yyyy = 'test';
yyyy c4
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'test'
SELECT * FROM t2 WHERE yy = '1999';
yy c2
99 1999
SELECT * FROM t4 WHERE yyyy = '1999';
yyyy c4
1999 1999
SELECT * FROM t2 WHERE yy = 1999;
yy c2
99 1999
SELECT * FROM t4 WHERE yyyy = 1999;
yyyy c4
1999 1999
SELECT * FROM t2 WHERE yy = 1999.1;
yy c2
99 1999
SELECT * FROM t4 WHERE yyyy = 1999.1;
yyyy c4
1999 1999
SELECT * FROM t2 WHERE yy = 1998.9;
yy c2
99 1999
SELECT * FROM t4 WHERE yyyy = 1998.9;
yyyy c4
1999 1999
# Coverage tests for YEAR with zero/2000 constants:
SELECT * FROM t2 WHERE yy = 0;
yy c2
00 2000
SELECT * FROM t2 WHERE yy = '0';
yy c2
00 2000
SELECT * FROM t2 WHERE yy = '0000';
yy c2
00 2000
SELECT * FROM t2 WHERE yy = '2000';
yy c2
00 2000
SELECT * FROM t2 WHERE yy = 2000;
yy c2
00 2000
SELECT * FROM t4 WHERE yyyy = 0;
yyyy c4
SELECT * FROM t4 WHERE yyyy = '0';
yyyy c4
2000 2000
SELECT * FROM t4 WHERE yyyy = '0000';
yyyy c4
SELECT * FROM t4 WHERE yyyy = '2000';
yyyy c4
2000 2000
SELECT * FROM t4 WHERE yyyy = 2000;
yyyy c4
2000 2000
# Comparison with constants those are out of YEAR range
# (coverage test for backward compatibility)
SELECT COUNT(yy) FROM t2;
COUNT(yy)
5
SELECT COUNT(yyyy) FROM t4;
COUNT(yyyy)
5
SELECT COUNT(*) FROM t2 WHERE yy = -1;
COUNT(*)
0
SELECT COUNT(*) FROM t4 WHERE yyyy > -1;
COUNT(*)
5
SELECT COUNT(*) FROM t2 WHERE yy > -1000000000000000000;
COUNT(*)
5
SELECT COUNT(*) FROM t4 WHERE yyyy > -1000000000000000000;
COUNT(*)
5
SELECT COUNT(*) FROM t2 WHERE yy < 2156;
COUNT(*)
5
SELECT COUNT(*) FROM t4 WHERE yyyy < 2156;
COUNT(*)
5
SELECT COUNT(*) FROM t2 WHERE yy < 1000000000000000000;
COUNT(*)
5
SELECT COUNT(*) FROM t4 WHERE yyyy < 1000000000000000000;
COUNT(*)
5
SELECT * FROM t2 WHERE yy < 123;
yy c2
70 1970
99 1999
00 2000
01 2001
69 2069
SELECT * FROM t2 WHERE yy > 123;
yy c2
SELECT * FROM t4 WHERE yyyy < 123;
yyyy c4
SELECT * FROM t4 WHERE yyyy > 123;
yyyy c4
1970 1970
1999 1999
2000 2000
2001 2001
2069 2069
DROP TABLE t2, t4;
#
End of 5.1 tests
mysql-test/t/select.test
View file @
6d690898
...
@@ -3964,4 +3964,27 @@ ORDER BY pk;
...
@@ -3964,4 +3964,27 @@ ORDER BY pk;
DROP
TABLE
t1
;
DROP
TABLE
t1
;
--
echo
#
--
echo
# Bug#49489 Uninitialized cache led to a wrong result.
--
echo
#
CREATE
TABLE
t1
(
c1
DOUBLE
(
5
,
4
));
INSERT
INTO
t1
VALUES
(
9.1234
);
SELECT
*
FROM
t1
WHERE
c1
<
9.12345
;
DROP
TABLE
t1
;
--
echo
# End of test for bug#49489.
--
echo
#
--
echo
# Bug #49517: Inconsistent behavior while using
--
echo
# NULLable BIGINT and INT columns in comparison
--
echo
#
CREATE
TABLE
t1
(
a
BIGINT
UNSIGNED
NOT
NULL
,
b
BIGINT
NULL
,
c
INT
NULL
);
INSERT
INTO
t1
VALUES
(
105
,
NULL
,
NULL
);
SELECT
*
FROM
t1
WHERE
b
<
102
;
SELECT
*
FROM
t1
WHERE
c
<
102
;
SELECT
*
FROM
t1
WHERE
102
<
b
;
SELECT
*
FROM
t1
WHERE
102
<
c
;
DROP
TABLE
t1
;
--
echo
End
of
5.1
tests
--
echo
End
of
5.1
tests
mysql-test/t/show_check.test
View file @
6d690898
...
@@ -1207,6 +1207,28 @@ connection default;
...
@@ -1207,6 +1207,28 @@ connection default;
DROP
USER
test_u
@
localhost
;
DROP
USER
test_u
@
localhost
;
--
echo
#
--
echo
# Bug #48985: show create table crashes if previous access to the table
--
echo
# was killed
--
echo
#
connect
(
con1
,
localhost
,
root
,,);
CONNECTION
con1
;
LET
$ID
=
`SELECT connection_id()`
;
CONNECTION
default
;
--
disable_query_log
eval
KILL
QUERY
$ID
;
--
enable_query_log
CONNECTION
con1
;
--
error
ER_QUERY_INTERRUPTED
SHOW
CREATE
TABLE
non_existent
;
CONNECTION
default
;
DISCONNECT
con1
;
--
echo
End
of
5.1
tests
--
echo
End
of
5.1
tests
# Wait till all disconnects are completed
# Wait till all disconnects are completed
...
...
mysql-test/t/type_year.test
View file @
6d690898
...
@@ -30,3 +30,109 @@ select * from t1;
...
@@ -30,3 +30,109 @@ select * from t1;
drop
table
t1
;
drop
table
t1
;
--
echo
End
of
5.0
tests
--
echo
End
of
5.0
tests
--
echo
#
--
echo
# Bug #49480: WHERE using YEAR columns returns unexpected results
--
echo
#
CREATE
TABLE
t2
(
yy
YEAR
(
2
),
c2
CHAR
(
4
));
CREATE
TABLE
t4
(
yyyy
YEAR
(
4
),
c4
CHAR
(
4
));
INSERT
INTO
t2
(
c2
)
VALUES
(
NULL
),(
1970
),(
1999
),(
2000
),(
2001
),(
2069
);
INSERT
INTO
t4
(
c4
)
SELECT
c2
FROM
t2
;
UPDATE
t2
SET
yy
=
c2
;
UPDATE
t4
SET
yyyy
=
c4
;
SELECT
*
FROM
t2
;
SELECT
*
FROM
t4
;
--
echo
# Comparison of YEAR(2) with YEAR(4)
SELECT
*
FROM
t2
,
t4
WHERE
yy
=
yyyy
;
SELECT
*
FROM
t2
,
t4
WHERE
yy
<=>
yyyy
;
SELECT
*
FROM
t2
,
t4
WHERE
yy
<
yyyy
;
SELECT
*
FROM
t2
,
t4
WHERE
yy
>
yyyy
;
--
echo
# Comparison of YEAR(2) with YEAR(2)
SELECT
*
FROM
t2
a
,
t2
b
WHERE
a
.
yy
=
b
.
yy
;
SELECT
*
FROM
t2
a
,
t2
b
WHERE
a
.
yy
<=>
b
.
yy
;
SELECT
*
FROM
t2
a
,
t2
b
WHERE
a
.
yy
<
b
.
yy
;
--
echo
# Comparison of YEAR(4) with YEAR(4)
SELECT
*
FROM
t4
a
,
t4
b
WHERE
a
.
yyyy
=
b
.
yyyy
;
SELECT
*
FROM
t4
a
,
t4
b
WHERE
a
.
yyyy
<=>
b
.
yyyy
;
SELECT
*
FROM
t4
a
,
t4
b
WHERE
a
.
yyyy
<
b
.
yyyy
;
--
echo
# Comparison with constants:
SELECT
*
FROM
t2
WHERE
yy
=
NULL
;
SELECT
*
FROM
t4
WHERE
yyyy
=
NULL
;
SELECT
*
FROM
t2
WHERE
yy
<=>
NULL
;
SELECT
*
FROM
t4
WHERE
yyyy
<=>
NULL
;
SELECT
*
FROM
t2
WHERE
yy
<
NULL
;
SELECT
*
FROM
t2
WHERE
yy
>
NULL
;
SELECT
*
FROM
t2
WHERE
yy
=
NOW
();
SELECT
*
FROM
t4
WHERE
yyyy
=
NOW
();
SELECT
*
FROM
t2
WHERE
yy
=
99
;
SELECT
*
FROM
t2
WHERE
99
=
yy
;
SELECT
*
FROM
t4
WHERE
yyyy
=
99
;
SELECT
*
FROM
t2
WHERE
yy
=
'test'
;
SELECT
*
FROM
t4
WHERE
yyyy
=
'test'
;
SELECT
*
FROM
t2
WHERE
yy
=
'1999'
;
SELECT
*
FROM
t4
WHERE
yyyy
=
'1999'
;
SELECT
*
FROM
t2
WHERE
yy
=
1999
;
SELECT
*
FROM
t4
WHERE
yyyy
=
1999
;
SELECT
*
FROM
t2
WHERE
yy
=
1999.1
;
SELECT
*
FROM
t4
WHERE
yyyy
=
1999.1
;
SELECT
*
FROM
t2
WHERE
yy
=
1998.9
;
SELECT
*
FROM
t4
WHERE
yyyy
=
1998.9
;
--
echo
# Coverage tests for YEAR with zero/2000 constants:
SELECT
*
FROM
t2
WHERE
yy
=
0
;
SELECT
*
FROM
t2
WHERE
yy
=
'0'
;
SELECT
*
FROM
t2
WHERE
yy
=
'0000'
;
SELECT
*
FROM
t2
WHERE
yy
=
'2000'
;
SELECT
*
FROM
t2
WHERE
yy
=
2000
;
SELECT
*
FROM
t4
WHERE
yyyy
=
0
;
SELECT
*
FROM
t4
WHERE
yyyy
=
'0'
;
SELECT
*
FROM
t4
WHERE
yyyy
=
'0000'
;
SELECT
*
FROM
t4
WHERE
yyyy
=
'2000'
;
SELECT
*
FROM
t4
WHERE
yyyy
=
2000
;
--
echo
# Comparison with constants those are out of YEAR range
--
echo
# (coverage test for backward compatibility)
SELECT
COUNT
(
yy
)
FROM
t2
;
SELECT
COUNT
(
yyyy
)
FROM
t4
;
SELECT
COUNT
(
*
)
FROM
t2
WHERE
yy
=
-
1
;
SELECT
COUNT
(
*
)
FROM
t4
WHERE
yyyy
>
-
1
;
SELECT
COUNT
(
*
)
FROM
t2
WHERE
yy
>
-
1000000000000000000
;
SELECT
COUNT
(
*
)
FROM
t4
WHERE
yyyy
>
-
1000000000000000000
;
SELECT
COUNT
(
*
)
FROM
t2
WHERE
yy
<
2156
;
SELECT
COUNT
(
*
)
FROM
t4
WHERE
yyyy
<
2156
;
SELECT
COUNT
(
*
)
FROM
t2
WHERE
yy
<
1000000000000000000
;
SELECT
COUNT
(
*
)
FROM
t4
WHERE
yyyy
<
1000000000000000000
;
SELECT
*
FROM
t2
WHERE
yy
<
123
;
SELECT
*
FROM
t2
WHERE
yy
>
123
;
SELECT
*
FROM
t4
WHERE
yyyy
<
123
;
SELECT
*
FROM
t4
WHERE
yyyy
>
123
;
DROP
TABLE
t2
,
t4
;
--
echo
#
--
echo
End
of
5.1
tests
sql/item_cmpfunc.cc
View file @
6d690898
...
@@ -895,9 +895,9 @@ int Arg_comparator::set_cmp_func(Item_result_field *owner_arg,
...
@@ -895,9 +895,9 @@ int Arg_comparator::set_cmp_func(Item_result_field *owner_arg,
ulonglong
const_value
=
(
ulonglong
)
-
1
;
ulonglong
const_value
=
(
ulonglong
)
-
1
;
thd
=
current_thd
;
thd
=
current_thd
;
owner
=
owner_arg
;
owner
=
owner_arg
;
set_null
=
set_null
&&
owner_arg
;
a
=
a1
;
a
=
a1
;
b
=
a2
;
b
=
a2
;
owner
=
owner_arg
;
thd
=
current_thd
;
thd
=
current_thd
;
if
((
cmp_type
=
can_compare_as_dates
(
*
a
,
*
b
,
&
const_value
)))
if
((
cmp_type
=
can_compare_as_dates
(
*
a
,
*
b
,
&
const_value
)))
...
@@ -956,47 +956,55 @@ int Arg_comparator::set_cmp_func(Item_result_field *owner_arg,
...
@@ -956,47 +956,55 @@ int Arg_comparator::set_cmp_func(Item_result_field *owner_arg,
if
(
agg_item_set_converter
(
coll
,
owner
->
func_name
(),
if
(
agg_item_set_converter
(
coll
,
owner
->
func_name
(),
b
,
1
,
MY_COLL_CMP_CONV
,
1
))
b
,
1
,
MY_COLL_CMP_CONV
,
1
))
return
1
;
return
1
;
}
else
if
(
type
!=
ROW_RESULT
&&
((
*
a
)
->
field_type
()
==
MYSQL_TYPE_YEAR
||
}
(
*
b
)
->
field_type
()
==
MYSQL_TYPE_YEAR
))
else
if
(
try_year_cmp_func
(
type
))
{
return
0
;
is_nulls_eq
=
is_owner_equal_func
();
year_as_datetime
=
FALSE
;
a
=
cache_converted_constant
(
thd
,
a
,
&
a_cache
,
type
);
b
=
cache_converted_constant
(
thd
,
b
,
&
b_cache
,
type
);
return
set_compare_func
(
owner_arg
,
type
);
}
/*
Helper function to call from Arg_comparator::set_cmp_func()
*/
bool
Arg_comparator
::
try_year_cmp_func
(
Item_result
type
)
{
if
(
type
==
ROW_RESULT
)
return
FALSE
;
bool
a_is_year
=
(
*
a
)
->
field_type
()
==
MYSQL_TYPE_YEAR
;
bool
b_is_year
=
(
*
b
)
->
field_type
()
==
MYSQL_TYPE_YEAR
;
if
(
!
a_is_year
&&
!
b_is_year
)
return
FALSE
;
if
((
*
a
)
->
is_datetime
()
)
if
(
a_is_year
&&
b_is_year
)
{
{
year_as_datetime
=
TRUE
;
get_value_a_func
=
&
get_datetime_value
;
}
else
if
((
*
a
)
->
field_type
()
==
MYSQL_TYPE_YEAR
)
get_value_a_func
=
&
get_year_value
;
get_value_a_func
=
&
get_year_value
;
else
get_value_b_func
=
&
get_year_value
;
{
/*
Because convert_constant_item is called only for EXECUTE in PS mode
the value of get_value_x_func set in PREPARE might be not
valid for EXECUTE.
*/
get_value_a_func
=
NULL
;
}
}
else
if
(
a_is_year
&&
(
*
b
)
->
is_datetime
())
if
((
*
b
)
->
is_datetime
())
{
{
year_as_datetime
=
TRUE
;
get_value_a_func
=
&
get_year_value
;
get_value_b_func
=
&
get_datetime_value
;
get_value_b_func
=
&
get_datetime_value
;
}
else
if
((
*
b
)
->
field_type
()
==
MYSQL_TYPE_YEAR
)
}
else
if
(
b_is_year
&&
(
*
a
)
->
is_datetime
())
{
get_value_b_func
=
&
get_year_value
;
get_value_b_func
=
&
get_year_value
;
get_value_a_func
=
&
get_datetime_value
;
}
else
else
get_value_b_func
=
NULL
;
return
FALSE
;
func
=
&
Arg_comparator
::
compare_year
;
is_nulls_eq
=
is_owner_equal_func
();
return
0
;
func
=
&
Arg_comparator
::
compare_datetime
;
}
a
=
cache_converted_constant
(
thd
,
a
,
&
a_cache
,
type
);
return
TRUE
;
b
=
cache_converted_constant
(
thd
,
b
,
&
b_cache
,
type
);
return
set_compare_func
(
owner_arg
,
type
);
}
}
/**
/**
Convert and cache a constant.
Convert and cache a constant.
...
@@ -1023,7 +1031,7 @@ Item** Arg_comparator::cache_converted_constant(THD *thd, Item **value,
...
@@ -1023,7 +1031,7 @@ Item** Arg_comparator::cache_converted_constant(THD *thd, Item **value,
(
*
value
)
->
const_item
()
&&
type
!=
(
*
value
)
->
result_type
())
(
*
value
)
->
const_item
()
&&
type
!=
(
*
value
)
->
result_type
())
{
{
Item_cache
*
cache
=
Item_cache
::
get_cache
(
*
value
,
type
);
Item_cache
*
cache
=
Item_cache
::
get_cache
(
*
value
,
type
);
cache
->
s
tore
(
*
value
);
cache
->
s
etup
(
*
value
);
*
cache_item
=
cache
;
*
cache_item
=
cache
;
return
cache_item
;
return
cache_item
;
}
}
...
@@ -1147,7 +1155,7 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
...
@@ -1147,7 +1155,7 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
/*
/*
Retrieves YEAR value of 19XX form from given item.
Retrieves YEAR value of 19XX
-00-00 00:00:00
form from given item.
SYNOPSIS
SYNOPSIS
get_year_value()
get_year_value()
...
@@ -1159,7 +1167,9 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
...
@@ -1159,7 +1167,9 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
DESCRIPTION
DESCRIPTION
Retrieves the YEAR value of 19XX form from given item for comparison by the
Retrieves the YEAR value of 19XX form from given item for comparison by the
compare_year() function.
compare_datetime() function.
Converts year to DATETIME of form YYYY-00-00 00:00:00 for the compatibility
with the get_datetime_value function result.
RETURN
RETURN
obtained value
obtained value
...
@@ -1186,6 +1196,9 @@ get_year_value(THD *thd, Item ***item_arg, Item **cache_arg,
...
@@ -1186,6 +1196,9 @@ get_year_value(THD *thd, Item ***item_arg, Item **cache_arg,
if
(
value
<=
1900
)
if
(
value
<=
1900
)
value
+=
1900
;
value
+=
1900
;
/* Convert year to DATETIME of form YYYY-00-00 00:00:00 (YYYY0000000000). */
value
*=
10000000000LL
;
return
value
;
return
value
;
}
}
...
@@ -1615,67 +1628,6 @@ int Arg_comparator::compare_e_row()
...
@@ -1615,67 +1628,6 @@ int Arg_comparator::compare_e_row()
}
}
/**
Compare values as YEAR.
@details
Compare items as YEAR for EQUAL_FUNC and for other comparison functions.
The YEAR values of form 19XX are obtained with help of the get_year_value()
function.
If one of arguments is of DATE/DATETIME type its value is obtained
with help of the get_datetime_value function. In this case YEAR values
prior to comparison are converted to the ulonglong YYYY-00-00 00:00:00
DATETIME form.
If an argument type neither YEAR nor DATE/DATEIME then val_int function
is used to obtain value for comparison.
RETURN
If is_nulls_eq is TRUE:
1 if items are equal or both are null
0 otherwise
If is_nulls_eq is FALSE:
-1 a < b
0 a == b or at least one of items is null
1 a > b
See the table:
is_nulls_eq | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
a_is_null | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
b_is_null | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
result | 1 | 0 | 0 |0/1| 0 | 0 | 0 |-1/0/1|
*/
int
Arg_comparator
::
compare_year
()
{
bool
a_is_null
,
b_is_null
;
ulonglong
val1
=
get_value_a_func
?
(
*
get_value_a_func
)(
thd
,
&
a
,
&
a_cache
,
*
b
,
&
a_is_null
)
:
(
*
a
)
->
val_int
();
ulonglong
val2
=
get_value_b_func
?
(
*
get_value_b_func
)(
thd
,
&
b
,
&
b_cache
,
*
a
,
&
b_is_null
)
:
(
*
b
)
->
val_int
();
if
(
!
(
*
a
)
->
null_value
)
{
if
(
!
(
*
b
)
->
null_value
)
{
if
(
set_null
)
owner
->
null_value
=
0
;
/* Convert year to DATETIME of form YYYY-00-00 00:00:00 when necessary. */
if
((
*
a
)
->
field_type
()
==
MYSQL_TYPE_YEAR
&&
year_as_datetime
)
val1
*=
10000000000LL
;
if
((
*
b
)
->
field_type
()
==
MYSQL_TYPE_YEAR
&&
year_as_datetime
)
val2
*=
10000000000LL
;
if
(
val1
<
val2
)
return
is_nulls_eq
?
0
:
-
1
;
if
(
val1
==
val2
)
return
is_nulls_eq
?
1
:
0
;
return
is_nulls_eq
?
0
:
1
;
}
}
if
(
set_null
)
owner
->
null_value
=
is_nulls_eq
?
0
:
1
;
return
(
is_nulls_eq
&&
(
*
a
)
->
null_value
==
(
*
b
)
->
null_value
)
?
1
:
0
;
}
void
Item_func_truth
::
fix_length_and_dec
()
void
Item_func_truth
::
fix_length_and_dec
()
{
{
maybe_null
=
0
;
maybe_null
=
0
;
...
...
sql/item_cmpfunc.h
View file @
6d690898
...
@@ -42,24 +42,22 @@ class Arg_comparator: public Sql_alloc
...
@@ -42,24 +42,22 @@ class Arg_comparator: public Sql_alloc
bool
is_nulls_eq
;
// TRUE <=> compare for the EQUAL_FUNC
bool
is_nulls_eq
;
// TRUE <=> compare for the EQUAL_FUNC
bool
set_null
;
// TRUE <=> set owner->null_value
bool
set_null
;
// TRUE <=> set owner->null_value
// when one of arguments is NULL.
// when one of arguments is NULL.
bool
year_as_datetime
;
// TRUE <=> convert YEAR value to
// the YYYY-00-00 00:00:00 DATETIME
// format. See compare_year.
enum
enum_date_cmp_type
{
CMP_DATE_DFLT
=
0
,
CMP_DATE_WITH_DATE
,
enum
enum_date_cmp_type
{
CMP_DATE_DFLT
=
0
,
CMP_DATE_WITH_DATE
,
CMP_DATE_WITH_STR
,
CMP_STR_WITH_DATE
};
CMP_DATE_WITH_STR
,
CMP_STR_WITH_DATE
};
longlong
(
*
get_value_a_func
)(
THD
*
thd
,
Item
***
item_arg
,
Item
**
cache_arg
,
longlong
(
*
get_value_a_func
)(
THD
*
thd
,
Item
***
item_arg
,
Item
**
cache_arg
,
Item
*
warn_item
,
bool
*
is_null
);
Item
*
warn_item
,
bool
*
is_null
);
longlong
(
*
get_value_b_func
)(
THD
*
thd
,
Item
***
item_arg
,
Item
**
cache_arg
,
longlong
(
*
get_value_b_func
)(
THD
*
thd
,
Item
***
item_arg
,
Item
**
cache_arg
,
Item
*
warn_item
,
bool
*
is_null
);
Item
*
warn_item
,
bool
*
is_null
);
bool
try_year_cmp_func
(
Item_result
type
);
public:
public:
DTCollation
cmp_collation
;
DTCollation
cmp_collation
;
/* Allow owner function to use string buffers. */
/* Allow owner function to use string buffers. */
String
value1
,
value2
;
String
value1
,
value2
;
Arg_comparator
()
:
thd
(
0
),
a_cache
(
0
),
b_cache
(
0
),
set_null
(
0
),
Arg_comparator
()
:
thd
(
0
),
a_cache
(
0
),
b_cache
(
0
),
set_null
(
TRUE
),
year_as_datetime
(
0
),
get_value_a_func
(
0
),
get_value_b_func
(
0
)
{};
get_value_a_func
(
0
),
get_value_b_func
(
0
)
{};
Arg_comparator
(
Item
**
a1
,
Item
**
a2
)
:
a
(
a1
),
b
(
a2
),
thd
(
0
),
Arg_comparator
(
Item
**
a1
,
Item
**
a2
)
:
a
(
a1
),
b
(
a2
),
thd
(
0
),
a_cache
(
0
),
b_cache
(
0
),
set_null
(
0
),
year_as_datetime
(
0
),
a_cache
(
0
),
b_cache
(
0
),
set_null
(
TRUE
),
get_value_a_func
(
0
),
get_value_b_func
(
0
)
{};
get_value_a_func
(
0
),
get_value_b_func
(
0
)
{};
int
set_compare_func
(
Item_result_field
*
owner
,
Item_result
type
);
int
set_compare_func
(
Item_result_field
*
owner
,
Item_result
type
);
...
@@ -101,7 +99,6 @@ public:
...
@@ -101,7 +99,6 @@ public:
int
compare_real_fixed
();
int
compare_real_fixed
();
int
compare_e_real_fixed
();
int
compare_e_real_fixed
();
int
compare_datetime
();
// compare args[0] & args[1] as DATETIMEs
int
compare_datetime
();
// compare args[0] & args[1] as DATETIMEs
int
compare_year
();
static
enum
enum_date_cmp_type
can_compare_as_dates
(
Item
*
a
,
Item
*
b
,
static
enum
enum_date_cmp_type
can_compare_as_dates
(
Item
*
a
,
Item
*
b
,
ulonglong
*
const_val_arg
);
ulonglong
*
const_val_arg
);
...
...
sql/sql_show.cc
View file @
6d690898
...
@@ -719,7 +719,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
...
@@ -719,7 +719,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
thd
->
push_internal_handler
(
&
view_error_suppressor
);
thd
->
push_internal_handler
(
&
view_error_suppressor
);
bool
error
=
open_normal_and_derived_tables
(
thd
,
table_list
,
0
);
bool
error
=
open_normal_and_derived_tables
(
thd
,
table_list
,
0
);
thd
->
pop_internal_handler
();
thd
->
pop_internal_handler
();
if
(
error
&&
thd
->
main_da
.
is_error
(
))
if
(
error
&&
(
thd
->
killed
||
thd
->
main_da
.
is_error
()
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
}
}
...
...
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