Bug #88256 Assertion `max_length >= length' failed.
Submitted: 27 Oct 2017 21:58 Modified: 23 Sep 2018 23:49
Reporter: Roel Van de Paar Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: DML Severity:S6 (Debug Builds)
Version:8.0.3 RC OS:Any
Assigned to: CPU Architecture:Any
Tags: debug

[27 Oct 2017 21:58] Roel Van de Paar
Description:
2017-10-27T21:27:14.250827Z 0 [Note] /sda/MS201017-mysql-8.0.3-rc-linux-x86_64-debug/bin/mysqld: ready for connections. Version: '8.0.3-rc-debug-log'  socket: '/sda/MS201017-mysql-8.0.3-rc-linux-x86_64-debug/socket.sock'  port: 16654  MySQL Community Server (GPL)
mysqld: /git/mysql-server_dbg/sql/filesort.cc:1528: size_t {anonymous}::make_sortkey_from_item(Item*, Item_result, bool, size_t, char*, uchar*, bool*, ulonglong*): Assertion `max_length >= length' failed.
21:27:26 UTC - mysqld got signal 6 ;

Core was generated by `/sda/MS201017-mysql-8.0.3-rc-linux-x86_64-debug/bin/mysqld --no-defaults --sql_'.
Program terminated with signal 6, Aborted.
#0  0x00007f166228a9b1 in __pthread_kill (threadid=<optimized out>, signo=6) at ../nptl/sysdeps/unix/sysv/linux/pthread_kill.c:61
61	  val = INTERNAL_SYSCALL (tgkill, err, 3, THREAD_GETMEM (THREAD_SELF, pid),
(gdb) bt
#0  0x00007f166228a9b1 in __pthread_kill (threadid=<optimized out>, signo=6) at ../nptl/sysdeps/unix/sysv/linux/pthread_kill.c:61
#1  0x000000000369e428 in my_write_core (sig=6) at /git/mysql-server_dbg/mysys/stacktrace.cc:291
#2  0x000000000286b8f6 in handle_fatal_signal (sig=6) at /git/mysql-server_dbg/sql/signal_handler.cc:234
#3  <signal handler called>
#4  0x00007f16605a21f7 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#5  0x00007f16605a38e8 in __GI_abort () at abort.c:90
#6  0x00007f166059b266 in __assert_fail_base (fmt=0x7f16606ede68 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", 
    assertion=assertion@entry=0x442e11b "max_length >= length", file=file@entry=0x442d8a0 "/git/mysql-server_dbg/sql/filesort.cc", 
    line=line@entry=1528, 
    function=function@entry=0x442f7c0 <(anonymous namespace)::make_sortkey_from_item(Item*, Item_result, bool, unsigned long, char*, unsigned char*, bool*, unsigned long long*)::__PRETTY_FUNCTION__> "size_t {anonymous}::make_sortkey_from_item(Item*, Item_result, bool, size_t, char*, uchar*, bool*, ulonglong*)") at assert.c:92
#7  0x00007f166059b312 in __GI___assert_fail (assertion=0x442e11b "max_length >= length", 
    file=0x442d8a0 "/git/mysql-server_dbg/sql/filesort.cc", line=1528, 
    function=0x442f7c0 <(anonymous namespace)::make_sortkey_from_item(Item*, Item_result, bool, unsigned long, char*, unsigned char*, bool*, unsigned long long*)::__PRETTY_FUNCTION__> "size_t {anonymous}::make_sortkey_from_item(Item*, Item_result, bool, size_t, char*, uchar*, bool*, ulonglong*)") at assert.c:101
#8  0x00000000029b4298 in (anonymous namespace)::make_sortkey_from_item (item=0x7f161a4300e8, result_type=STRING_RESULT, 
    is_varlen=false, max_length=8, tmp_buffer=0x7f161a508540 "", to=0x7f161a525021 "2001-01-01", maybe_null=0x7f166282e467, 
    hash=0x7f166282e468) at /git/mysql-server_dbg/sql/filesort.cc:1528
