Skip to content

Commit

Permalink
[CONJ-643] PreparedStatement::getParameterMetaData always returns VAR…
Browse files Browse the repository at this point in the history
…STRING as type resulting in downstream libraries interpreting values wrongly
  • Loading branch information
rusher committed Sep 5, 2018
1 parent a75555f commit 7b0c932
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 14 deletions.
17 changes: 13 additions & 4 deletions src/main/java/org/mariadb/jdbc/MariaDbParameterMetaData.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,11 @@

package org.mariadb.jdbc;

import org.mariadb.jdbc.internal.ColumnType;
import org.mariadb.jdbc.internal.com.read.resultset.ColumnInformation;

import java.sql.ParameterMetaData;
import java.sql.SQLException;
import org.mariadb.jdbc.internal.ColumnType;
import org.mariadb.jdbc.internal.com.read.resultset.ColumnInformation;
import org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper;

/**
* Very basic info about the parameterized query, only reliable method is getParameterCount().
Expand Down Expand Up @@ -118,9 +118,18 @@ public int getScale(int param) throws SQLException {
return 0;
}

/**
* Parameter type are not sent by server.
*
* See https://jira.mariadb.org/browse/CONJ-568 and https://jira.mariadb.org/browse/MDEV-15031
*
* @param param parameter number
* @return SQL type from java.sql.Types
* @throws SQLException a feature not supported, since server doesn't sent the right information
*/
@Override
public int getParameterType(int param) throws SQLException {
return getParameterInformation(param).getColumnType().getSqlType();
throw ExceptionMapper.getFeatureNotSupportedException("Getting parameter type metadata are not supported");
}

@Override
Expand Down
57 changes: 47 additions & 10 deletions src/test/java/org/mariadb/jdbc/DriverTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,24 +52,46 @@

package org.mariadb.jdbc;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import com.sun.jna.Platform;
import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.sql.SQLSyntaxErrorException;
import java.sql.Savepoint;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mariadb.jdbc.internal.util.DefaultOptions;
import org.mariadb.jdbc.internal.util.constant.HaMode;

import java.math.BigDecimal;
import java.sql.*;
import java.sql.Date;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import static org.junit.Assert.*;


public class DriverTest extends BaseTest {

Expand Down Expand Up @@ -199,6 +221,21 @@ public void preparedTest() throws SQLException {
assertEquals(2, prepStmt.getParameterMetaData().getParameterCount());
}

@Test
public void parameterMetaDataTypeNotAvailable() throws SQLException {
String query = "SELECT * FROM DriverTestt4 WHERE test = ? and id = ?";
try (PreparedStatement prepStmt = sharedConnection.prepareStatement(query)) {
ParameterMetaData parameterMetaData = prepStmt.getParameterMetaData();
assertEquals(2, parameterMetaData.getParameterCount());
try {
parameterMetaData.getParameterType(1);
fail("must have thrown an error");
} catch (SQLException sqle) {
assertTrue( sqle instanceof SQLFeatureNotSupportedException);
}
}
}

@Test
public void parameterMetaDataNotPreparable() throws SQLException {
Assume.assumeFalse(sharedUsePrepare());
Expand Down

0 comments on commit 7b0c932

Please sign in to comment.