Bug #30472 libmysql doesn't reset charset, insert_id after succ. mysql_change_user() call
| Submitted: | 17 Aug 2007 13:19 | Modified: | 25 Oct 2007 0:06 |
|---|---|---|---|
| Reporter: | Andrey Hristov | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: C API (client library) | Severity: | S2 (Serious) |
| Version: | 5.1.22-dev/4.1/5.0 | OS: | Any |
| Assigned to: | Alexander Nozdrin | CPU Architecture: | Any |
| Tags: | mysql_change_user | ||
[17 Aug 2007 14:05]
MySQL Verification Team
Thank you for the bug report. [miguel@skybr dbs]$ ./bug30472 Character set is : latin1 variable=character_set_client value= latin1 variable=character_set_connection value= latin1 variable=character_set_database value= latin1 variable=character_set_results value= latin1 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir value=/home/miguel/dbs/4.1/share/mysql/charsets/ Charset changed to utf8 Character set is : utf8 variable=character_set_client value= utf8 variable=character_set_connection value= utf8 variable=character_set_database value= latin1 variable=character_set_results value= utf8 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir value=/home/miguel/dbs/4.1/share/mysql/charsets/ Changed user Character set is : utf8 variable=character_set_client value= latin1 variable=character_set_connection value= latin1 variable=character_set_database value= latin1 variable=character_set_results value= latin1 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir value=/home/miguel/dbs/4.1/share/mysql/charsets/ ======================================================================================= [miguel@skybr dbs]$ ./bug30472 Character set is : latin1 variable=character_set_client value= latin1 variable=character_set_connection value= latin1 variable=character_set_database value= latin1 variable=character_set_filesystem value= binary variable=character_set_results value= latin1 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir value=/home/miguel/dbs/5.0/share/mysql/charsets/ Charset changed to utf8 Character set is : utf8 variable=character_set_client value= utf8 variable=character_set_connection value= utf8 variable=character_set_database value= latin1 variable=character_set_filesystem value= binary variable=character_set_results value= utf8 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir value=/home/miguel/dbs/5.0/share/mysql/charsets/ Changed user Character set is : utf8 variable=character_set_client value= latin1 variable=character_set_connection value= latin1 variable=character_set_database value= latin1 variable=character_set_filesystem value= binary variable=character_set_results value= latin1 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir
[20 Aug 2007 9:22]
Andrey Hristov
mysql->last_insert_id is also not cleared.
[28 Sep 2007 11:40]
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/34635 ChangeSet@1.2612, 2007-09-28 15:42:37+04:00, anozdrin@station. +4 -0 Prerequisite patch for BUG#30472: libmysql doesn't reset charset, insert_id after succ. mysql_change_user() call. Supply a correct packet length to dispatch command.
[28 Sep 2007 19:27]
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/34658 ChangeSet@1.2613, 2007-09-28 23:30:54+04:00, anozdrin@station. +5 -0 Patch for BUG#30472: libmysql doesn't reset charset, insert_id after succ. mysql_change_user() call. See also WL 4066. This bug reveals two problems: - the problem on the client side which was described originally; - the problem in protocol / the server side: connection context on client and server should be like after mysql_real_connect() and be consistent. The server however just resets character set variables to the global defaults. The fix seems to be as follows: - extend the protocol so that the client be able to send character set information in COM_CHANGE_USER command; - change the server so that it understands client character set in the command; - change the client: - reset character set to the default value (which has been read from the configuration); - send character set in COM_CHANGE_USER command.
[30 Sep 2007 20:19]
Alexander Nozdrin
Pushed into 5.1-runtime.
[1 Oct 2007 11:36]
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/34707 ChangeSet@1.2618, 2007-10-01 15:41:18+04:00, anozdrin@station. +2 -0 BUG#30472: libmysql doesn't reset charset, insert_id after succ. mysql_change_user() call. Use 2 bytes for character set number.
[19 Oct 2007 18:52]
Bugs System
Pushed into 5.1.23-beta
[25 Oct 2007 0:06]
Paul DuBois
Noted in 5.1.23 changelog. The mysql_change_user() C API function did not correctly reset the character set variables to the values they had just after initially connecting.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.077 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: mysql_change_user() doesn't reset the character after successful COM_CHANGE_USER. See "How to repeat" for more information. How to repeat: [16:09:36] andrey@lmy004:~/test> ./charsetreset Character set is : latin1 variable=character_set_client value= latin1 variable=character_set_connection value= latin1 variable=character_set_database value= latin1 variable=character_set_filesystem value= binary variable=character_set_results value= latin1 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir value=/usr/local/mysql/share/mysql/charsets/ Charset changed to utf8 Character set is : utf8 variable=character_set_client value= utf8 variable=character_set_connection value= utf8 variable=character_set_database value= latin1 variable=character_set_filesystem value= binary variable=character_set_results value= utf8 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir value=/usr/local/mysql/share/mysql/charsets/ Changed user Character set is : utf8 <---- Still utf8, on the server however latin1 variable=character_set_client value= latin1 variable=character_set_connection value= latin1 variable=character_set_database value= latin1 variable=character_set_filesystem value= binary variable=character_set_results value= latin1 variable=character_set_server value= latin1 variable=character_set_system value= utf8 variable=character_sets_dir value=/usr/local/mysql/share/mysql/charsets/ ----------------------- #include <mysql.h> #include <stdio.h> #define MHOST "127.0.0.1" #define MUSER "root" #define MPASS "" #define MDB "test" #define MPORT 3306 int main() { MYSQL mysql; MYSQL_RES *result; MYSQL_ROW row; mysql_init(&mysql); if (NULL == mysql_real_connect(&mysql, MHOST, MUSER, MPASS, MDB, MPORT, NULL, CLIENT_MULTI_RESULTS)) { printf("Error while connecting"); exit(1); } printf("Character set is : %s\n", mysql_character_set_name(&mysql)); if (mysql_query(&mysql, "show variables like 'char%'")) { printf("Error while querying [1]"); exit(1); } if (!(result = mysql_store_result(&mysql))) { printf("Error while storing result [1]"); exit(1); } while (row = mysql_fetch_row(result)) { printf("variable=%-30s value=%10s\n", row[0], row[1]); } mysql_free_result(result); if (mysql_set_character_set(&mysql, "utf8")) { printf("Error while changing charset"); exit(1); } printf("\nCharset changed to utf8\n\n"); printf("Character set is : %s\n", mysql_character_set_name(&mysql)); if (mysql_query(&mysql, "show variables like 'char%'")) { printf("Error while querying [2]"); exit(1); } if (!(result = mysql_store_result(&mysql))) { printf("Error while storing result [2]"); exit(1); } while (row = mysql_fetch_row(result)) { printf("variable=%-30s value=%10s\n", row[0], row[1]); } mysql_free_result(result); if (mysql_change_user(&mysql, MUSER, MPASS, MDB)) { printf("Error while changing user"); exit(1); } printf("\nChanged user\n\n"); printf("Character set is : %s\n", mysql_character_set_name(&mysql)); if (mysql_query(&mysql, "show variables like 'char%'")) { printf("Error while querying [3]"); exit(1); } if (!(result = mysql_store_result(&mysql))) { printf("Error while storing result [3]"); exit(1); } while (row = mysql_fetch_row(result)) { printf("variable=%-30s value=%10s\n", row[0], row[1]); } mysql_free_result(result); if (mysql_change_user(&mysql, MUSER, MPASS, MDB)) { printf("Error while changing user"); exit(1); } mysql_close(&mysql); }