| Bug #12417 | Connection.prepareCall() is database name case sensitive | ||
|---|---|---|---|
| Submitted: | 6 Aug 2005 22:01 | Modified: | 28 Feb 2007 23:24 |
| Reporter: | Paul van Rossem | ||
| Status: | Verified | ||
| Category: | Server: SP | Severity: | S3 (Non-critical) |
| Version: | 5.0 | OS: | Microsoft Windows (Windows XP) |
| Assigned to: | Alexander Nozdrin | Target Version: | 6.0 |
| Triage: | Triaged: D3 (Medium) | ||
[30 Aug 2005 19:54]
Mark Matthews
Technically a server bug, but I will work on a work-around for the driver (and fix the dubious error message). The reason that this worked prior to 3.1.8 is that the driver didn't respect the current catalog setting when asking for stored procedure metadata, which was a bug. Now, it turns out that the server doesn't respect lower_case_tablenames for "SHOW CREATE PROCEDURE", but does for CALL, which is what causes this error: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 to server version: 5.0.10a-beta Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show create procedure `Test`.`foo`; ERROR 1305 (42000): PROCEDURE foo does not exist mysql> show create procedure `test`.`foo`; +-----------+----------+-----------------------------------------------------+ | Procedure | sql_mode | Create Procedure | +-----------+----------+-----------------------------------------------------+ | foo | | CREATE PROCEDURE `test`.`foo`() begin select 1; end | +-----------+----------+-----------------------------------------------------+ 1 row in set (0.00 sec) mysql> call test.foo(); +---+ | 1 | +---+ | 1 | +---+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> call Test.foo(); +---+ | 1 | +---+ | 1 | +---+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> \s -------------- c:\mysql-servers\mysql-5.0.10a-beta-win32\bin\mysql Ver 14.12 Distrib 5.0.10a-b eta, for Win32 (ia32) Connection id: 6 Current database: test Current user: root@localhost SSL: Not in use Using delimiter: ; Server version: 5.0.10a-beta Protocol version: 10 Connection: localhost via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 TCP port: 3306 Uptime: 12 min 20 sec Threads: 2 Questions: 37 Slow queries: 0 Opens: 0 Flush tables: 1 Open tabl es: 2 Queries per second avg: 0.050 -------------- mysql>
[30 Aug 2005 20:37]
Mark Matthews
Patch is at http://lists.mysql.com/internals/29043 and http://lists.mysql.com/internals/29048 The code can be tested in tonight's nightly snapshot build which will be available after 00:00 GMT on the 31-Aug at http://downloads.mysql.com/snapshots.php#connector-j Thanks for your bug report.
[23 Sep 2005 0:15]
Konstantin Osipov
See also Bug#9051. A possible fix is to make stored procedures cache in sync with --lowercase-table-names and filesystem character set.

Description: com.mysql.jdbc.Connection.prepareCall(String sql) is sensitive for the case used in the database name passed during connection creation. This is strange since: 1) If the database name is case sensitive, it should already give an error during Connection creation, not later, only when calling a stored procedure, while all other kinds of database accesses succeed. 2) The SQLException generated during prepareCall() has as message text: "FUNCTION MYPROCEDURE does not exist." This is wrong, it exists, but it cannot be found because of the wrong case in the database name. 3) MYPROCEDURE is not a function, but a procedure. This bug did not exist in ConnectorJ 3.1.7. Using server 5.0.9 beta via TCP/IP. How to repeat: package nl.timeware.test; // note the case of Test instead test import java.sql.*; // in the second prepareCall() public class TestApp { static public void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "me","me"); connection.prepareCall("{CALL MYPROCEDURE()}").execute(); System.out.println("Success!"); connection = DriverManager.getConnection("jdbc:mysql://localhost/Test", "me", "me"); connection.prepareCall("{CALL MYPROCEDURE()}").execute(); // throws System.out.println("Never gets here!"); } catch(Exception exc) { System.out.println("Exception: " + exc.getMessage()); } } } Suggested fix: If the case in the database name is important, an exception should be thrown during connect. If it is not important, then Connection.prepareCall(String sql) should not dependent on this.