Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[CONJ 412] tinyInt1isBit and yearIsDateType is not applied in method …
…columnTypeClause
  • Loading branch information
rusher committed Jan 30, 2017
1 parent 5c502c2 commit cb7b705
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 30 deletions.
36 changes: 24 additions & 12 deletions src/main/java/org/mariadb/jdbc/MariaDbDatabaseMetaData.java
Expand Up @@ -85,19 +85,23 @@ public MariaDbDatabaseMetaData(Connection connection, String user, String url) {
this.connection.getProtocol().getServerVersion();
}

/* Remove length from column type spec,convert to uppercase, e.g bigint(10) unsigned becomes BIGINT UNSIGNED */
String columnTypeClause(String columnName) {
String parsedColumnName = parseColumnName(columnName);
return " UCASE(IF( " + parsedColumnName + " LIKE '%(%)%', CONCAT(SUBSTRING( " + parsedColumnName + ",1, LOCATE('(',"
+ parsedColumnName + ") - 1 ), SUBSTRING(" + parsedColumnName + ",1+locate(')'," + parsedColumnName + "))), "
+ parsedColumnName + "))";
}
static String columnTypeClause(int dataTypeMappingFlags) {
String upperCaseWithoutSize = " UCASE(IF( COLUMN_TYPE LIKE '%(%)%', CONCAT(SUBSTRING( COLUMN_TYPE,1, LOCATE('(',"
+ "COLUMN_TYPE) - 1 ), SUBSTRING(COLUMN_TYPE ,1+locate(')', COLUMN_TYPE))), "
+ "COLUMN_TYPE))";

if ((dataTypeMappingFlags & MariaSelectResultSet.TINYINT1_IS_BIT) > 0) {
upperCaseWithoutSize = " IF(COLUMN_TYPE = 'tinyint(1)', 'BIT', " + upperCaseWithoutSize + ")";
}

if ((dataTypeMappingFlags & MariaSelectResultSet.YEAR_IS_DATE_TYPE) == 0) {
return " IF(COLUMN_TYPE IN ('year(2)', 'year(4)'), 'SMALLINT', " + upperCaseWithoutSize + ")";
}

private String parseColumnName(String columnName) {
return (((connection.getProtocol().getDataTypeMappingFlags() & MariaSelectResultSet.TINYINT1_IS_BIT) == 0)
? columnName : "IF(" + columnName + "='tinyint(1)','BIT'," + columnName + ") ");
return upperCaseWithoutSize;
}


/**
* Retrieves a description of the primary key columns that are referenced by the given table's foreign key columns (the primary keys imported by a
* table). They are ordered by PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME, and KEY_SEQ.
Expand Down Expand Up @@ -619,9 +623,10 @@ public ResultSet getTables(String catalog, String schemaPattern, String tableNam
*/
public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
throws SQLException {
int dataType = connection.getProtocol().getDataTypeMappingFlags();
String sql = "SELECT TABLE_SCHEMA TABLE_CAT, NULL TABLE_SCHEM, TABLE_NAME, COLUMN_NAME,"
+ dataTypeClause("COLUMN_TYPE") + " DATA_TYPE,"
+ columnTypeClause("COLUMN_TYPE") + " TYPE_NAME, "
+ columnTypeClause(dataType) + " TYPE_NAME, "
+ " CASE DATA_TYPE"
+ " WHEN 'time' THEN "
+ (datePrecisionColumnExist ? "IF(DATETIME_PRECISION = 0, 10, CAST(11 + DATETIME_PRECISION as signed integer))" : "10")
Expand All @@ -630,10 +635,17 @@ public ResultSet getColumns(String catalog, String schemaPattern, String tableNa
+ (datePrecisionColumnExist ? "IF(DATETIME_PRECISION = 0, 19, CAST(20 + DATETIME_PRECISION as signed integer))" : "19")
+ " WHEN 'timestamp' THEN "
+ (datePrecisionColumnExist ? "IF(DATETIME_PRECISION = 0, 19, CAST(20 + DATETIME_PRECISION as signed integer))" : "19")
+ (((dataType & MariaSelectResultSet.YEAR_IS_DATE_TYPE) == 0) ? " WHEN 'year' THEN 5":"")
+ " ELSE "
+ " IF(NUMERIC_PRECISION IS NULL, LEAST(CHARACTER_MAXIMUM_LENGTH," + Integer.MAX_VALUE + "), NUMERIC_PRECISION) "
+ " END"
+ " COLUMN_SIZE, 65535 BUFFER_LENGTH, NUMERIC_SCALE DECIMAL_DIGITS,"
+ " COLUMN_SIZE, 65535 BUFFER_LENGTH, "

+ " CASE DATA_TYPE"
+ " WHEN 'year' THEN " + (((dataType & MariaSelectResultSet.YEAR_IS_DATE_TYPE) == 0) ? "0":"NUMERIC_SCALE")
+ " WHEN 'tinyint' THEN " + (((dataType & MariaSelectResultSet.TINYINT1_IS_BIT) > 0) ? "0":"NUMERIC_SCALE")
+ " ELSE NUMERIC_SCALE END DECIMAL_DIGITS,"

+ " 10 NUM_PREC_RADIX, IF(IS_NULLABLE = 'yes',1,0) NULLABLE,COLUMN_COMMENT REMARKS,"
+ " COLUMN_DEFAULT COLUMN_DEF, 0 SQL_DATA_TYPE, 0 SQL_DATETIME_SUB, "
+ " LEAST(CHARACTER_OCTET_LENGTH," + Integer.MAX_VALUE + ") CHAR_OCTET_LENGTH,"
Expand Down
41 changes: 23 additions & 18 deletions src/test/java/org/mariadb/jdbc/MariaDbDatabaseMetaDataTest.java
Expand Up @@ -15,27 +15,32 @@

public class MariaDbDatabaseMetaDataTest extends BaseTest {


/**
* CONJ-412: tinyInt1isBit and yearIsDateType is not applied in method columnTypeClause
* @throws Exception
*/
@Test
public void testColumnTypeClauseTinyInt1IsBitTrue() throws Exception {
MariaDbConnection connection = (MariaDbConnection)setConnection();
MariaDbDatabaseMetaData dbMetaData = new MariaDbDatabaseMetaData(connection, "", "");
String result = dbMetaData.columnTypeClause("column_name");
assertEquals(" UCASE(IF( IF(column_name='tinyint(1)','BIT',column_name) LIKE '%(%)%', CONCAT(SUBSTRING( "
+ "IF(column_name='tinyint(1)','BIT',column_name) ,1, LOCATE('(',IF(column_name='tinyint(1)','BIT',column_name) ) - 1 ), "
+ "SUBSTRING(IF(column_name='tinyint(1)','BIT',column_name) ,1+locate(')',IF(column_name='tinyint(1)','BIT',column_name) ))), "
+ "IF(column_name='tinyint(1)','BIT',column_name) ))", result);
public void testYearDataType() throws Exception {
createTable("yearTableMeta", "xx tinyint(1), yy year(2), zz bit, uu smallint");
try (Connection connection = setConnection()) {
checkResults(connection, true, true);
}

try (Connection connection = setConnection("&yearIsDateType=false&tinyInt1isBit=false")) {
checkResults(connection, false, false);
}
}

@Test
public void testColumnTypeClauseTinyInt1IsBitFalse() throws Exception {
Properties props = new Properties();
props.setProperty("tinyInt1isBit", "false");
MariaDbConnection connection = (MariaDbConnection)openNewConnection(connUri, props);
MariaDbDatabaseMetaData dbMetaData = new MariaDbDatabaseMetaData(connection, "", "");
String result = dbMetaData.columnTypeClause("column_name");
assertEquals(" UCASE(IF( column_name LIKE '%(%)%', CONCAT(SUBSTRING( column_name,1, LOCATE('(',column_name) - 1 ), "
+ "SUBSTRING(column_name,1+locate(')',column_name))), column_name))", result);
private void checkResults(Connection connection, boolean yearAsDate, boolean tinyAsBit) throws SQLException {
DatabaseMetaData meta = connection.getMetaData();
ResultSet rs = meta.getColumns(null, null, "yearTableMeta", null);
assertTrue(rs.next());
assertEquals(tinyAsBit ? "BIT" : "TINYINT", rs.getString(6));
assertTrue(rs.next());
assertEquals(yearAsDate ? "YEAR" : "SMALLINT" , rs.getString(6));
assertEquals(yearAsDate ? null : "5" , rs.getString(7)); // column size
assertEquals(yearAsDate ? null : "0", rs.getString(9)); // decimal digit

}

}

0 comments on commit cb7b705

Please sign in to comment.