Bug #24657 debug assertation fails (string store)
Submitted: 28 Nov 2006 15:12 Modified: 10 Jan 2008 9:49
Reporter: Martin Friebe (Gold Quality Contributor) (OCA) Email Updates:
Status: Duplicate Impact on me:
None 
Category:MySQL Server: General Severity:S3 (Non-critical)
Version:4.1.22, 5.0.27/4.1BK/5.0BK/5.1BK OS:FreeBSD (freebsd/Suse Linux 10)
Assigned to: Assigned Account CPU Architecture:Any
Tags: assert, debug, qc

[28 Nov 2006 15:12] Martin Friebe
Description:
mysql compiled from the source tarball with the --debug option will fail an assertation on the belo testcase.

how to repeat, contains the content for mysql-test/t/insert.test

the r.insert.result file can be empty or anything

the server will fail an assertation with this test

stacktrace for mysql 4:
(see line 13 / 14 : at field.cc:5028)

#0  0x2841c31b in pthread_testcancel () from /usr/lib/libpthread.so.1
#1  0x284071dd in pthread_kill () from /usr/lib/libpthread.so.1
#2  0x0817245e in write_core (sig=6) at stacktrace.c:245
#3  0x080ac3e7 in handle_segfault (sig=6) at mysqld.cc:2022
#4  0x2840be26 in sigaction () from /usr/lib/libpthread.so.1
#5  0x2840bcab in sigaction () from /usr/lib/libpthread.so.1
#6  0x2840c86c in sigaction () from /usr/lib/libpthread.so.1
#7  0x2840cafe in sigaction () from /usr/lib/libpthread.so.1
#8  0x28414043 in pthread_mutexattr_init () from /usr/lib/libpthread.so.1
#9  0x2841ca35 in pthread_testcancel () from /usr/lib/libpthread.so.1
#10 0x284071ee in pthread_kill () from /usr/lib/libpthread.so.1
#11 0x28406bac in raise () from /usr/lib/libpthread.so.1
#12 0x285c4c1b in abort () from /lib/libc.so.5
#13 0x2859f9ff in __assert () from /lib/libc.so.5
#14 0x0809773c in Field_str::store (this=0xa3bf558, nr=0.98696366696335713) at field.cc:5028
#15 0x0809be08 in Field_string::store (this=0xa3bf558, nr=0.98696366696335713) at field.h:911
#16 0x0814a5a1 in field_conv (to=0xa3bf558, from=0xa3c5038) at field_conv.cc:634
#17 0x080547e4 in Item_field::save_in_field (this=0xa3c5150, to=0xa3bf558, no_conversions=false) at item.cc:2115
#18 0x080df15c in fill_record (ptr=0xa3bf53c, values=@0xa3c4bb0, ignore_errors=true) at sql_base.cc:2936
#19 0x080fe041 in select_insert::store_values (this=0xa051e00, values=@0xa051e00) at sql_insert.cc:1700
#20 0x080fdf3d in select_insert::send_data (this=0xa3c4208, values=@0xa3c4bb0) at sql_insert.cc:1671
#21 0x080f24bf in end_send (join=0xa3c4258, join_tab=0xa3c5304, end_of_records=false) at sql_select.cc:6802
#22 0x080f13c4 in sub_select (join=0xa3c4258, join_tab=0xa3c51c0, end_of_records=false) at sql_select.cc:6221
#23 0x080f0fa6 in do_select (join=0xa3c4258, fields=0xa3c4bb0, table=0x0, procedure=0x80f23f8) at sql_select.cc:6105
#24 0x080e6688 in JOIN::exec (this=0xa3c4258) at sql_select.cc:1592
#25 0x080e6b85 in mysql_select (thd=0xa3ad000, rref_pointer_array=0xa3ad218, tables=0xa3c41a0, wild_num=0, fields=@0xa3ad194, conds=0x0, og_num=0, order=0x0,
    group=0x0, having=0x0, proc_param=0x0, select_options=2458274304, result=0xa3c4208, unit=0xa3ad048, select_lex=0xa3ad128) at sql_select.cc:1716
#26 0x080e2dd5 in handle_select (thd=0xa3ad000, lex=0xa3ad03c, result=0xa3c4208) at sql_select.cc:181
#27 0x080c08af in mysql_execute_command (thd=0xa3ad000) at sql_parse.cc:2985
#28 0x080c3699 in mysql_parse (thd=0xa3ad000, inBuf=0xa3c4010 "insert into t1 select rand() from t1", length=171626556) at sql_parse.cc:4374
#29 0x080bd5ef in dispatch_command (command=COM_QUERY, thd=0xa3ad000, packet=0xa3af001 "insert into t1 select rand() from t1", packet_length=37)
    at sql_parse.cc:1530
#30 0x080bcf8b in do_command (thd=0xa3ad000) at sql_parse.cc:1331
#31 0x080bc59d in handle_one_connection (arg=0x0) at sql_parse.cc:1063
#32 0x28414902 in pthread_mutexattr_init () from /usr/lib/libpthread.so.1

How to repeat:
--disable_warnings
drop table if exists t1;
--enable_warnings

create table t1 (a varchar(19));

insert into t1 select rand();
insert into t1 select rand() from t1;
insert into t1 select rand() from t1;
insert into t1 select rand() from t1;
insert into t1 select rand() from t1;

Suggested fix:
-
[28 Nov 2006 16:56] MySQL Verification Team
Thank you for the bug report.

Server version: 5.1.14-beta-debug Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> --disable_warnings
mysql> drop table if exists t1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> --enable_warnings
mysql> 
mysql> create table t1 (a varchar(19));
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> insert into t1 select rand();
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t1 select rand() from t1;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t1 select rand() from t1;
ERROR 2013 (HY000): Lost connection to MySQL server during query
------------------------------------------------------------------
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.32-debug Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> --disable_warnings
mysql> drop table if exists t1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> --enable_warnings
mysql> 
mysql> create table t1 (a varchar(19));
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> insert into t1 select rand();
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t1 select rand() from t1;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t1 select rand() from t1;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> 
------------------------------------------------------------------
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.23-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> --disable_warnings
mysql> drop table if exists t1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> --enable_warnings
mysql> 
mysql> create table t1 (a varchar(19));
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> insert into t1 select rand();
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t1 select rand() from t1;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t1 select rand() from t1;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql>
[19 Dec 2007 10:43] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/40187

ChangeSet@1.2546, 2007-12-19 11:45:48+01:00, mhansson@linux-st28.site +3 -0
  Bug#24657: debug assertation fails (string store)
  
  sprintf is used to insert DOUBLE values into VARCHAR columns, but it
  was assumed that sprintf would write only 1 byte for a positive number
  n < 1. In realtity it needs two, one for leading zero and one for decimal
  point. Fixed by making the number 2.
[10 Jan 2008 9:49] Martin Hansson
This bug got fixed along with Bug#26788, so there's no need to push this patch.