Skip to content

Commit

Permalink
CONJ-857 - remove use of mysql.proc table
Browse files Browse the repository at this point in the history
Retrieval of information now rely on information_schema.parameters

This permit compatibility with SkySQL, Xpand and MySQL 8 where mysql.proc are not available from user without explicit GRANT privileges.
  • Loading branch information
rusher committed May 10, 2021
1 parent f08e02d commit 4bc6130
Show file tree
Hide file tree
Showing 10 changed files with 343 additions and 355 deletions.
25 changes: 20 additions & 5 deletions src/main/java/org/mariadb/jdbc/CallableFunctionStatement.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ public abstract class CallableFunctionStatement extends ClientSidePreparedStatem
implements CallableStatement {

protected CallableParameterMetaData parameterMetadata;
private String databaseName;
private String functionName;

/** Information about parameters, merely from registerOutputParameter() and setXXX() calls. */
private CallParameter[] params;

Expand All @@ -80,14 +83,18 @@ public abstract class CallableFunctionStatement extends ClientSidePreparedStatem
* @param resultSetConcurrency a concurrency type; one of <code>ResultSet.CONCUR_READ_ONLY</code>
* or <code>ResultSet.CONCUR_UPDATABLE</code>
* @param exceptionFactory Exception factory
* @param databaseName database name
* @param functionName function name
* @throws SQLException if clientPrepareStatement creation throw an exception
*/
public CallableFunctionStatement(
MariaDbConnection connection,
String sql,
int resultSetType,
final int resultSetConcurrency,
ExceptionFactory exceptionFactory)
ExceptionFactory exceptionFactory,
String databaseName,
String functionName)
throws SQLException {
super(
connection,
Expand All @@ -96,6 +103,8 @@ public CallableFunctionStatement(
resultSetConcurrency,
Statement.NO_GENERATED_KEYS,
exceptionFactory);
this.databaseName = databaseName;
this.functionName = functionName;
}

/**
Expand Down Expand Up @@ -135,10 +144,16 @@ public void initFunctionData(int parametersCount) {
protected abstract SelectResultSet getResult() throws SQLException;

public ParameterMetaData getParameterMetaData() throws SQLException {
parameterMetadata.readMetadataFromDbIfRequired();
readMetadataFromDbIfRequired();
return parameterMetadata;
}

private void readMetadataFromDbIfRequired() throws SQLException {
if (parameterMetadata == null) {
parameterMetadata = connection.getInternalParameterMetaData(functionName, databaseName, true);
}
}

/**
* Convert parameter name to parameter index in the query.
*
Expand All @@ -147,9 +162,9 @@ public ParameterMetaData getParameterMetaData() throws SQLException {
* @throws SQLException exception
*/
private int nameToIndex(String parameterName) throws SQLException {
parameterMetadata.readMetadataFromDbIfRequired();
readMetadataFromDbIfRequired();
for (int i = 1; i <= parameterMetadata.getParameterCount(); i++) {
String name = parameterMetadata.getName(i);
String name = parameterMetadata.getParameterName(i);
if (name != null && name.equalsIgnoreCase(parameterName)) {
return i;
}
Expand All @@ -166,7 +181,7 @@ private int nameToIndex(String parameterName) throws SQLException {
*/
private int nameToOutputIndex(String parameterName) throws SQLException {
for (int i = 0; i < parameterMetadata.getParameterCount(); i++) {
String name = parameterMetadata.getName(i);
String name = parameterMetadata.getParameterName(i);
if (name != null && name.equalsIgnoreCase(parameterName)) {
return i;
}
Expand Down
Loading

0 comments on commit 4bc6130

Please sign in to comment.