Bug #61225 | Incorrect arguments to mysqld_stmt_execute code: 1210 state: HY000 | ||
---|---|---|---|
Submitted: | 19 May 2011 10:55 | Modified: | 24 May 2011 16:20 |
Reporter: | Grzegorz B | Email Updates: | |
Status: | Can't repeat | Impact on me: | |
Category: | MySQL Server | Severity: | S2 (Serious) |
Version: | 5.1.49 | OS: | Any |
Assigned to: | CPU Architecture: | Any | |
Tags: | Contribution |
[19 May 2011 10:55]
Grzegorz B
[19 May 2011 12:21]
Valeriy Kravchuk
Please, check if the same problem happens with a recent version, 5.1.57.
[19 May 2011 13:16]
Grzegorz B
I will try it on 5.1.57 as soon as possible. So far I tracked it to relation with using setBlob() and corresponding LONG_DATA. Changing BLOB to INT did the trick - but it is unacceptable workaround for me. I suppose it is possible that this bug is related to this one: http://bugs.mysql.com/bug.php?id=26824 - active since 2007 as someone tagged it as "to be fixed later". Interesting thing is that it worked for me on 5.1.49, and why general_log is affecting behaviour of mysql-server ? Regards, Grzegorz http://ntsn.pl
[23 May 2011 11:52]
Grzegorz B
Hello again. I've checked this using code from 5.1.57 and it appears that this has been fixed in that version (file sql/sql_prepare.cc). I merged files sql_prepare.cc from 5.1.49 and 5.1.57 (working version) and produced patch that fixes this bug in 5.1.49 (I'm using debian package, and I don't want to upgrade to 5.1.57 from unstable on production server): --- mysql-5.1-5.1.49_old/sql/sql_prepare.cc 2011-05-23 10:27:56.000000000 +0200 +++ mysql-5.1-5.1.49/sql/sql_prepare.cc 2011-05-23 12:08:27.000000000 +0200 @@ -264,7 +264,9 @@ Protocol::SEND_EOF); } /* Flag that a response has already been sent */ - thd->main_da.disable_status(); + if (!error) + thd->main_da.disable_status(); + DBUG_RETURN(error); } #else @@ -836,7 +838,7 @@ type (the types are supplied at execute). Check that the supplied type of placeholder can accept a data stream. */ - else if (is_param_long_data_type(param)) + else if (! is_param_long_data_type(param)) DBUG_RETURN(1); if (param->convert_str_value(stmt->thd)) DBUG_RETURN(1); /* out of memory */ @@ -2358,12 +2360,14 @@ { sl->where= sl->prep_where->copy_andor_structure(thd); sl->where->cleanup(); - } + } else + sl->where= NULL; if (sl->prep_having) { sl->having= sl->prep_having->copy_andor_structure(thd); sl->having->cleanup(); - } + } else + sl->having= NULL; DBUG_ASSERT(sl->join == 0); ORDER *order; /* Fix GROUP list */ @@ -3265,6 +3269,13 @@ if (set_parameters(expanded_query, packet, packet_end)) return TRUE; + /* Check if we got an error when sending long data */ + if (state == Query_arena::ERROR) + { + my_message(last_errno, last_error, MYF(0)); + return TRUE; + } + reexecute: reprepare_observer.reset_reprepare_observer(); @@ -3502,12 +3513,6 @@ status_var_increment(thd->status_var.com_stmt_execute); - /* Check if we got an error when sending long data */ - if (state == Query_arena::ERROR) - { - my_message(last_errno, last_error, MYF(0)); - return TRUE; - } if (flags & (uint) IS_IN_USE) { my_error(ER_PS_NO_RECURSION, MYF(0)); Applying this patch on 5.1.49 allows me to use setBlob in C++ Connector, and everything appears to work fine (I hope), but I'm not completely sure what change in this patch fixed this problem. I think that this bug can be closed now, but I also think that someone should take a look at this patch, and clarify what was wrong (so other people could use this on 5.1.49 safely). Anyway - thanks for fixing this issue ! Regards, Grzegorz Bizon ntsn.pl software development http://ntsn.pl
[23 May 2011 11:53]
Grzegorz B
MySQL prepared statement longdata issue patch for 5.1.49
Attachment: mysql_pstmt_longdata.patch (text/x-diff), 1.88 KiB.
[24 May 2011 16:20]
Valeriy Kravchuk
Thank you for the patch. It may be useful for other community members. I am closing this report as not repeatable on current version, 5.1.57.