[MDEV-17854] Assertion `decimals <= 6' failed in my_time_fraction_remainder on SELECT with NULLIF and FROM_UNIXTIME on incorrect time Created: 2018-11-27  Updated: 2018-11-28  Resolved: 2018-11-28

Status: Closed
Project: MariaDB Server
Component/s: Temporal Types
Affects Version/s: 10.4
Fix Version/s: 10.4.1

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Alexander Barkov
Resolution: Fixed Votes: 0
Labels: None


 Description   

SELECT NULLIF(FROM_UNIXTIME('foo'), '2012-12-12 21:10:14');

10.4 7dcbc33db5

mysqld: /data/src/10.4/include/my_time.h:233: long int my_time_fraction_remainder(long int, uint): Assertion `decimals <= 6' failed.
181127 23:42:25 [ERROR] mysqld got signal 6 ;
 
#7  0x00007f7177c43ee2 in __assert_fail () from /lib/x86_64-linux-gnu/libc.so.6
7f7160000b00, item=0x7f7160015720, warn=0x7f7171de8e70, ltime=0x7f7171de9218, fuzzydate=...) at /data/src/10.4/sql/sql_type.cc:4609
#15 0x0000560bf5749a7f in Type_handler::Item_func_hybrid_field_type_get_date_with_warn (this=0x560bf6b48150 <type_handler_datetime2>, thd=0x7f7160000b00, item=0x7f7160015720, ltime=0x7f7171de9218, mode=...) at /data/src/10.4/sql/sql_type.cc:4230
#16 0x0000560bf553cbf3 in Item_func_hybrid_field_type::get_date (this=0x7f7160015720, thd=0x7f7160000b00, to=0x7f7171de9218, mode=...) at /data/src/10.4/sql/item_func.h:768
#17 0x0000560bf574e891 in Type_handler::Item_send_datetime (this=0x560bf6b48150 <type_handler_datetime2>, item=0x7f7160015720, protocol=0x7f71600010b8, buf=0x7f7171de9210) at /data/src/10.4/sql/sql_type.cc:6485
#18 0x0000560bf575987e in Type_handler_datetime_common::Item_send (this=0x560bf6b48150 <type_handler_datetime2>, item=0x7f7160015720, protocol=0x7f71600010b8, buf=0x7f7171de9210) at /data/src/10.4/sql/sql_type.h:5113
#19 0x0000560bf544ae96 in Item::send (this=0x7f7160015720, protocol=0x7f71600010b8, buffer=0x7f7171de9210) at /data/src/10.4/sql/item.h:1013
#20 0x0000560bf5445ab2 in Protocol::send_result_set_row (this=0x7f71600010b8, row_items=0x7f71600150d0) at /data/src/10.4/sql/protocol.cc:986
#21 0x0000560bf54ed284 in select_send::send_data (this=0x7f7160016180, items=...) at /data/src/10.4/sql/sql_class.cc:2937
#22 0x0000560bf55a28fd in JOIN::exec_inner (this=0x7f71600161a8) at /data/src/10.4/sql/sql_select.cc:3969
#23 0x0000560bf55a2360 in JOIN::exec (this=0x7f71600161a8) at /data/src/10.4/sql/sql_select.cc:3888
#24 0x0000560bf55a361f in mysql_select (thd=0x7f7160000b00, tables=0x0, wild_num=0, fields=..., conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2147748608, result=0x7f7160016180, unit=0x7f71600049b0, select_lex=0x7f7160014fa0) at /data/src/10.4/sql/sql_select.cc:4293
#25 0x0000560bf5594f2b in handle_select (thd=0x7f7160000b00, lex=0x7f71600048e8, result=0x7f7160016180, setup_tables_done_option=0) at /data/src/10.4/sql/sql_select.cc:385
#26 0x0000560bf555f2a2 in execute_sqlcom_select (thd=0x7f7160000b00, all_tables=0x0) at /data/src/10.4/sql/sql_parse.cc:6555
#27 0x0000560bf5555912 in mysql_execute_command (thd=0x7f7160000b00) at /data/src/10.4/sql/sql_parse.cc:3774
#28 0x0000560bf55630ae in mysql_parse (thd=0x7f7160000b00, rawbuf=0x7f7160014ec0 "SELECT NULLIF(FROM_UNIXTIME('foo'), '2012-12-12 21:10:14')", length=58, parser_state=0x7f7171dea600, is_com_multi=false, is_next_command=false) at /data/src/10.4/sql/sql_parse.cc:8092
#29 0x0000560bf555039c in dispatch_command (command=COM_QUERY, thd=0x7f7160000b00, packet=0x7f716011d471 "", packet_length=58, is_com_multi=false, is_next_command=false) at /data/src/10.4/sql/sql_parse.cc:1851
#30 0x0000560bf554edc0 in do_command (thd=0x7f7160000b00) at /data/src/10.4/sql/sql_parse.cc:1396
#31 0x0000560bf56ba442 in do_handle_one_connection (connect=0x560bf80832a0) at /data/src/10.4/sql/sql_connect.cc:1402
#32 0x0000560bf56ba1c6 in handle_one_connection (arg=0x560bf80832a0) at /data/src/10.4/sql/sql_connect.cc:1308
#33 0x0000560bf5b6e2e0 in pfs_spawn_thread (arg=0x560bf810b350) at /data/src/10.4/storage/perfschema/pfs.cc:1862
#34 0x00007f71796ff494 in start_thread (arg=0x7f7171deb700) at pthread_create.c:333
#35 0x00007f7177d0093f in clone () from /lib/x86_64-linux-gnu/libc.so.6

No crash on a non-debug build, just a duplicate warning:

SELECT NULLIF(FROM_UNIXTIME('foo'), '2012-12-12 21:10:14');
NULLIF(FROM_UNIXTIME('foo'), '2012-12-12 21:10:14')
1970-01-01 02:00:00
Warnings:
Warning	1292	Truncated incorrect DECIMAL value: 'foo'
Warning	1292	Truncated incorrect DECIMAL value: 'foo'



 Comments   
Comment by Alexander Barkov [ 2018-11-28 ]

This patch:

commit d6bcf3a4c81801f5f32810dbf2b1b1be659bd602
Date:   Wed Nov 28 06:18:05 2018 +0400

fixed only the crash.

It did not fix the double warning.
NULLIF is evaluated in MariaDB literally as the SQL standard defines it:

NULLIF (V1, V2) is equivalent to the following <case specification>:

CASE WHEN
V1=V2 THEN
NULL ELSE V1
END

So FROM_UNIXTIME('foo') is evaluated twice:

  • once for comparison
  • once to return the result in ELSE.

We should probably change it to evaluate V1 only once eventually, under terms of a separate MDEV.

Generated at Thu Feb 08 08:39:37 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.