mirror of
https://github.com/MariaDB/server.git
synced 2026-05-11 09:30:23 +02:00
MDEV-17625 Different warnings when comparing a garbage to DATETIME vs TIME
- Splitting processes of data type conversion (to TIME/DATE,DATETIME)
and warning generation.
Warning are now only get collected during conversion (in an "int" variable),
and are pushed in the very end of conversion (not in parallel).
Warnings generated by the low level routines str_to_xxx() and number_to_xxx()
can now be changed at the end, when TIME_FUZZY_DATES is applied,
from "Invalid value" to "Truncated invalid value".
Now "Illegal value" is issued only when the low level routine returned
an error and TIME_FUZZY_DATES was not set. Otherwise, if the low level
routine returned "false" (success), or if NULL was converted to a zero
datetime by TIME_FUZZY_DATES, then "Truncated illegal value"
is issued. This gives better warnings.
- Methods Type_handler::Item_get_date() and
Type_handler::Item_func_hybrid_field_type_get_date() now only
convert and collect warning information, but do not push warnings.
- Changing the return data type for Type_handler::Item_get_date()
and Type_handler::Item_func_hybrid_field_type_get_date() from
"bool" to "void". The conversion result (success vs error) can be
checked by testing ltime->time_type. MYSQL_TIME_{NONE|ERROR}
mean mean error, other values mean success.
- Adding new wrapper methods Type_handler::Item_get_date_with_warn() and
Type_handler::Item_func_hybrid_field_type_get_date_with_warn()
to do conversion followed by raising warnings, and changing
the code to call new Type_handler::***_with_warn() methods.
- Adding a helper class Temporal::Status, a wrapper
for MYSQL_TIME_STATUS with automatic initialization.
- Adding a helper class Temporal::Warn, to collect warnings
but without actually raising them. Moving a part of ErrConv
into a separate class ErrBuff, and deriving both Temporal::Warn
and ErrConv from ErrBuff. The ErrBuff part of Temporal::Warn
is used to collect textual representation of the input data.
- Adding a helper class Temporal::Warn_push. It's used
to collect warning information during conversion, and
automatically pushes warnings to the diagnostics area
on its destructor time (in case of non-zero warning).
- Moving more code from various functions inside class Temporal.
- Adding more Temporal_hybrid constructors and
protected Temporal methods make_from_xxx(),
which convert and only collect warning information, but do not
actually raise warnings.
- Now the low level functions str_to_datetime() and str_to_time()
always set status->warning if the return value is "true" (error).
- Now the low level functions number_to_time() and number_to_datetime()
set the "*was_cut" argument if the return value is "true" (error).
- Adding a few DBUG_ASSERTs to make sure that str_to_xxx() and
number_to_xxx() always set warnings on error.
- Adding new warning flags MYSQL_TIME_WARN_EDOM and MYSQL_TIME_WARN_ZERO_DATE
for the code symmetry. Before this change there was a special
code path for (rc==true && was_cut==0) which was treated by
Field_temporal::store_invalid_with_warning as "zero date violation".
Now was_cut==0 always means that there are no any error/warnings/notes
to be raised, not matter what rc is.
- Using new Temporal_hybrid constructors in combination with
Temporal::Warn_push inside str_to_datetime_with_warn(),
double_to_datetime_with_warn(), int_to_datetime_with_warn(),
Field::get_date(), Item::get_date_from_string(), and a few other places.
- Removing methods Dec_ptr::to_datetime_with_warn(),
Year::to_time_with_warn(), my_decimal::to_datetime_with_warn(),
Dec_ptr::to_datetime_with_warn().
Fixing Sec6::to_time() and Sec6::to_datetime() to
convert and only collect warnings, without raising warnings.
Now warning raising functionality resides in Temporal::Warn_push.
- Adding classes Longlong_hybrid_null and Double_null, to
return both value and the "IS NULL" flag. Adding methods
Item::to_double_null(), to_longlong_hybrid_null(),
Item_func_hybrid_field_type::to_longlong_hybrid_null_op(),
Item_func_hybrid_field_type::to_double_null_op().
Removing separate classes VInt and VInt_op, as they
have been replaced by a single class Longlong_hybrid_null.
- Adding a helper method Temporal::type_name_by_timestamp_type(),
moving a part of make_truncated_value_warning() into it,
and reusing in Temporal::Warn::push_conversion_warnings().
- Removing Item::make_zero_date() and
Item_func_hybrid_field_type::make_zero_mysql_time().
They provided duplicate functionality.
Now this code resides in Temporal::make_fuzzy_date().
The latter is now called for all Item types when data type
conversion (to DATE/TIME/DATETIME) is involved, including
Item_field and Item_direct_view_ref.
This fixes MDEV-17563: Item_direct_view_ref now correctly converts
NULL to a zero date when TIME_FUZZY_DATES says so.
1279 lines
41 KiB
Text
1279 lines
41 KiB
Text
SET timestamp=unix_timestamp('2001-02-03 10:20:30');
|
||
select CAST(1-2 AS UNSIGNED);
|
||
CAST(1-2 AS UNSIGNED)
|
||
18446744073709551615
|
||
Warnings:
|
||
Note 1105 Cast to unsigned converted negative integer to it's positive complement
|
||
select CAST(CAST(1-2 AS UNSIGNED) AS SIGNED INTEGER);
|
||
CAST(CAST(1-2 AS UNSIGNED) AS SIGNED INTEGER)
|
||
-1
|
||
Warnings:
|
||
Note 1105 Cast to unsigned converted negative integer to it's positive complement
|
||
select CAST('10 ' as unsigned integer);
|
||
CAST('10 ' as unsigned integer)
|
||
10
|
||
Warnings:
|
||
Note 1292 Truncated incorrect INTEGER value: '10 '
|
||
select cast(-5 as unsigned) | 1, cast(-5 as unsigned) & -1;
|
||
cast(-5 as unsigned) | 1 cast(-5 as unsigned) & -1
|
||
18446744073709551611 18446744073709551611
|
||
Warnings:
|
||
Note 1105 Cast to unsigned converted negative integer to it's positive complement
|
||
Note 1105 Cast to unsigned converted negative integer to it's positive complement
|
||
select cast(-5 as unsigned) -1, cast(-5 as unsigned) + 1;
|
||
cast(-5 as unsigned) -1 cast(-5 as unsigned) + 1
|
||
18446744073709551610 18446744073709551612
|
||
Warnings:
|
||
Note 1105 Cast to unsigned converted negative integer to it's positive complement
|
||
Note 1105 Cast to unsigned converted negative integer to it's positive complement
|
||
select ~5, cast(~5 as signed);
|
||
~5 cast(~5 as signed)
|
||
18446744073709551610 -6
|
||
explain extended select ~5, cast(~5 as signed);
|
||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||
Warnings:
|
||
Note 1003 select ~5 AS `~5`,cast(~5 as signed) AS `cast(~5 as signed)`
|
||
select cast(18446744073709551615 as signed);
|
||
cast(18446744073709551615 as signed)
|
||
-1
|
||
select cast(5 as unsigned) -6.0;
|
||
cast(5 as unsigned) -6.0
|
||
-1.0
|
||
select cast(NULL as signed), cast(1/0 as signed);
|
||
cast(NULL as signed) cast(1/0 as signed)
|
||
NULL NULL
|
||
Warnings:
|
||
Warning 1365 Division by 0
|
||
select cast(1 as double(5,2));
|
||
cast(1 as double(5,2))
|
||
1.00
|
||
select cast("5.2222" as double(5,2));
|
||
cast("5.2222" as double(5,2))
|
||
5.22
|
||
select cast(12.444 as double(5,2));
|
||
cast(12.444 as double(5,2))
|
||
12.44
|
||
select cast(cast(12.444 as decimal(10,3)) as double(5,2));
|
||
cast(cast(12.444 as decimal(10,3)) as double(5,2))
|
||
12.44
|
||
select cast(null as double(5,2));
|
||
cast(null as double(5,2))
|
||
NULL
|
||
select cast(12.444 as double);
|
||
cast(12.444 as double)
|
||
12.444
|
||
select cast(cast("20:01:01" as time) as datetime);
|
||
cast(cast("20:01:01" as time) as datetime)
|
||
2001-02-03 20:01:01
|
||
select cast(cast("8:46:06.23434" AS time) as decimal(32,10));
|
||
cast(cast("8:46:06.23434" AS time) as decimal(32,10))
|
||
84606.0000000000
|
||
select cast(cast("2011-04-05 8:46:06.23434" AS datetime) as decimal(32,6));
|
||
cast(cast("2011-04-05 8:46:06.23434" AS datetime) as decimal(32,6))
|
||
20110405084606.000000
|
||
#
|
||
# Check handling of cast with microseconds
|
||
#
|
||
select cast(cast(20010203101112.121314 as double) as datetime);
|
||
cast(cast(20010203101112.121314 as double) as datetime)
|
||
2001-02-03 10:11:12
|
||
select cast(cast(010203101112.12 as double) as datetime);
|
||
cast(cast(010203101112.12 as double) as datetime)
|
||
2001-02-03 10:11:12
|
||
select cast(cast(20010203101112.121314 as decimal(32,6)) as datetime);
|
||
cast(cast(20010203101112.121314 as decimal(32,6)) as datetime)
|
||
2001-02-03 10:11:12
|
||
select cast(20010203101112.121314 as datetime);
|
||
cast(20010203101112.121314 as datetime)
|
||
2001-02-03 10:11:12
|
||
select cast(110203101112.121314 as datetime);
|
||
cast(110203101112.121314 as datetime)
|
||
2011-02-03 10:11:12
|
||
select cast(cast(010203101112.12 as double) as datetime);
|
||
cast(cast(010203101112.12 as double) as datetime)
|
||
2001-02-03 10:11:12
|
||
select cast("2011-02-03 10:11:12.123456" as datetime);
|
||
cast("2011-02-03 10:11:12.123456" as datetime)
|
||
2011-02-03 10:11:12
|
||
select cast("2011-02-03 10:11:12.123456" as datetime(0));
|
||
cast("2011-02-03 10:11:12.123456" as datetime(0))
|
||
2011-02-03 10:11:12
|
||
select cast("2011-02-03 10:11:12.123456" as datetime(5));
|
||
cast("2011-02-03 10:11:12.123456" as datetime(5))
|
||
2011-02-03 10:11:12.12345
|
||
select cast("2011-02-03 10:11:12.123456" as datetime(6));
|
||
cast("2011-02-03 10:11:12.123456" as datetime(6))
|
||
2011-02-03 10:11:12.123456
|
||
select cast("2011-02-03 10:11:12" as datetime(6));
|
||
cast("2011-02-03 10:11:12" as datetime(6))
|
||
2011-02-03 10:11:12.000000
|
||
select cast(cast(20010203101112.5 as double) as datetime(1));
|
||
cast(cast(20010203101112.5 as double) as datetime(1))
|
||
2001-02-03 10:11:12.5
|
||
select cast(cast(010203101112.12 as double) as datetime(2));
|
||
cast(cast(010203101112.12 as double) as datetime(2))
|
||
2001-02-03 10:11:12.12
|
||
select cast(cast(20010203101112.121314 as decimal(32,6)) as datetime(6));
|
||
cast(cast(20010203101112.121314 as decimal(32,6)) as datetime(6))
|
||
2001-02-03 10:11:12.121314
|
||
select cast(20010203101112.121314 as datetime(6));
|
||
cast(20010203101112.121314 as datetime(6))
|
||
2001-02-03 10:11:12.121314
|
||
select cast(110203101112.121314 as datetime(6));
|
||
cast(110203101112.121314 as datetime(6))
|
||
2011-02-03 10:11:12.121314
|
||
select cast(cast(010203101112.12 as double) as datetime(6));
|
||
cast(cast(010203101112.12 as double) as datetime(6))
|
||
2001-02-03 10:11:12.120000
|
||
select cast("2011-02-03 10:11:12.123456" as time);
|
||
cast("2011-02-03 10:11:12.123456" as time)
|
||
10:11:12
|
||
select cast("2011-02-03 10:11:12.123456" as time(6));
|
||
cast("2011-02-03 10:11:12.123456" as time(6))
|
||
10:11:12.123456
|
||
select cast("10:11:12.123456" as time);
|
||
cast("10:11:12.123456" as time)
|
||
10:11:12
|
||
select cast("10:11:12.123456" as time(0));
|
||
cast("10:11:12.123456" as time(0))
|
||
10:11:12
|
||
select cast("10:11:12.123456" as time(5));
|
||
cast("10:11:12.123456" as time(5))
|
||
10:11:12.12345
|
||
select cast("10:11:12.123456" as time(6));
|
||
cast("10:11:12.123456" as time(6))
|
||
10:11:12.123456
|
||
select cast("10:11:12" as time(6));
|
||
cast("10:11:12" as time(6))
|
||
10:11:12.000000
|
||
select cast(cast("2011-04-05 8:46:06.123456" AS datetime) as time);
|
||
cast(cast("2011-04-05 8:46:06.123456" AS datetime) as time)
|
||
08:46:06
|
||
select cast(cast("2011-04-05 8:46:06.123456" AS datetime) as time(6));
|
||
cast(cast("2011-04-05 8:46:06.123456" AS datetime) as time(6))
|
||
08:46:06.000000
|
||
select cast(cast("2011-04-05 8:46:06.123456" AS datetime(6)) as time);
|
||
cast(cast("2011-04-05 8:46:06.123456" AS datetime(6)) as time)
|
||
08:46:06
|
||
select cast(cast("2011-04-05 8:46:06.123456" AS datetime(6)) as time(6));
|
||
cast(cast("2011-04-05 8:46:06.123456" AS datetime(6)) as time(6))
|
||
08:46:06.123456
|
||
select cast(NULL as unsigned), cast(1/0 as unsigned);
|
||
cast(NULL as unsigned) cast(1/0 as unsigned)
|
||
NULL NULL
|
||
Warnings:
|
||
Warning 1365 Division by 0
|
||
select cast("A" as binary) = "a", cast(BINARY "a" as CHAR) = "A";
|
||
cast("A" as binary) = "a" cast(BINARY "a" as CHAR) = "A"
|
||
0 1
|
||
select cast("2001-1-1" as DATE), cast("2001-1-1" as DATETIME);
|
||
cast("2001-1-1" as DATE) cast("2001-1-1" as DATETIME)
|
||
2001-01-01 2001-01-01 00:00:00
|
||
select cast("1:2:3" as TIME);
|
||
cast("1:2:3" as TIME)
|
||
01:02:03
|
||
select CONVERT("2004-01-22 21:45:33",DATE);
|
||
CONVERT("2004-01-22 21:45:33",DATE)
|
||
2004-01-22
|
||
select 10+'10';
|
||
10+'10'
|
||
20
|
||
select 10.0+'10';
|
||
10.0+'10'
|
||
20
|
||
select 10E+0+'10';
|
||
10E+0+'10'
|
||
20
|
||
select CONVERT(TIMESTAMP "2004-01-22 21:45:33" USING latin1);
|
||
CONVERT(TIMESTAMP "2004-01-22 21:45:33" USING latin1)
|
||
2004-01-22 21:45:33
|
||
select CONVERT(TIMESTAMP "2004-01-22 21:45:33",CHAR);
|
||
CONVERT(TIMESTAMP "2004-01-22 21:45:33",CHAR)
|
||
2004-01-22 21:45:33
|
||
select CONVERT(TIMESTAMP "2004-01-22 21:45:33",CHAR(4));
|
||
CONVERT(TIMESTAMP "2004-01-22 21:45:33",CHAR(4))
|
||
2004
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect CHAR(4) value: '2004-01-22 21:45:33'
|
||
select CONVERT(TIMESTAMP "2004-01-22 21:45:33",BINARY(4));
|
||
CONVERT(TIMESTAMP "2004-01-22 21:45:33",BINARY(4))
|
||
2004
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect BINARY(4) value: '2004-01-22 21:45:33'
|
||
select CAST(TIMESTAMP "2004-01-22 21:45:33" AS BINARY(4));
|
||
CAST(TIMESTAMP "2004-01-22 21:45:33" AS BINARY(4))
|
||
2004
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect BINARY(4) value: '2004-01-22 21:45:33'
|
||
select CAST(0xb3 as signed);
|
||
CAST(0xb3 as signed)
|
||
179
|
||
select CAST(0x8fffffffffffffff as signed);
|
||
CAST(0x8fffffffffffffff as signed)
|
||
-8070450532247928833
|
||
select CAST(0xffffffffffffffff as unsigned);
|
||
CAST(0xffffffffffffffff as unsigned)
|
||
18446744073709551615
|
||
select CAST(0xfffffffffffffffe as signed);
|
||
CAST(0xfffffffffffffffe as signed)
|
||
-2
|
||
select cast('-10a' as signed integer);
|
||
cast('-10a' as signed integer)
|
||
-10
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect INTEGER value: '-10a'
|
||
select cast('a10' as unsigned integer);
|
||
cast('a10' as unsigned integer)
|
||
0
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect INTEGER value: 'a10'
|
||
select 10+'a';
|
||
10+'a'
|
||
10
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect DOUBLE value: 'a'
|
||
select 10.0+cast('a' as decimal);
|
||
10.0+cast('a' as decimal)
|
||
10.0
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect DECIMAL value: 'a'
|
||
select 10E+0+'a';
|
||
10E+0+'a'
|
||
10
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect DOUBLE value: 'a'
|
||
select cast("a" as double(5,2));
|
||
cast("a" as double(5,2))
|
||
0.00
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect DOUBLE value: 'a'
|
||
select cast(1000 as decimal(5,2));
|
||
cast(1000 as decimal(5,2))
|
||
999.99
|
||
Warnings:
|
||
Warning 1264 Out of range value for column 'cast(1000 as decimal(5,2))' at row 1
|
||
select cast(-1000 as decimal(5,2));
|
||
cast(-1000 as decimal(5,2))
|
||
-999.99
|
||
Warnings:
|
||
Warning 1264 Out of range value for column 'cast(-1000 as decimal(5,2))' at row 1
|
||
select cast(1000 as double(5,2));
|
||
cast(1000 as double(5,2))
|
||
999.99
|
||
Warnings:
|
||
Warning 1264 Out of range value for column 'cast(1000 as double(5,2))' at row 1
|
||
select cast(-1000 as double(5,2));
|
||
cast(-1000 as double(5,2))
|
||
-999.99
|
||
Warnings:
|
||
Warning 1264 Out of range value for column 'cast(-1000 as double(5,2))' at row 1
|
||
select cast(010203101112.121314 as datetime);
|
||
cast(010203101112.121314 as datetime)
|
||
2001-02-03 10:11:12
|
||
select cast(120010203101112.121314 as datetime);
|
||
cast(120010203101112.121314 as datetime)
|
||
NULL
|
||
Warnings:
|
||
Warning 1292 Incorrect datetime value: '120010203101112.121314'
|
||
select cast(cast(1.1 as decimal) as datetime);
|
||
cast(cast(1.1 as decimal) as datetime)
|
||
NULL
|
||
Warnings:
|
||
Warning 1292 Incorrect datetime value: '1'
|
||
select cast(cast(-1.1 as decimal) as datetime);
|
||
cast(cast(-1.1 as decimal) as datetime)
|
||
NULL
|
||
Warnings:
|
||
Warning 1292 Incorrect datetime value: '-1'
|
||
select cast('0' as date);
|
||
cast('0' as date)
|
||
NULL
|
||
Warnings:
|
||
Warning 1292 Incorrect datetime value: '0'
|
||
select cast('' as date);
|
||
cast('' as date)
|
||
NULL
|
||
Warnings:
|
||
Warning 1292 Incorrect datetime value: ''
|
||
select cast('0' as datetime);
|
||
cast('0' as datetime)
|
||
NULL
|
||
Warnings:
|
||
Warning 1292 Incorrect datetime value: '0'
|
||
select cast('' as datetime);
|
||
cast('' as datetime)
|
||
NULL
|
||
Warnings:
|
||
Warning 1292 Incorrect datetime value: ''
|
||
select cast('0' as time);
|
||
cast('0' as time)
|
||
00:00:00
|
||
select cast('' as time);
|
||
cast('' as time)
|
||
NULL
|
||
Warnings:
|
||
Warning 1292 Incorrect time value: ''
|
||
select cast(NULL as DATE);
|
||
cast(NULL as DATE)
|
||
NULL
|
||
select cast(NULL as DATETIME);
|
||
cast(NULL as DATETIME)
|
||
NULL
|
||
select cast(NULL as TIME);
|
||
cast(NULL as TIME)
|
||
NULL
|
||
select cast(NULL as BINARY);
|
||
cast(NULL as BINARY)
|
||
NULL
|
||
select cast(cast(120010203101112.121314 as double) as datetime);
|
||
cast(cast(120010203101112.121314 as double) as datetime)
|
||
NULL
|
||
select cast(cast(1.1 as double) as datetime);
|
||
cast(cast(1.1 as double) as datetime)
|
||
NULL
|
||
select cast(cast(-1.1 as double) as datetime);
|
||
cast(cast(-1.1 as double) as datetime)
|
||
NULL
|
||
explain extended select cast(10 as double(5,2));
|
||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||
Warnings:
|
||
Note 1003 select cast(10 as double(5,2)) AS `cast(10 as double(5,2))`
|
||
explain extended select cast(10 as double);
|
||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||
Warnings:
|
||
Note 1003 select cast(10 as double) AS `cast(10 as double)`
|
||
explain extended select cast(10 as decimal(5,2));
|
||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||
Warnings:
|
||
Note 1003 select cast(10 as decimal(5,2)) AS `cast(10 as decimal(5,2))`
|
||
select cast('18446744073709551616' as unsigned);
|
||
cast('18446744073709551616' as unsigned)
|
||
18446744073709551615
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect INTEGER value: '18446744073709551616'
|
||
select cast('18446744073709551616' as signed);
|
||
cast('18446744073709551616' as signed)
|
||
-1
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect INTEGER value: '18446744073709551616'
|
||
select cast('9223372036854775809' as signed);
|
||
cast('9223372036854775809' as signed)
|
||
-9223372036854775807
|
||
Warnings:
|
||
Note 1105 Cast to signed converted positive out-of-range integer to it's negative complement
|
||
select cast('-1' as unsigned);
|
||
cast('-1' as unsigned)
|
||
18446744073709551615
|
||
Warnings:
|
||
Note 1105 Cast to unsigned converted negative integer to it's positive complement
|
||
select cast('abc' as signed);
|
||
cast('abc' as signed)
|
||
0
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect INTEGER value: 'abc'
|
||
select cast('1a' as signed);
|
||
cast('1a' as signed)
|
||
1
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect INTEGER value: '1a'
|
||
select cast('' as signed);
|
||
cast('' as signed)
|
||
0
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect INTEGER value: ''
|
||
select cast(1 as double(5,6));
|
||
ERROR 42000: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '')
|
||
select cast(1 as decimal(5,6));
|
||
ERROR 42000: For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '')
|
||
select cast(1 as double(66,6));
|
||
ERROR 42000: Too big precision 66 specified for '1'. Maximum is 65
|
||
select cast(1 as decimal(66,6));
|
||
ERROR 42000: Too big precision 66 specified for '1'. Maximum is 65
|
||
select cast(1 as decimal(64,63));
|
||
ERROR 42000: Too big scale 63 specified for '1'. Maximum is 38
|
||
select cast(1 as double(64,63));
|
||
ERROR 42000: Too big scale 63 specified for '1'. Maximum is 38
|
||
set names binary;
|
||
select cast(_latin1'test' as char character set latin2);
|
||
cast(_latin1'test' as char character set latin2)
|
||
test
|
||
select cast(_koi8r'<27><><EFBFBD><EFBFBD>' as char character set cp1251);
|
||
cast(_koi8r'<27><><EFBFBD><EFBFBD>' as char character set cp1251)
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
create table t1 select cast(_koi8r'<27><><EFBFBD><EFBFBD>' as char character set cp1251) as t;
|
||
show create table t1;
|
||
Table Create Table
|
||
t1 CREATE TABLE `t1` (
|
||
`t` varchar(4) CHARACTER SET cp1251 DEFAULT NULL
|
||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||
drop table t1;
|
||
select
|
||
cast(_latin1'ab' AS char) as c1,
|
||
cast(_latin1'a ' AS char) as c2,
|
||
cast(_latin1'abc' AS char(2)) as c3,
|
||
cast(_latin1'a ' AS char(2)) as c4,
|
||
hex(cast(_latin1'a' AS char(2))) as c5;
|
||
c1 c2 c3 c4 c5
|
||
ab a ab a 6100
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'abc'
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'a '
|
||
select cast(1000 as CHAR(3));
|
||
cast(1000 as CHAR(3))
|
||
100
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect BINARY(3) value: '1000'
|
||
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
||
create table t1 select
|
||
cast(_latin1'ab' AS char) as c1,
|
||
cast(_latin1'a ' AS char) as c2,
|
||
cast(_latin1'abc' AS char(2)) as c3,
|
||
cast(_latin1'a ' AS char(2)) as c4,
|
||
cast(_latin1'a' AS char(2)) as c5;
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'abc'
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'a '
|
||
select c1,c2,c3,c4,hex(c5) from t1;
|
||
c1 c2 c3 c4 hex(c5)
|
||
ab a ab a 6100
|
||
show create table t1;
|
||
Table Create Table
|
||
t1 CREATE TABLE `t1` (
|
||
`c1` varbinary(2) NOT NULL,
|
||
`c2` varbinary(2) NOT NULL,
|
||
`c3` varbinary(2) NOT NULL,
|
||
`c4` varbinary(2) NOT NULL,
|
||
`c5` varbinary(2) NOT NULL
|
||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||
drop table t1;
|
||
select
|
||
cast(_koi8r'<27><>' AS nchar) as c1,
|
||
cast(_koi8r'<27> ' AS nchar) as c2,
|
||
cast(_koi8r'<27><><EFBFBD>' AS nchar(2)) as c3,
|
||
cast(_koi8r'<27> ' AS nchar(2)) as c4,
|
||
cast(_koi8r'<27>' AS nchar(2)) as c5;
|
||
c1 c2 c3 c4 c5
|
||
фг ф фг ф ф
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect CHAR(2) value: 'фгх'
|
||
Warning 1292 Truncated incorrect CHAR(2) value: 'ф '
|
||
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
||
create table t1 select
|
||
cast(_koi8r'<27><>' AS nchar) as c1,
|
||
cast(_koi8r'<27> ' AS nchar) as c2,
|
||
cast(_koi8r'<27><><EFBFBD>' AS nchar(2)) as c3,
|
||
cast(_koi8r'<27> ' AS nchar(2)) as c4,
|
||
cast(_koi8r'<27>' AS nchar(2)) as c5;
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect CHAR(2) value: 'фгх'
|
||
Warning 1292 Truncated incorrect CHAR(2) value: 'ф '
|
||
select * from t1;
|
||
c1 c2 c3 c4 c5
|
||
фг ф фг ф ф
|
||
show create table t1;
|
||
Table Create Table
|
||
t1 CREATE TABLE `t1` (
|
||
`c1` varchar(2) CHARACTER SET utf8 NOT NULL,
|
||
`c2` varchar(2) CHARACTER SET utf8 NOT NULL,
|
||
`c3` varchar(2) CHARACTER SET utf8 NOT NULL,
|
||
`c4` varchar(2) CHARACTER SET utf8 NOT NULL,
|
||
`c5` varchar(2) CHARACTER SET utf8 NOT NULL
|
||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||
drop table t1;
|
||
create table t1 (a binary(4), b char(4) character set koi8r);
|
||
insert into t1 values (_binary'<27><><EFBFBD><EFBFBD>',_binary'<27><><EFBFBD><EFBFBD>');
|
||
select a,b,cast(a as char character set cp1251),cast(b as binary) from t1;
|
||
a b cast(a as char character set cp1251) cast(b as binary)
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>
|
||
set names koi8r;
|
||
select a,b,cast(a as char character set cp1251),cast(b as binary) from t1;
|
||
a b cast(a as char character set cp1251) cast(b as binary)
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>
|
||
set names cp1251;
|
||
select a,b,cast(a as char character set cp1251),cast(b as binary) from t1;
|
||
a b cast(a as char character set cp1251) cast(b as binary)
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>
|
||
drop table t1;
|
||
set names binary;
|
||
select cast("2001-1-1" as date) = "2001-01-01";
|
||
cast("2001-1-1" as date) = "2001-01-01"
|
||
1
|
||
select cast("2001-1-1" as datetime) = "2001-01-01 00:00:00";
|
||
cast("2001-1-1" as datetime) = "2001-01-01 00:00:00"
|
||
1
|
||
select cast("1:2:3" as TIME) = "1:02:03";
|
||
cast("1:2:3" as TIME) = "1:02:03"
|
||
1
|
||
CREATE TABLE t1 (a enum ('aac','aab','aaa') not null);
|
||
INSERT INTO t1 VALUES ('aaa'),('aab'),('aac');
|
||
SELECT a, CAST(a AS CHAR) FROM t1 ORDER BY CAST(a AS UNSIGNED) ;
|
||
a CAST(a AS CHAR)
|
||
aac aac
|
||
aab aab
|
||
aaa aaa
|
||
SELECT a, CAST(a AS CHAR(3)) FROM t1 ORDER BY CAST(a AS CHAR(2)), a;
|
||
a CAST(a AS CHAR(3))
|
||
aac aac
|
||
aab aab
|
||
aaa aaa
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'aaa'
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'aab'
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'aac'
|
||
SELECT a, CAST(a AS UNSIGNED) FROM t1 ORDER BY CAST(a AS CHAR) ;
|
||
a CAST(a AS UNSIGNED)
|
||
aaa 3
|
||
aab 2
|
||
aac 1
|
||
SELECT a, CAST(a AS CHAR(2)) FROM t1 ORDER BY CAST(a AS CHAR(3)), a;
|
||
a CAST(a AS CHAR(2))
|
||
aaa aa
|
||
aab aa
|
||
aac aa
|
||
Warnings:
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'aaa'
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'aab'
|
||
Warning 1292 Truncated incorrect BINARY(2) value: 'aac'
|
||
DROP TABLE t1;
|
||
select date_add(cast('2004-12-30 12:00:00' as date), interval 0 hour);
|
||
date_add(cast('2004-12-30 12:00:00' as date), interval 0 hour)
|
||
2004-12-30 00:00:00
|
||
select timediff(cast('2004-12-30 12:00:00' as time), '12:00:00');
|
||
timediff(cast('2004-12-30 12:00:00' as time), '12:00:00')
|
||
00:00:00
|
||
select timediff(cast('1 12:00:00' as time), '12:00:00');
|
||
timediff(cast('1 12:00:00' as time), '12:00:00')
|
||
24:00:00
|
||
select cast(18446744073709551615 as unsigned);
|
||
cast(18446744073709551615 as unsigned)
|
||
18446744073709551615
|
||
select cast(18446744073709551615 as signed);
|
||
cast(18446744073709551615 as signed)
|
||
-1
|
||
select cast('18446744073709551615' as unsigned);
|
||
cast('18446744073709551615' as unsigned)
|
||
18446744073709551615
|
||
select cast('18446744073709551615' as signed);
|
||
cast('18446744073709551615' as signed)
|
||
-1
|
||
Warnings:
|
||
Note 1105 Cast to signed converted positive out-of-range integer to it's negative complement
|
||
select cast('9223372036854775807' as signed);
|
||
cast('9223372036854775807' as signed)
|
||
9223372036854775807
|
||
select cast(concat('184467440','73709551615') as unsigned);
|
||
cast(concat('184467440','73709551615') as unsigned)
|
||
18446744073709551615
|
||
select cast(concat('184467440','73709551615') as signed);
|
||
cast(concat('184467440','73709551615') as signed)
|
||
-1
|
||
Warnings:
|
||
Note 1105 Cast to signed converted positive out-of-range integer to it's negative complement
|
||
select cast(repeat('1',20) as unsigned);
|
||
cast(repeat('1',20) as unsigned)
|
||
11111111111111111111
|
||
select cast(repeat('1',20) as signed);
|
||
cast(repeat('1',20) as signed)
|
||
-7335632962598440505
|
||
Warnings:
|
||
Note 1105 Cast to signed converted positive out-of-range integer to it's negative complement
|
||
select cast(1.0e+300 as signed int);
|
||
cast(1.0e+300 as signed int)
|
||
9223372036854775807
|
||
create table t1 select cast(1 as unsigned), cast(1 as signed), cast(1 as double(5,2)), cast(1 as decimal(5,3)), cast("A" as binary), cast("A" as char(100)), cast("2001-1-1" as DATE), cast("2001-1-1" as DATETIME), cast("1:2:3" as TIME);
|
||
show create table t1;
|
||
Table Create Table
|
||
t1 CREATE TABLE `t1` (
|
||
`cast(1 as unsigned)` int(1) unsigned NOT NULL,
|
||
`cast(1 as signed)` int(2) NOT NULL,
|
||
`cast(1 as double(5,2))` double(5,2) DEFAULT NULL,
|
||
`cast(1 as decimal(5,3))` decimal(5,3) NOT NULL,
|
||
`cast("A" as binary)` varbinary(1) DEFAULT NULL,
|
||
`cast("A" as char(100))` varbinary(100) DEFAULT NULL,
|
||
`cast("2001-1-1" as DATE)` date DEFAULT NULL,
|
||
`cast("2001-1-1" as DATETIME)` datetime DEFAULT NULL,
|
||
`cast("1:2:3" as TIME)` time DEFAULT NULL
|
||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||
drop table t1;
|
||
CREATE TABLE t1 (f1 double);
|
||
INSERT INTO t1 SET f1 = -1.0e+30 ;
|
||
INSERT INTO t1 SET f1 = +1.0e+30 ;
|
||
SELECT f1 AS double_val, CAST(f1 AS SIGNED INT) AS cast_val FROM t1;
|
||
double_val cast_val
|
||
-1e30 -9223372036854775808
|
||
1e30 9223372036854775807
|
||
Warnings:
|
||
Warning 1916 Got overflow when converting '-1e30' to INT. Value truncated
|
||
Warning 1916 Got overflow when converting '1e30' to INT. Value truncated
|
||
DROP TABLE t1;
|
||
select isnull(date(NULL)), isnull(cast(NULL as DATE));
|
||
isnull(date(NULL)) isnull(cast(NULL as DATE))
|
||
1 1
|
||
SELECT CAST(cast('01-01-01' as date) AS UNSIGNED);
|
||
CAST(cast('01-01-01' as date) AS UNSIGNED)
|
||
20010101
|
||
SELECT CAST(cast('01-01-01' as date) AS SIGNED);
|
||
CAST(cast('01-01-01' as date) AS SIGNED)
|
||
20010101
|
||
End of 4.1 tests
|
||
select cast('1.2' as decimal(3,2));
|
||
cast('1.2' as decimal(3,2))
|
||
1.20
|
||
select 1e18 * cast('1.2' as decimal(3,2));
|
||
1e18 * cast('1.2' as decimal(3,2))
|
||
1.2e18
|
||
select cast(cast('1.2' as decimal(3,2)) as signed);
|
||
cast(cast('1.2' as decimal(3,2)) as signed)
|
||
1
|
||
set @v1=1e18;
|
||
select cast(@v1 as decimal(22, 2));
|
||
cast(@v1 as decimal(22, 2))
|
||
1000000000000000000.00
|
||
select cast(-1e18 as decimal(22,2));
|
||
cast(-1e18 as decimal(22,2))
|
||
-1000000000000000000.00
|
||
create table t1(s1 time);
|
||
insert into t1 values ('11:11:11');
|
||
select cast(s1 as decimal(7,2)) from t1;
|
||
cast(s1 as decimal(7,2))
|
||
99999.99
|
||
Warnings:
|
||
Warning 1264 Out of range value for column 'cast(s1 as decimal(7,2))' at row 1
|
||
drop table t1;
|
||
CREATE TABLE t1 (v varchar(10), tt tinytext, t text,
|
||
mt mediumtext, lt longtext);
|
||
INSERT INTO t1 VALUES ('1.01', '2.02', '3.03', '4.04', '5.05');
|
||
SELECT CAST(v AS DECIMAL), CAST(tt AS DECIMAL), CAST(t AS DECIMAL),
|
||
CAST(mt AS DECIMAL), CAST(lt AS DECIMAL) from t1;
|
||
CAST(v AS DECIMAL) CAST(tt AS DECIMAL) CAST(t AS DECIMAL) CAST(mt AS DECIMAL) CAST(lt AS DECIMAL)
|
||
1 2 3 4 5
|
||
DROP TABLE t1;
|
||
select cast(NULL as decimal(6)) as t1;
|
||
t1
|
||
NULL
|
||
set names latin1;
|
||
select hex(cast('a' as char(2) binary));
|
||
hex(cast('a' as char(2) binary))
|
||
61
|
||
select hex(cast('a' as binary(2)));
|
||
hex(cast('a' as binary(2)))
|
||
6100
|
||
select hex(cast('a' as char(2) binary));
|
||
hex(cast('a' as char(2) binary))
|
||
61
|
||
CREATE TABLE t1 (d1 datetime);
|
||
INSERT INTO t1(d1) VALUES ('2007-07-19 08:30:00'), (NULL),
|
||
('2007-07-19 08:34:00'), (NULL), ('2007-07-19 08:36:00');
|
||
SELECT cast(date(d1) as signed) FROM t1;
|
||
cast(date(d1) as signed)
|
||
20070719
|
||
NULL
|
||
20070719
|
||
NULL
|
||
20070719
|
||
drop table t1;
|
||
CREATE TABLE t1 (f1 DATE);
|
||
INSERT INTO t1 VALUES ('2007-07-19'), (NULL);
|
||
SELECT HOUR(f1),
|
||
MINUTE(f1),
|
||
SECOND(f1) FROM t1;
|
||
HOUR(f1) MINUTE(f1) SECOND(f1)
|
||
0 0 0
|
||
NULL NULL NULL
|
||
SELECT HOUR(CAST('2007-07-19' AS DATE)),
|
||
MINUTE(CAST('2007-07-19' AS DATE)),
|
||
SECOND(CAST('2007-07-19' AS DATE));
|
||
HOUR(CAST('2007-07-19' AS DATE)) MINUTE(CAST('2007-07-19' AS DATE)) SECOND(CAST('2007-07-19' AS DATE))
|
||
0 0 0
|
||
SELECT HOUR(CAST(NULL AS DATE)),
|
||
MINUTE(CAST(NULL AS DATE)),
|
||
SECOND(CAST(NULL AS DATE));
|
||
HOUR(CAST(NULL AS DATE)) MINUTE(CAST(NULL AS DATE)) SECOND(CAST(NULL AS DATE))
|
||
NULL NULL NULL
|
||
SELECT HOUR(NULL),
|
||
MINUTE(NULL),
|
||
SECOND(NULL);
|
||
HOUR(NULL) MINUTE(NULL) SECOND(NULL)
|
||
NULL NULL NULL
|
||
DROP TABLE t1;
|
||
End of 5.0 tests
|
||
#
|
||
# Bug #44766: valgrind error when using convert() in a subquery
|
||
#
|
||
CREATE TABLE t1(a tinyint);
|
||
INSERT INTO t1 VALUES (127);
|
||
SELECT 1 FROM
|
||
(
|
||
SELECT CONVERT(t2.a USING UTF8) FROM t1, t1 t2 LIMIT 1
|
||
) AS s LIMIT 1;
|
||
1
|
||
1
|
||
DROP TABLE t1;
|
||
#
|
||
# Bug #11765023: 57934: DOS POSSIBLE SINCE BINARY CASTING
|
||
# DOESN'T ADHERE TO MAX_ALLOWED_PACKET
|
||
SET @@GLOBAL.max_allowed_packet=2048;
|
||
Warnings:
|
||
Warning 1708 The value of 'max_allowed_packet' should be no less than the value of 'net_buffer_length'
|
||
connect newconn, localhost, root,,;
|
||
SELECT CONVERT('a', BINARY(2049));
|
||
CONVERT('a', BINARY(2049))
|
||
a |