| Bug #79561 | NullPointerException when calling a fully qualified stored procedure | ||
|---|---|---|---|
| Submitted: | 9 Dec 2015 3:47 | Modified: | 11 Jan 2020 16:58 |
| Reporter: | Davi Arnaut (OCA) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / J | Severity: | S2 (Serious) |
| Version: | 5.1.36, 5.1.37, 5.1.38 | OS: | Any |
| Assigned to: | Filipe Silva | CPU Architecture: | Any |
| Tags: | CallableStatement, quote, regression, stored procedure | ||
[9 Dec 2015 3:47]
Davi Arnaut
[9 Dec 2015 3:47]
Davi Arnaut
Test case
Attachment: CallFuncQuote.java (application/octet-stream, text), 643 bytes.
[9 Dec 2015 5:44]
MySQL Verification Team
Hello Davi, Thank you for the report and test case. This seems to be broken from 5.1.16 onward. Thanks, Umesh
[9 Dec 2015 5:45]
MySQL Verification Team
// 5.1.38, 5.1.37, 5.1.36 - affected(broken since 5.1.16)
[umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: java -cp '.:/home/umshastr/bugs/mysql-connector-java-5.1.38/mysql-connector-java-5.1.38-bin.jar' CallFuncQuote
Exception in thread "main" java.lang.NullPointerException
at com.mysql.jdbc.CallableStatement.getNamedParamIndex(CallableStatement.java:1375)
at com.mysql.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1817)
at CallFuncQuote.main(CallFuncQuote.java:15)
[umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: java -cp '.:/home/umshastr/bugs/mysql-connector-java-5.1.37/mysql-connector-java-5.1.37-bin.jar' CallFuncQuote
Exception in thread "main" java.lang.NullPointerException
at com.mysql.jdbc.CallableStatement.getNamedParamIndex(CallableStatement.java:1375)
at com.mysql.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1817)
at CallFuncQuote.main(CallFuncQuote.java:15)
[umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: java -cp '.:/home/umshastr/bugs/mysql-connector-java-5.1.36/mysql-connector-java-5.1.36-bin.jar' CallFuncQuote
Exception in thread "main" java.lang.NullPointerException
at com.mysql.jdbc.CallableStatement.getNamedParamIndex(CallableStatement.java:1441)
at com.mysql.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1883)
at CallFuncQuote.main(CallFuncQuote.java:15)
[umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: java -cp '.:/home/umshastr/bugs/mysql-connector-java-5.1.16/mysql-connector-java-5.1.16-bin.jar' CallFuncQuote
Exception in thread "main" java.lang.NullPointerException
at com.mysql.jdbc.CallableStatement.getNamedParamIndex(CallableStatement.java:1486)
at com.mysql.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1908)
at CallFuncQuote.main(CallFuncQuote.java:15)
-- 5.1.14, 5.1.15 - not affected
[umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: java -cp '.:/home/umshastr/bugs/mysql-connector-java-5.1.14/mysql-connector-java-5.1.14-bin.jar' CallFuncQuote
outp = foo
[umshastr@hod03]/export/umesh/server/binaries/mysql-advanced-5.6.27: java -cp '.:/home/umshastr/bugs/mysql-connector-java-5.1.15/mysql-connector-java-5.1.15-bin.jar' CallFuncQuote
outp = foo
[2 Jan 2016 12:45]
Ramin Orujov
Dear Dav.
I've fixed this bug by adding a few lines in StringUtils.splitDBdotName method. Here is my fixed version.
public static List<String> splitDBdotName(String src, String cat, String quotId, boolean isNoBslashEscSet) {
if ((src == null) || (src.equals("%"))) {
return new ArrayList<String>();
}
boolean isQuoted = StringUtils.indexOfIgnoreCase(0, src, quotId) > -1;
String retval = src;
String tmpCat = cat;
//I.e., what if database is named `MyDatabase 1.0.0`... thus trueDotIndex
int trueDotIndex = -1;
if (!" ".equals(quotId)) {
//Presumably, if there is a database name attached and it contains dots, then it should be quoted so we first check for that
if (isQuoted) {
trueDotIndex = StringUtils.indexOfIgnoreCase(0, retval, quotId + "." + quotId);
// bug #79516 only database name is quoted, 2nd part after dot is not quoted
// http://bugs.mysql.com/bug.php?id=79561
if(trueDotIndex == -1) {
trueDotIndex = StringUtils.indexOfIgnoreCase(0, retval, quotId + ".");
}
} else {
// NOT quoted, fetch first DOT
// ex: cStmt = this.conn.prepareCall("{call bug57022.procbug57022(?, ?)}");
trueDotIndex = StringUtils.indexOfIgnoreCase(0, retval, ".");
}
} else {
trueDotIndex = retval.indexOf(".");
}
List<String> retTokens = new ArrayList<String>(2);
if (trueDotIndex != -1) {
//There is a catalog attached
if (isQuoted) {
tmpCat = StringUtils.toString(StringUtils.stripEnclosure(retval.substring(0, trueDotIndex + 1).getBytes(), quotId, quotId));
if (StringUtils.startsWithIgnoreCaseAndWs(tmpCat, quotId)) {
tmpCat = tmpCat.substring(1, tmpCat.length() - 1);
}
retval = retval.substring(trueDotIndex + 2);
retval = StringUtils.toString(StringUtils.stripEnclosure(retval.getBytes(), quotId, quotId));
} else {
//NOT quoted, adjust indexOf
tmpCat = retval.substring(0, trueDotIndex);
retval = retval.substring(trueDotIndex + 1);
}
} else {
//No catalog attached, strip retval and return
retval = StringUtils.toString(StringUtils.stripEnclosure(retval.getBytes(), quotId, quotId));
}
retTokens.add(tmpCat);
retTokens.add(retval);
return retTokens;
}
[2 Jan 2016 12:46]
Ramin Orujov
Attached fixed version.
Attachment: StringUtils.java (text/x-java), 85.50 KiB.
[2 Jan 2016 13:22]
Ramin Orujov
Here is my pull request https://github.com/mysql/mysql-connector-j/pull/8
[2 Jan 2016 14:26]
Ramin Orujov
Here is output from Davi's test case with fixed jar file. raminorujov@ro--ubuntu:~/Downloads$ pwd /home/raminorujov/Downloads raminorujov@ro--ubuntu:~/Downloads$ cp ~/repo/ro-mysql-connector-j/mysql-connector-j/build/mysql-connector-java-5.1.38-SNAPSHOT/mysql-connector-java-5.1.38-SNAPSHOT-bin.jar . raminorujov@ro--ubuntu:~/Downloads$ javac CallFuncQuote.java raminorujov@ro--ubuntu:~/Downloads$ java -cp .:mysql-connector-java-5.1.38-SNAPSHOT-bin.jar CallFuncQuote outp = foo raminorujov@ro--ubuntu:~/Downloads$
[14 Mar 2016 12:26]
Filipe Silva
Duplicate Bug#80722.
