Bug #12589 Assert when creating temp. table from decimal stored procedure variable

Submitted: 15 Aug 2005 19:35 Modified: 30 Sep 2005 18:52
Reporter: Sergey Petrunya Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server Severity:S3 (Non-critical)
Version:5.0-bk OS:Linux (Linux)
Assigned to: Per-Erik Martin CPU Architecture:Any

[15 Aug 2005 19:35] Sergey Petrunya
Description:
One can cause the server to fail an assertion by doing the following:
* declare an SP variable of type decimal
* Attempt to assign it some invalid value
Create a temporary table from that variable.

How to repeat:
Run this: 

delimiter //
create procedure test()
begin
  declare spv1 decimal(3,3);
  set spv1= 123.456;

  set spv1 = 'test';
  create temporary table tm1 as select spv1;
  show create table tm1;
  drop temporary table tm1;
end//

call test()//

And see server to fail an assertion:
  mysqld: decimal.c:1417: decimal_bin_size: Assertion `scale >= 0 && precision > 0 && scale <= precision' failed.

(gdb) where
  #0  0xb7e013d1 in kill () from /lib/libc.so.6
  #1  0xb7f5f131 in pthread_kill () from /lib/libpthread.so.0
  #2  0xb7f5f4ab in raise () from /lib/libpthread.so.0
  #3  0xb7e01164 in raise () from /lib/libc.so.6
  #4  0xb7e0263d in abort () from /lib/libc.so.6
  #5  0xb7dfa58f in __assert_fail () from /lib/libc.so.6
  #6  0x0842e6cc in decimal_bin_size (precision=0, scale=0) at decimal.c:1417
  #7  0x0811e628 in my_decimal_get_binary_size (precision=0, scale=0) at my_decimal.h:167
  #8  0x0816a756 in Field_new_decimal (this=0x8c89bb8, len_arg=1, maybe_null=true, name=0x8c96f40 "spv1", t_arg=0xb57f44b4, dec_arg=0 '\0', unsigned_arg=false) at field.cc:2309
  #9  0x081f787e in create_tmp_field_from_item (thd=0x8c61788, item=0x8c96eb8, table=0xb57f44b4, copy_func=0x0, modify_item=false, convert_blob_length=0) at sql_select.cc:7965
  #10 0x081f7c54 in create_tmp_field (thd=0x8c61788, table=0xb57f44b4, item=0x8c96eb8, type=DECIMAL_ITEM, copy_func=0x0, from_field=0xb57f448c, group=false, modify_item=false, table_cant_handle_bit_fields=false, convert_blob_length=0) at sql_select.cc:8107
  #11 0x08284c65 in create_table_from_items (thd=0x8c61788, create_info=0x8c9d020, create_table=0x8c96d48, extra_fields=0x8c9cf48, keys=0x8c9cf3c, items=0x8c9cdac, lock=0x8c88dd4) at sql_table.cc:1726
  #12 0x0820e70e in select_create::prepare (this=0x8c88d58, values=@0x8c9cdac, u=0x8c9cb40) at sql_insert.cc:2478
  #13 0x081e4cd3 in JOIN::prepare (this=0x8c88de0, rref_pointer_array=0x8c9ce44, tables_init=0x0, wild_num=0, conds_init=0x0, og_num=0, order_init=0x0, group_init=0x0, having_init=0x0, proc_param_init=0x0, select_lex_arg=0x8c9cd30, unit_arg=0x8c9cb40) at sql_select.cc:475
  #14 0x081e9ef0 in mysql_select (thd=0x8c61788, rref_pointer_array=0x8c9ce44, tables=0x0, wild_num=0, fields=@0x8c9cdac, conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0, select_options=2457881088, result=0x8c88d58, unit=0x8c9cb40, select_lex=0x8c9cd30) at sql_select.cc:2064
  #15 0x081e4315 in handle_select (thd=0x8c61788, lex=0x8c9cb30, result=0x8c88d58, setup_tables_done_option=0) at sql_select.cc:238
  #16 0x081aabc7 in mysql_execute_command (thd=0x8c61788) at sql_parse.cc:2880
  #17 0x082e1975 in sp_instr_stmt::exec_core (this=0x8c96f50, thd=0x8c61788, nextp=0xb57f5354) at sp_head.cc:1604
  #18 0x082e1674 in sp_lex_keeper::reset_lex_and_exec_core (this=0x8c96f78, thd=0x8c61788, nextp=0xb57f5354, open_tables=false, instr=0x8c96f50) at sp_head.cc:1510
  #19 0x082e18bc in sp_instr_stmt::execute (this=0x8c96f50, thd=0x8c61788, nextp=0xb57f5354) at sp_head.cc:1581
  #20 0x082df09d in sp_head::execute (this=0x8c96818, thd=0x8c61788) at sp_head.cc:670
  #21 0x082dfdf7 in sp_head::execute_procedure (this=0x8c96818, thd=0x8c61788, args=0x8c61bfc) at sp_head.cc:950
  #22 0x081aeede in mysql_execute_command (thd=0x8c61788) at sql_parse.cc:4206
  #23 0x081b2367 in mysql_parse (thd=0x8c61788, inBuf=0x8c8ccb0 "call test_splocal4()", length=20) at sql_parse.cc:5426
  #24 0x081a7a9e in dispatch_command (command=COM_QUERY, thd=0x8c61788, packet=0x8c84c51 "call test_splocal4()", packet_length=21) at sql_parse.cc:1657
  #25 0x081a72a6 in do_command (thd=0x8c61788) at sql_parse.cc:1460
  #26 0x081a63b4 in handle_one_connection (arg=0x8c61788) at sql_parse.cc:1113
  #27 0xb7f5c13d in pthread_start_thread () from /lib/libpthread.so.0
  #28 0xb7f5c2e2 in pthread_start_thread_event () from /lib/libpthread.so.0
  #29 0xb7e8e07a in clone () from /lib/libc.so.6
(gdb) 

  #6  0x0842e6cc in decimal_bin_size (precision=0, scale=0) at decimal.c:1417
  Current language:  auto; currently c
(gdb) info locals
  intg = 0
  intg0 = 0
  frac0 = 0
  intg0x = 0
  frac0x = 0
(gdb) where

Suggested fix:
It seems not to be logical that size/precision of SP local variable is changed by assignment operator (what is the point of specifying size/precicion in DECLARE statement then??).

In addition to fixing this bug out we should figure out what type conversion rules we [should] have for SP variables.
[15 Aug 2005 19:41] MySQL Verification Team
Verified on Suse 9.3.
Thank you for the bug report.
[14 Sep 2005 16:02] Per-Erik Martin
Set to P2 since it's a crashing bug.
[20 Sep 2005 12:50] 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/internals/30100
[27 Sep 2005 15:42] 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/internals/30392
[29 Sep 2005 15:26] Per-Erik Martin
Pushed to bk 5.0.14
[30 Sep 2005 18:52] Paul DuBois
Noted in 5.0.14 changelog.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.042 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.