#9  0x00000000029b4a7d in Sort_param::make_sortkey (this=0x7f166282e850, to=0x7f161a525020 "\001\062\060\060\061-01-01", 
    ref_pos=0x7f161a4cf670 "") at /git/mysql-server_dbg/sql/filesort.cc:1682
#10 0x00000000029b3672 in find_all_keys (thd=0x7f161a419000, param=0x7f166282e850, qep_tab=0x7f161a4ba7d8, fs_info=0x7f166282e8d0, 
    chunk_file=0x7f166282ea70, tempfile=0x7f166282e950, pq=0x0, found_rows=0x7f166282ed28)
    at /git/mysql-server_dbg/sql/filesort.cc:1206
#11 0x00000000029b15e9 in filesort (thd=0x7f161a419000, filesort=0x7f161a4bac58, sort_positions=false, examined_rows=0x7f166282ed30, 
    found_rows=0x7f166282ed28, returned_rows=0x7f166282ed20) at /git/mysql-server_dbg/sql/filesort.cc:558
#12 0x000000000246e747 in create_sort_index (thd=0x7f161a419000, join=0x7f161a4ba030, tab=0x7f161a4ba7d8)
    at /git/mysql-server_dbg/sql/sql_executor.cc:6130
#13 0x000000000246766d in QEP_TAB::sort_table (this=0x7f161a4ba7d8) at /git/mysql-server_dbg/sql/sql_executor.cc:3088
#14 0x0000000002466fc2 in join_init_read_record (tab=0x7f161a4ba7d8) at /git/mysql-server_dbg/sql/sql_executor.cc:2943
#15 0x00000000024640d2 in sub_select (join=0x7f161a4ba030, qep_tab=0x7f161a4ba7d8, end_of_records=false)
    at /git/mysql-server_dbg/sql/sql_executor.cc:1664
#16 0x0000000002463857 in do_select (join=0x7f161a4ba030) at /git/mysql-server_dbg/sql/sql_executor.cc:1295
#17 0x0000000002460c55 in JOIN::exec (this=0x7f161a4ba030) at /git/mysql-server_dbg/sql/sql_executor.cc:285
#18 0x0000000002512b73 in Sql_cmd_dml::execute_inner (this=0x7f161a430c00, thd=0x7f161a419000)
    at /git/mysql-server_dbg/sql/sql_select.cc:725
#19 0x0000000002512627 in Sql_cmd_dml::execute (this=0x7f161a430c00, thd=0x7f161a419000) at /git/mysql-server_dbg/sql/sql_select.cc:605
#20 0x00000000024be1ff in mysql_execute_command (thd=0x7f161a419000, first_level=true) at /git/mysql-server_dbg/sql/sql_parse.cc:4628
#21 0x00000000024c042b in mysql_parse (thd=0x7f161a419000, parser_state=0x7f16628302f0) at /git/mysql-server_dbg/sql/sql_parse.cc:5414
#22 0x00000000024b68e7 in dispatch_command (thd=0x7f161a419000, com_data=0x7f1662830b80, command=COM_QUERY)
    at /git/mysql-server_dbg/sql/sql_parse.cc:1708
#23 0x00000000024b53f5 in do_command (thd=0x7f161a419000) at /git/mysql-server_dbg/sql/sql_parse.cc:1291
#24 0x000000000285b2d6 in handle_connection (arg=0x7f164e6eb3c0)
    at /git/mysql-server_dbg/sql/conn_handler/connection_handler_per_thread.cc:328
#25 0x00000000036ec54d in pfs_spawn_thread (arg=0x7f164e794620) at /git/mysql-server_dbg/storage/perfschema/pfs.cc:2985
#26 0x00007f1662285e25 in start_thread (arg=0x7f1662831700) at pthread_create.c:308
#27 0x00007f166066534d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113

