Bug #27885 command line clients puke on 'init-command' in my.cnf
Submitted: 17 Apr 2007 17:13 Modified: 5 Dec 2007 19:56
Reporter: Axel Schwenke
Status: Verified
Category:Client Severity:S3 (Non-critical)
Version:5.0.38 OS:Any
Assigned to: Target Version:
Tags: Contribution
Triage: Triaged: D3 (Medium)

[17 Apr 2007 17:13] Axel Schwenke
Description:
The mysql command line clients bail out with an error message like:

mysql: unknown variable 'init-command=...'

when they find the init-command option in the [client] group of an option file. 

According to the manual (http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html) there
are a couple of options that libmysqlclient will accept in an option file. Also the
[client] group is named as the default group to be read by libmysqlclient. Therefore
those options should be allowed in the [client] group of an option file.

However the command line clients treat the [client] group quite differently, trying to
parse options from that group on their own and thus error out on options they don't know.

How to repeat:
put 

[client]
init-command='set names latin1'

in my.cnf and start a command line client (mysql, mysqldump). Works also with
'multi-statements' and 'multi-results'. 'disable-local-infile' is accepted by mysql, but
not by mysqldump. etc.

Suggested fix:
Parsing options from the [client] group should be left to libmysqlclient.

Alternatively: the command line clients should ignore unknown options from the [client]
group.
[2 May 2007 21:59] Timothy Smith
It's not immediately obvious how to fix this.  Need to ensure that --totally-bogus-option
gives a warning *somewhere* (either in the client, or in libmysqlclient).
[20 Feb 2008 20:53] Omer BarNir
workaround: send the command(s) using an sql script
[3 Jul 3:37] Mikiya Okuno
I looked at the source code, and I think the problem is:

* mysql_real_connect() reads options using mysql_read_default_options() defined in
sql-common/client.c, which loads options to struct st_mysql_options using
my_load_defaults() defined in mysys/default.c.
* libmysqlclient can read init-command option through mysql_real_connect()
* in client/mysql.cc, options are loaded to global variables using get_options(),
get_one_option() and handle_options().

IMHO, mysql should not call mysql_real_connect() using MYSQL_READ_DEFAULT_FILE option.
Instead, it should read init-command separately as it does for other options.
[3 Jul 8:36] Mikiya Okuno
I've added a sample patch on bug #45634, which mysql CLI parses --init-command option.

Kind regards,
--
Mikiya