From 757eb2d7437f142f60f70f7f7e49dbef2c00a6a8 Mon Sep 17 00:00:00 2001 From: mce Date: Wed, 18 Jan 2017 15:22:55 +0100 Subject: [PATCH] CONJ-412: tinyInt1isBit is not applied in method columnTypeClause --- mariadb-java-client.iml | 4 +- .../mariadb/jdbc/MariaDbDatabaseMetaData.java | 14 ++++--- .../jdbc/MariaDbDatabaseMetaDataTest.java | 41 +++++++++++++++++++ 3 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 src/test/java/org/mariadb/jdbc/MariaDbDatabaseMetaDataTest.java diff --git a/mariadb-java-client.iml b/mariadb-java-client.iml index e58d6033e..8061e129b 100644 --- a/mariadb-java-client.iml +++ b/mariadb-java-client.iml @@ -1,5 +1,5 @@ - + @@ -20,7 +20,7 @@ - + diff --git a/src/main/java/org/mariadb/jdbc/MariaDbDatabaseMetaData.java b/src/main/java/org/mariadb/jdbc/MariaDbDatabaseMetaData.java index c815a83a7..81f229fc8 100644 --- a/src/main/java/org/mariadb/jdbc/MariaDbDatabaseMetaData.java +++ b/src/main/java/org/mariadb/jdbc/MariaDbDatabaseMetaData.java @@ -86,12 +86,16 @@ public MariaDbDatabaseMetaData(Connection connection, String user, String url) { } /* Remove length from column type spec,convert to uppercase, e.g bigint(10) unsigned becomes BIGINT UNSIGNED */ - static String columnTypeClause(String columnName) { + 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 + "))"; + } - return - " UCASE(IF( " + columnName + " LIKE '%(%)%', CONCAT(SUBSTRING( " + columnName + ",1, LOCATE('('," - + columnName + ") - 1 ), SUBSTRING(" + columnName + ",1+locate(')'," + columnName + "))), " - + columnName + "))"; + private String parseColumnName(String columnName) { + return (((connection.getProtocol().getDataTypeMappingFlags() & MariaSelectResultSet.TINYINT1_IS_BIT) == 0) + ? columnName : "IF(" + columnName + "='tinyint(1)','BIT'," + columnName + ") "); } /** diff --git a/src/test/java/org/mariadb/jdbc/MariaDbDatabaseMetaDataTest.java b/src/test/java/org/mariadb/jdbc/MariaDbDatabaseMetaDataTest.java new file mode 100644 index 000000000..80ca8806f --- /dev/null +++ b/src/test/java/org/mariadb/jdbc/MariaDbDatabaseMetaDataTest.java @@ -0,0 +1,41 @@ +package org.mariadb.jdbc; + +import com.fasterxml.jackson.databind.deser.Deserializers; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.sql.*; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + +import static org.junit.Assert.*; + + + +public class MariaDbDatabaseMetaDataTest extends BaseTest { + + + @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); + } + + @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); + } + +} \ No newline at end of file