How to repeat:
# mysqld options required for replay: --sql_mode=
CREATE DATABASE test;
USE test;
SET NAMES utf8,@@character_set_results=NULL;
CREATE TEMPORARY TABLE t1(a INT,b INT,INDEX i(a));
INSERT INTO t1 VALUES(1,REPEAT(CONCAT(0,CAST(CHAR(0)AS BINARY),0),40000));
SELECT 1 FROM t1 ORDER BY @x:=makedate(a,a);
[27 Oct 2017 21:58] Roel Van de Paar
This bug is all over the runs. Will add few more testcases.
[27 Oct 2017 22:32] Roel Van de Paar
More testcases

# mysqld options required for replay:  --sql_mode=
CREATE DATABASE test;
USE test;
SET @@session.max_sort_length=20;
CREATE TEMPORARY TABLE t1(a int,b int,primary key (a)) engine=none;
SET NAMES utf8;
insert into t1 values(-999.999,-999.999);
SELECT hex(a)ha,hex(lower(a)) hl,hex(upper(a)) hu,a,lower(a) l,upper(a) u FROM t1 order by ha;

# mysqld options required for replay:  --sql_mode= --server-id=1
CREATE DATABASE test;
USE test;
xa start0;
create temporary TABLE t1(a int)engine=none;
INSERT INTO t1 VALUES("hoho");
SET @@session.max_sort_length=5;
delete from t1 order by(inet_ntoa(a)) desc;

# mysqld options required for replay:  --sql_mode= --server-id=1
CREATE DATABASE test;
USE test;
CREATE TABLE t1(a VARCHAR(334)CHARACTER SET utf16le KEY) engine=none;
SET @@session.max_sort_length=20;
INSERT INTO t1 VALUES('-11:22:33.999');
select * FROM t1 order by(oct(a));

# mysqld options required for replay:  --sql_mode= --server-id=1
CREATE DATABASE test;
USE test;
CREATE TABLE t1(a CHAR (1)CHARACTER SET ucs2);
SET @@session.max_sort_length=5;
insert INTO t1 values(0x110000);
delete FROM t1 order by(inet_ntoa(a)) desc;

# mysqld options required for replay:  --sql_mode= --server-id=1
CREATE DATABASE test;
USE test;
CREATE TABLE t1(a CHAR (255)default'',KEY a (a)) ENGINE=none DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
SET @@session.max_sort_length=20;
insert INTO t1 values(-99999999999999),(-1),('+1'),(''),('+00000000000001'),('+1234567890'),(99999999999999);
select * FROM t1 order by(oct(a));

# mysqld options required for replay:  --sql_mode= 
CREATE DATABASE test;
USE test;
SET @@session.character_set_connection=utf8;
create TABLE t1(a CHAR (1),key a(a)) collate utf8_czech_ci;
INSERT INTO t1 VALUES('2007-08-01 12:22:59');
SELECT 1 FROM t1 ORDER BY @x:=makedate(a,a);

CREATE DATABASE test;
USE test;
SET max_sort_length=4;
create temporary TABLE t1 as SELECT 1 a;
delete from t1 order by(inet_ntoa(a)) desc;

CREATE DATABASE test;
USE test;
SET NAMES 'utf8';
create temporary TABLE t1(a int)ENGINE=InnoDB;
INSERT INTO t1 VALUES(1);
SELECT 1 FROM t1 ORDER BY @x:=makedate(a,a);
[27 Oct 2017 23:17] MySQL Verification Team
Thank you for the bug report.
[14 Nov 2017 18:22] Paul DuBois
Posted by developer:
 
Noted in 8.0.4, 9.0.0.

Length calculations for string-valued user-defined variables could be
incorrect if the collation was changed.
[23 Sep 2018 23:48] Roel Van de Paar
See also bug 92537
[23 Sep 2018 23:49] Roel Van de Paar
See also bug 88278