Bug #61201 Can't establish connection when url has sessionVariables and characterEncoding
Submitted: 17 May 2011 13:46 Modified: 18 Jul 2011 15:04
Reporter: Arthur Du Email Updates:
Status: Closed Impact on me:
None 
Category:Connector / J Severity:S3 (Non-critical)
Version:5.1.16 OS:Any
Assigned to: CPU Architecture:Any
Tags: sessionVariables characterEncoding

[17 May 2011 13:46] Arthur Du
Description:
DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=password&sessionVariables=FOREIGN_KEY_CHECKS=0&characterEncoding=utf8")

Connection can't be established when the url has property "sessionVariables" and "characterEncoding" at the same time, but connection can be established when "sessionVariables" or "characterEncoding" is removed.
I try version 5.1.14 and 5.1.15, they have no such problem.

How to repeat:
Java source code:
Connection conn = null;
		try {
		    conn =
		       DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=password&sessionVariables=FOREIGN_KEY_CHECKS=0&characterEncoding=utf8");
		    conn.close();
		} catch (SQLException ex) {
			ex.printStackTrace();
		    // handle any errors
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		}

Result:
java.sql.SQLException: Unexpected exception encountered during query.
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2665)
	at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1698)
	at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1617)
	at com.mysql.jdbc.ConnectionImpl.setSessionVariables(ConnectionImpl.java:5210)
	at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3375)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2385)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
	at java.sql.DriverManager.getConnection(DriverManager.java:582)
	at java.sql.DriverManager.getConnection(DriverManager.java:207)
	at com.zubunet.test.App1.main(App1.java:14)
Caused by: java.lang.NullPointerException
	at com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding(ConnectionImpl.java:3100)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2095)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
	... 18 more
SQLException: Unexpected exception encountered during query.
SQLState: S1000
VendorError: 0
[20 May 2011 13:03] Tonci Grgin
Hi Arthur and thanks for your report.

True, there is a problem in MySQLIO.java, ln ~2095
	if (characterEncoding != null) {
		if (this.platformDbCharsetMatches) {
	    		this.sendPacket.writeStringNoNull(query, characterEncoding,
	    		this.connection.getServerCharacterEncoding(),
	    		this.connection.parserKnowsUnicode(),
	    		this.connection);
since this.connection.getServerCharacterEncoding() seems not to be initialized yet and by defining characterEncoding you are bound to enter this if.
[31 May 2011 23:50] Brian Craft
Can verify that we are encountering this bug when using Atlassian Confluence and Jira with tomcat 6.0.32 and the URL -

url="jdbc:mysql://<host>:3306/jira_next?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;sessionVariables=storage_engine=InnoDB"

    ... 51 more
Caused by: java.lang.NullPointerException
    at com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding(ConnectionImpl.java:3100)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2095)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
    ... 56 more
[18 Jul 2011 15:04] Tonci Grgin
Patch is pushed to revision 1077 but only for 4.1+ servers.
[22 Jul 2011 8:58] Tonci Grgin
Additional changes pushed up to revision 1079. Server character set is determined from handshake rather than by parsing server variables.
[30 Sep 2011 1:59] Philip Olson
Changelog entry for 5.1.18:

+        A connection could not be established when the
+        <acronym>URL</acronym>
+        contained both <literal>sessionVariables</literal> and
+        <literal>characterEncoding</literal>.