From: mmatthews Date: October 5 2006 4:45pm Subject: Connector/J commit: r5827 - branches/branch_5_0/connector-j branches/branch_5_0/connector-j/src/com/mysql/jdbc branches/branch_5_0/connector-j/src/testsuite/regression trunk/connector-j trunk/connector-j/src/com/mysql/jdbc trunk/connector-j/src/testsuite/regression List-Archive: http://lists.mysql.com/commits/13127 X-Bug: 22613 Message-Id: <200610051645.k95GjTP7030976@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/branch_5_0/connector-j/CHANGES branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java branches/branch_5_0/connector-j/src/testsuite/regression/MetaDataRegressionTest.java trunk/connector-j/CHANGES trunk/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java trunk/connector-j/src/testsuite/regression/MetaDataRegressionTest.java Log: Fixed BUG#22613 - DBMD.getColumns() does not return expected COLUMN_SIZE for the SET type, now returns length of largest possible set disregarding whitespace or the "," delimitters to be consistent with the ODBC driver. Modified: branches/branch_5_0/connector-j/CHANGES =================================================================== --- branches/branch_5_0/connector-j/CHANGES 2006-10-05 16:13:49 UTC (rev 5826) +++ branches/branch_5_0/connector-j/CHANGES 2006-10-05 16:45:25 UTC (rev 5827) @@ -41,6 +41,11 @@ it shouldn't (due to sending big decimal incorrectly to server with server-side prepared statement). + - Fixed BUG#22613 - DBMD.getColumns() does not return expected + COLUMN_SIZE for the SET type, now returns length of largest possible + set disregarding whitespace or the "," delimitters to be consistent + with the ODBC driver. + 07-26-06 - Version 5.0.3 - Fixed BUG#20650 - Statement.cancel() causes NullPointerException Modified: branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java =================================================================== --- branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java 2006-10-05 16:13:49 UTC (rev 5826) +++ branches/branch_5_0/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java 2006-10-05 16:45:25 UTC (rev 5827) @@ -220,8 +220,7 @@ // Figure Out the Size if (typeInfo != null) { - if (StringUtils.startsWithIgnoreCase(typeInfo, "enum") - || StringUtils.startsWithIgnoreCase(typeInfo, "set")) { + if (StringUtils.startsWithIgnoreCase(typeInfo, "enum")) { String temp = typeInfo.substring(typeInfo.indexOf("("), typeInfo.lastIndexOf(")")); java.util.StringTokenizer tokenizer = new java.util.StringTokenizer( @@ -235,6 +234,25 @@ this.columnSize = maxLength; this.decimalDigits = 0; + } else if (StringUtils.startsWithIgnoreCase(typeInfo, "set")) { + String temp = typeInfo.substring(typeInfo.indexOf("("), + typeInfo.lastIndexOf(")")); + java.util.StringTokenizer tokenizer = new java.util.StringTokenizer( + temp, ","); + int maxLength = 0; + + while (tokenizer.hasMoreTokens()) { + String setMember = tokenizer.nextToken().trim(); + + if (setMember.startsWith("'") && setMember.endsWith("'")) { + maxLength += setMember.length() - 2; + } else { + maxLength += setMember.length(); + } + } + + this.columnSize = maxLength; + this.decimalDigits = 0; } else if (typeInfo.indexOf(",") != -1) { // Numeric with decimals this.columnSize = Integer.parseInt(typeInfo.substring( Modified: branches/branch_5_0/connector-j/src/testsuite/regression/MetaDataRegressionTest.java =================================================================== --- branches/branch_5_0/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-10-05 16:13:49 UTC (rev 5826) +++ branches/branch_5_0/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-10-05 16:45:25 UTC (rev 5827) @@ -1583,6 +1583,60 @@ } } + /** + * Tests fix for BUG#22613 - DBMD.getColumns() does not return expected + * COLUMN_SIZE for the SET type (fixed to be consistent with the ODBC driver) + * + * @throws Exception if the test fails + */ + public void testBug22613() throws Exception { + + createTable("bug22613", "( s set('a','bc','def','ghij') default NULL, t enum('a', 'ab', 'cdef'))"); + + try { + checkMetadataForBug22613(this.conn); + + if (versionMeetsMinimum(5, 0)) { + Connection infoSchemConn = null; + + try { + Properties props = new Properties(); + props.setProperty("useInformationSchema", "true"); + + infoSchemConn = getConnectionWithProps(props); + + checkMetadataForBug22613(infoSchemConn); + } finally { + if (infoSchemConn != null) { + infoSchemConn.close(); + } + } + } + } finally { + closeMemberJDBCResources(); + } + } + + private void checkMetadataForBug22613(Connection c) throws Exception { + String maxValue = "a,bc,def,ghij"; + + try { + DatabaseMetaData meta = c.getMetaData(); + this.rs = meta.getColumns(null, this.conn.getCatalog(), "bug22613", "s"); + this.rs.first(); + + assertEquals(maxValue.length(), rs.getInt("COLUMN_SIZE")); + + this.rs = meta.getColumns(null, c.getCatalog(), "bug22613", "t"); + this.rs.first(); + + assertEquals(4, rs.getInt("COLUMN_SIZE")); + } finally { + closeMemberJDBCResources(); + } + } + + private void testAbsenceOfMetadataForQuery(String query) throws Exception { try { this.pstmt = this.conn.prepareStatement(query); Modified: trunk/connector-j/CHANGES =================================================================== --- trunk/connector-j/CHANGES 2006-10-05 16:13:49 UTC (rev 5826) +++ trunk/connector-j/CHANGES 2006-10-05 16:45:25 UTC (rev 5827) @@ -40,6 +40,11 @@ - Fixed BUG#22290 - Driver issues truncation on write exception when it shouldn't (due to sending big decimal incorrectly to server with server-side prepared statement). + + - Fixed BUG#22613 - DBMD.getColumns() does not return expected + COLUMN_SIZE for the SET type, now returns length of largest possible + set disregarding whitespace or the "," delimitters to be consistent + with the ODBC driver. 07-26-06 - Version 5.0.3 Modified: trunk/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java =================================================================== --- trunk/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java 2006-10-05 16:13:49 UTC (rev 5826) +++ trunk/connector-j/src/com/mysql/jdbc/DatabaseMetaData.java 2006-10-05 16:45:25 UTC (rev 5827) @@ -223,8 +223,7 @@ // Figure Out the Size if (typeInfo != null) { - if (StringUtils.startsWithIgnoreCase(typeInfo, "enum") - || StringUtils.startsWithIgnoreCase(typeInfo, "set")) { + if (StringUtils.startsWithIgnoreCase(typeInfo, "enum")) { String temp = typeInfo.substring(typeInfo.indexOf("("), typeInfo.lastIndexOf(")")); java.util.StringTokenizer tokenizer = new java.util.StringTokenizer( @@ -238,6 +237,25 @@ this.columnSize = maxLength; this.decimalDigits = 0; + } else if (StringUtils.startsWithIgnoreCase(typeInfo, "set")) { + String temp = typeInfo.substring(typeInfo.indexOf("("), + typeInfo.lastIndexOf(")")); + java.util.StringTokenizer tokenizer = new java.util.StringTokenizer( + temp, ","); + int maxLength = 0; + + while (tokenizer.hasMoreTokens()) { + String setMember = tokenizer.nextToken().trim(); + + if (setMember.startsWith("'") && setMember.endsWith("'")) { + maxLength += setMember.length() - 2; + } else { + maxLength += setMember.length(); + } + } + + this.columnSize = maxLength; + this.decimalDigits = 0; } else if (typeInfo.indexOf(",") != -1) { // Numeric with decimals this.columnSize = Integer.parseInt(typeInfo.substring( Modified: trunk/connector-j/src/testsuite/regression/MetaDataRegressionTest.java =================================================================== --- trunk/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-10-05 16:13:49 UTC (rev 5826) +++ trunk/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-10-05 16:45:25 UTC (rev 5827) @@ -1612,4 +1612,57 @@ } } + /** + * Tests fix for BUG#22613 - DBMD.getColumns() does not return expected + * COLUMN_SIZE for the SET type (fixed to be consistent with the ODBC driver) + * + * @throws Exception if the test fails + */ + public void testBug22613() throws Exception { + + createTable("bug22613", "( s set('a','bc','def','ghij') default NULL, t enum('a', 'ab', 'cdef'))"); + + try { + checkMetadataForBug22613(this.conn); + + if (versionMeetsMinimum(5, 0)) { + Connection infoSchemConn = null; + + try { + Properties props = new Properties(); + props.setProperty("useInformationSchema", "true"); + + infoSchemConn = getConnectionWithProps(props); + + checkMetadataForBug22613(infoSchemConn); + } finally { + if (infoSchemConn != null) { + infoSchemConn.close(); + } + } + } + } finally { + closeMemberJDBCResources(); + } + } + + private void checkMetadataForBug22613(Connection c) throws Exception { + String maxValue = "a,bc,def,ghij"; + + try { + DatabaseMetaData meta = c.getMetaData(); + this.rs = meta.getColumns(null, this.conn.getCatalog(), "bug22613", "s"); + this.rs.first(); + + assertEquals(maxValue.length(), rs.getInt("COLUMN_SIZE")); + + this.rs = meta.getColumns(null, c.getCatalog(), "bug22613", "t"); + this.rs.first(); + + assertEquals(4, rs.getInt("COLUMN_SIZE")); + } finally { + closeMemberJDBCResources(); + } + } + }