Bug #39693 error reporting for mysql_library_init
| Submitted: | 26 Sep 2008 21:25 | Modified: | 29 May 2012 19:11 |
|---|---|---|---|
| Reporter: | Ian Monroe | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Embedded Library ( libmysqld ) | Severity: | S3 (Non-critical) |
| Version: | 5.1, 5.5, 5.6 | OS: | Any |
| Assigned to: | CPU Architecture: | Any |
[27 Sep 2008 15:35]
Sveta Smirnova
Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://dev.mysql.com/doc/ and the instructions on how to report a bug at http://bugs.mysql.com/how-to-report.php You should check errors in your application. For example: if (int OK = mysql_library_init(num_elements, server_options, server_groups)) { printf("Return code: %d, Error: %s", OK, mysql_error(mysql)); exit(OK); } Which returns: $./bug39693 Return code: 1, Error: mysql_embedded: unknown option '--notoption'
[27 Sep 2008 16:19]
Ian Monroe
Where does that 'mysql' variable come from in mysql_error(mysql)? I understand how error reporting happens after initialization, that works fine. But I don't see how it works during the initial initialization. To me it appears that its not implemented at all.
[28 Sep 2008 14:53]
Ian Monroe
We've done like you suggested and it actually does work; the parameter given to mysql_error can be null and it works as expected. I suggest that http://dev.mysql.com/doc/refman/5.1/en/mysql-error.html explain the behavior when given a null pointer; its not very obvious that it would work.
[29 Sep 2008 15:10]
Ian Monroe
Since writing that message I got a backtrace that seemed to show error_report returning nonsense. So I'm actually not sure if mysql_error( 0 ) has a defined behavior or not. Would be nice to know. :)
[2 Oct 2008 15:09]
Paul DuBois
Sveta's example is incorrect because it passes a mysql structure to mysql_error(). But mysql_library_init() is the first API call, so at that point you have no mysql structure. The mysql_error() function is documented as taking a mysql structure argument. This does not imply NULL should work, nor should NULL be passed. mysql_library_init() merely returns non-zero when it fails. Providing additional information about the cause of failure could be useful, but that is more appropriately filed as feature request.
[2 Oct 2008 15:26]
Ian Monroe
Ok thanks for the info. mysql_error does work generally with a null parameter. But I guess I'll disable that from happening before we make a stable release.
[2 Oct 2008 17:20]
Sveta Smirnova
Thank you for the feedback. I don't understand why you say mysql_error shows nonsense: $g++ -o bug39693 bug39693.cpp `/Users/apple/Applications/mysql-5.1/bin/mysql_config --include --libmysqld-libs` -g /usr/bin/ld: warning multiple definitions of symbol ___cxa_pure_virtual /Users/apple/Applications/mysql-5.1/lib/mysql/libmysqld.a(my_new.o) definition of ___cxa_pure_virtual in section (__TEXT,__text) /usr/local/lib/gcc/i386-apple-darwin8.8.1/4.1.2/../../../libstdc++.dylib(single module) definition of ___cxa_pure_virtual $./bug39693 Return code: 1, Error: mysql_embedded: unknown option '--notoption' $cat bug39693.cpp #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include "mysql.h" MYSQL *mysql; int main() { static const int num_elements = 5; char **server_options = new char* [ num_elements + 1 ]; server_options[0] = "amarokmysqld"; server_options[1] = "--notoption"; server_options[2] = "--asdfwer"; server_options[3] = "--default-storage-engine=MYISAM"; server_options[4] = "--skip-innodb"; server_options[5] = 0; char **server_groups = new char* [ 3 ]; server_groups[0] = "amarokserver"; server_groups[1] = "amarokclient"; server_groups[2] = 0; if (int OK = mysql_library_init(num_elements, server_options, server_groups)) { printf("Return code: %d, Error: %s", OK, mysql_error(mysql)); exit(OK); } mysql = mysql_init(NULL); }
[2 Oct 2008 17:25]
Sveta Smirnova
See definition of mysql_error else:
const char * STDCALL mysql_error(MYSQL *mysql)
{
return mysql ? mysql->net.last_error : mysql_server_last_error;
}
Else see definition of set_mysql_error where mysql_server_last_error is set:
void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate)
{
NET *net;
DBUG_ENTER("set_mysql_error");
DBUG_PRINT("enter", ("error :%d '%s'", errcode, ER(errcode)));
DBUG_ASSERT(mysql != 0);
if (mysql)
{
net= &mysql->net;
net->last_errno= errcode;
strmov(net->last_error, ER(errcode));
strmov(net->sqlstate, sqlstate);
}
else
{
mysql_server_last_errno= errcode;
strmov(mysql_server_last_error, ER(errcode));
}
DBUG_VOID_RETURN;
}
[13 May 2012 18:30]
Shane Bester
on libmysqld in mysql-trunk (5.6.6) I get a useless error message.
# embedded mysql_library_init() failed (2000, mysql_embedded: Shutdown complete
)
The code is as follows (note the type in consolt):
static const char *server_options[]={"gemsbok", "--defaults-file=my.ini","--consolt", NULL };
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;
static const char *server_groups[] = { "libmysqld_server",NULL };
if(mysql_library_init(num_elements, (char**)server_options, (char**)server_groups))
{
printf("# embedded mysql_library_init() failed (%d, %s)\n",mysql_errno(NULL),mysql_error(NULL));
return 1;
}
[23 May 2012 18:40]
Shane Bester
i meant it's not fixed imho. how am i to know what went wrong with such error message? "# embedded mysql_library_init() failed (2000, mysql_embedded: Shutdown complete)" nothing written to the error log or stdout/stderr either.
[29 May 2012 19:11]
Sveta Smirnova
Thank you for update. Verified as described. After 5.5 it is even worse nonsense returned: "mysql_embedded: Shutdown complete"
[20 Jun 2012 0:47]
Stefan Brüns
One problem is that the error message is overwritten by any subsequent error. At least for the initialization of the error messages, there is a bug that is does not fail immediately, but sometime later. At this time, the error message is already overwritten.
[20 Jun 2012 0:49]
Stefan Brüns
Patch: fail immediately when errmsg.sys can not be loaded
Attachment: mysql_fail_on_missing_errmsg_sys.patch (text/x-patch), 2.01 KiB.
[31 Oct 2014 17:54]
Shane Bester
I beg to differ this is a FR. Every time I am forced to step through in debugger to find out what is wrong. Hardly user friendly, or even dev friendly!
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.047 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.
Description: If you run `/usr/sbin/mysqld --hasdf` it will give a nice message like: 080926 16:11:20 [ERROR] /usr/sbin/mysqld: unknown option '--hasdf' However the embedded library does give any indication what goes wrong when it returns 1 from mysql_library_init. A dev actually had to debug step-by-step to see that --skip-innodb wasn't supported by his mysql which was causing mysql_library_init to bail out. Currently there's a user who is also receiving a 1 on mysql_library_init. They don't have any errant options. Its going to be really hard to figure out what is wrong. How to repeat: The following code will crash, since mysql_library_init returns 1 due to the bad options. static const int num_elements = 5; char **server_options = new char* [ num_elements + 1 ]; server_options[0] = "amarokmysqld"; server_options[1] = "--notoption"; server_options[2] = "--asdfwer"; server_options[3] = "--default-storage-engine=MYISAM"; server_options[4] = "--skip-innodb"; server_options[5] = 0; char **server_groups = new char* [ 3 ]; server_groups[0] = "amarokserver"; server_groups[1] = "amarokclient"; server_groups[2] = 0; mysql_library_init(num_elements, server_options, server_groups); m_db = mysql_init(NULL); Suggested fix: Embedded mysql should send error messages to stderr like the mysqld process does. Alternatively it could return an error code with more meaning then 1.