From: Date: April 3 2006 8:22pm Subject: Connector/J commit: r5124 - in branches: branch_3_1/connector-j branch_3_1/connector-j/src/com/mysql/jdbc branch_3_1/connector-j/src/testsuite/regression branch_5_0/connector-j branch_5_0/connector-j/src/com/mysql/jdbc branch_5_0/connector-j/src/testsuite/regression branch_5_1/connector-j branch_5_1/connector-j/src/com/mysql/jdbc branch_5_1/connector-j/src/testsuite/regression List-Archive: http://lists.mysql.com/commits/4421 X-Bug: 18554 Message-Id: <200604031822.k33IMCdo016716@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/branch_3_1/connector-j/CHANGES branches/branch_3_1/connector-j/src/com/mysql/jdbc/MysqlIO.java branches/branch_3_1/connector-j/src/testsuite/regression/MetaDataRegressionTest.java branches/branch_5_0/connector-j/CHANGES branches/branch_5_0/connector-j/src/com/mysql/jdbc/MysqlIO.java branches/branch_5_0/connector-j/src/testsuite/regression/MetaDataRegressionTest.java branches/branch_5_1/connector-j/CHANGES branches/branch_5_1/connector-j/src/com/mysql/jdbc/MysqlIO.java branches/branch_5_1/connector-j/src/testsuite/regression/MetaDataRegressionTest.java Log: Fixed BUG#18554 - Aliased column names where length of name > 251 are corrupted. Modified: branches/branch_3_1/connector-j/CHANGES =================================================================== --- branches/branch_3_1/connector-j/CHANGES 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_3_1/connector-j/CHANGES 2006-04-03 18:22:07 UTC (rev 5124) @@ -81,7 +81,15 @@ - Fixed BUG#18740 - Data truncation and getWarnings() only returns last warning in set. - + + - Improved performance of retrieving BigDecimal, Time, Timestamp and Date + values from server-side prepared statements by creating fewer short-lived + instances of Strings when the native type is not an exact match for + the requested type. + + - Fixed BUG#18554 - Aliased column names where length of name > 251 + are corrupted. + 11-30-05 - Version 3.1.12 - Fixed client-side prepared statement bug with embedded ? inside Modified: branches/branch_3_1/connector-j/src/com/mysql/jdbc/MysqlIO.java =================================================================== --- branches/branch_3_1/connector-j/src/com/mysql/jdbc/MysqlIO.java 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_3_1/connector-j/src/com/mysql/jdbc/MysqlIO.java 2006-04-03 18:22:07 UTC (rev 5124) @@ -582,25 +582,32 @@ // Not used yet, 5.0? int catalogNameStart = packet.getPosition() + 1; int catalogNameLength = packet.fastSkipLenString(); + catalogNameStart = adjustStartForFieldLength(catalogNameStart, catalogNameLength); } int databaseNameStart = packet.getPosition() + 1; int databaseNameLength = packet.fastSkipLenString(); + databaseNameStart = adjustStartForFieldLength(databaseNameStart, databaseNameLength); int tableNameStart = packet.getPosition() + 1; int tableNameLength = packet.fastSkipLenString(); - + tableNameStart = adjustStartForFieldLength(tableNameStart, tableNameLength); + // orgTableName is never used so skip int originalTableNameStart = packet.getPosition() + 1; int originalTableNameLength = packet.fastSkipLenString(); + originalTableNameStart = adjustStartForFieldLength(originalTableNameStart, originalTableNameLength); // we only store the position again... int nameStart = packet.getPosition() + 1; int nameLength = packet.fastSkipLenString(); + + nameStart = adjustStartForFieldLength(nameStart, nameLength); // orgColName is not required so skip... int originalColumnNameStart = packet.getPosition() + 1; int originalColumnNameLength = packet.fastSkipLenString(); + originalColumnNameStart = adjustStartForFieldLength(originalColumnNameStart, originalColumnNameLength); packet.readByte(); @@ -647,8 +654,12 @@ int tableNameStart = packet.getPosition() + 1; int tableNameLength = packet.fastSkipLenString(); + tableNameStart = adjustStartForFieldLength(tableNameStart, tableNameLength); + int nameStart = packet.getPosition() + 1; int nameLength = packet.fastSkipLenString(); + nameStart = adjustStartForFieldLength(nameStart, nameLength); + int colLength = packet.readnBytes(); int colType = packet.readnBytes(); packet.readByte(); // We know it's currently 2 @@ -674,7 +685,23 @@ return field; } - protected boolean isSetNeededForAutoCommitMode(boolean autoCommitFlag) { + private int adjustStartForFieldLength(int nameStart, int nameLength) { + if (nameLength < 251) { + return nameStart; + } + + if (nameLength >= 251 && nameLength < 65536) { + return nameStart + 2; + } + + if (nameLength >= 65536 && nameLength < 16777216) { + return nameStart + 3; + } + + return nameStart + 8; + } + + protected boolean isSetNeededForAutoCommitMode(boolean autoCommitFlag) { if (this.use41Extensions && this.connection.getElideSetAutoCommits()) { boolean autoCommitModeOnServer = ((this.serverStatus & SERVER_STATUS_AUTOCOMMIT) != 0); Modified: branches/branch_3_1/connector-j/src/testsuite/regression/MetaDataRegressionTest.java =================================================================== --- branches/branch_3_1/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_3_1/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-04-03 18:22:07 UTC (rev 5124) @@ -1438,6 +1438,39 @@ } } + + /** + * Tests fix for BUG#18554 - Aliased column names where + * length of name > 251 are corrupted. + * + * @throws Exception if the test fails. + */ + public void testBug18554() throws Exception { + testBug18554(249); + testBug18554(250); + testBug18554(251); + testBug18554(252); + testBug18554(253); + testBug18554(254); + testBug18554(255); + } + + private void testBug18554(int columnNameLength) throws Exception { + StringBuffer buf = new StringBuffer(columnNameLength + 2); + + for (int i = 0; i < columnNameLength; i++) { + buf.append((char)((Math.random() * 26) + 65)); + } + + + String colName = buf.toString(); + this.rs = this.stmt.executeQuery("select curtime() as `" + colName + "`"); + ResultSetMetaData meta = this.rs.getMetaData(); + + assertEquals(colName, meta.getColumnName(1)); + + } + private void checkRsmdForBug13277(ResultSetMetaData rsmd) throws SQLException { assertEquals(17, rsmd.getColumnDisplaySize(1)); Modified: branches/branch_5_0/connector-j/CHANGES =================================================================== --- branches/branch_5_0/connector-j/CHANGES 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_5_0/connector-j/CHANGES 2006-04-03 18:22:07 UTC (rev 5124) @@ -184,6 +184,14 @@ - Fixed BUG#18740 - Data truncation and getWarnings() only returns last warning in set. + + - Improved performance of retrieving BigDecimal, Time, Timestamp and Date + values from server-side prepared statements by creating fewer short-lived + instances of Strings when the native type is not an exact match for + the requested type. + + - Fixed BUG#18554 - Aliased column names where length of name > 251 + are corrupted. 11-30-05 - Version 3.1.12 Modified: branches/branch_5_0/connector-j/src/com/mysql/jdbc/MysqlIO.java =================================================================== --- branches/branch_5_0/connector-j/src/com/mysql/jdbc/MysqlIO.java 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_5_0/connector-j/src/com/mysql/jdbc/MysqlIO.java 2006-04-03 18:22:07 UTC (rev 5124) @@ -597,25 +597,32 @@ // Not used yet, 5.0? int catalogNameStart = packet.getPosition() + 1; int catalogNameLength = packet.fastSkipLenString(); + catalogNameStart = adjustStartForFieldLength(catalogNameStart, catalogNameLength); } int databaseNameStart = packet.getPosition() + 1; int databaseNameLength = packet.fastSkipLenString(); + databaseNameStart = adjustStartForFieldLength(databaseNameStart, databaseNameLength); int tableNameStart = packet.getPosition() + 1; int tableNameLength = packet.fastSkipLenString(); - + tableNameStart = adjustStartForFieldLength(tableNameStart, tableNameLength); + // orgTableName is never used so skip int originalTableNameStart = packet.getPosition() + 1; int originalTableNameLength = packet.fastSkipLenString(); + originalTableNameStart = adjustStartForFieldLength(originalTableNameStart, originalTableNameLength); // we only store the position again... int nameStart = packet.getPosition() + 1; int nameLength = packet.fastSkipLenString(); + + nameStart = adjustStartForFieldLength(nameStart, nameLength); // orgColName is not required so skip... int originalColumnNameStart = packet.getPosition() + 1; int originalColumnNameLength = packet.fastSkipLenString(); + originalColumnNameStart = adjustStartForFieldLength(originalColumnNameStart, originalColumnNameLength); packet.readByte(); @@ -662,8 +669,12 @@ int tableNameStart = packet.getPosition() + 1; int tableNameLength = packet.fastSkipLenString(); + tableNameStart = adjustStartForFieldLength(tableNameStart, tableNameLength); + int nameStart = packet.getPosition() + 1; int nameLength = packet.fastSkipLenString(); + nameStart = adjustStartForFieldLength(nameStart, nameLength); + int colLength = packet.readnBytes(); int colType = packet.readnBytes(); packet.readByte(); // We know it's currently 2 @@ -689,6 +700,22 @@ return field; } + private int adjustStartForFieldLength(int nameStart, int nameLength) { + if (nameLength < 251) { + return nameStart; + } + + if (nameLength >= 251 && nameLength < 65536) { + return nameStart + 2; + } + + if (nameLength >= 65536 && nameLength < 16777216) { + return nameStart + 3; + } + + return nameStart + 8; + } + protected boolean isSetNeededForAutoCommitMode(boolean autoCommitFlag) { if (this.use41Extensions && this.connection.getElideSetAutoCommits()) { boolean autoCommitModeOnServer = ((this.serverStatus & Modified: branches/branch_5_0/connector-j/src/testsuite/regression/MetaDataRegressionTest.java =================================================================== --- branches/branch_5_0/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_5_0/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-04-03 18:22:07 UTC (rev 5124) @@ -1471,4 +1471,36 @@ } } + + /** + * Tests fix for BUG#18554 - Aliased column names where + * length of name > 251 are corrupted. + * + * @throws Exception if the test fails. + */ + public void testBug18554() throws Exception { + testBug18554(249); + testBug18554(250); + testBug18554(251); + testBug18554(252); + testBug18554(253); + testBug18554(254); + testBug18554(255); + } + + private void testBug18554(int columnNameLength) throws Exception { + StringBuffer buf = new StringBuffer(columnNameLength + 2); + + for (int i = 0; i < columnNameLength; i++) { + buf.append((char)((Math.random() * 26) + 65)); + } + + + String colName = buf.toString(); + this.rs = this.stmt.executeQuery("select curtime() as `" + colName + "`"); + ResultSetMetaData meta = this.rs.getMetaData(); + + assertEquals(colName, meta.getColumnName(1)); + + } } Modified: branches/branch_5_1/connector-j/CHANGES =================================================================== --- branches/branch_5_1/connector-j/CHANGES 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_5_1/connector-j/CHANGES 2006-04-03 18:22:07 UTC (rev 5124) @@ -186,7 +186,15 @@ - Fixed BUG#18740 - Data truncation and getWarnings() only returns last warning in set. + + - Improved performance of retrieving BigDecimal, Time, Timestamp and Date + values from server-side prepared statements by creating fewer short-lived + instances of Strings when the native type is not an exact match for + the requested type. + - Fixed BUG#18554 - Aliased column names where length of name > 251 + are corrupted. + 11-30-05 - Version 3.1.12 - Fixed client-side prepared statement bug with embedded ? inside Modified: branches/branch_5_1/connector-j/src/com/mysql/jdbc/MysqlIO.java =================================================================== --- branches/branch_5_1/connector-j/src/com/mysql/jdbc/MysqlIO.java 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_5_1/connector-j/src/com/mysql/jdbc/MysqlIO.java 2006-04-03 18:22:07 UTC (rev 5124) @@ -3373,7 +3373,7 @@ return unpackedRowData; } - /** + /** * Unpacks the Field information from the given packet. Understands pre 4.1 * and post 4.1 server version field packet structures. * @@ -3393,25 +3393,32 @@ // Not used yet, 5.0? int catalogNameStart = packet.getPosition() + 1; int catalogNameLength = packet.fastSkipLenString(); + catalogNameStart = adjustStartForFieldLength(catalogNameStart, catalogNameLength); } int databaseNameStart = packet.getPosition() + 1; int databaseNameLength = packet.fastSkipLenString(); + databaseNameStart = adjustStartForFieldLength(databaseNameStart, databaseNameLength); int tableNameStart = packet.getPosition() + 1; int tableNameLength = packet.fastSkipLenString(); - + tableNameStart = adjustStartForFieldLength(tableNameStart, tableNameLength); + // orgTableName is never used so skip int originalTableNameStart = packet.getPosition() + 1; int originalTableNameLength = packet.fastSkipLenString(); + originalTableNameStart = adjustStartForFieldLength(originalTableNameStart, originalTableNameLength); // we only store the position again... int nameStart = packet.getPosition() + 1; int nameLength = packet.fastSkipLenString(); + + nameStart = adjustStartForFieldLength(nameStart, nameLength); // orgColName is not required so skip... int originalColumnNameStart = packet.getPosition() + 1; int originalColumnNameLength = packet.fastSkipLenString(); + originalColumnNameStart = adjustStartForFieldLength(originalColumnNameStart, originalColumnNameLength); packet.readByte(); @@ -3458,8 +3465,12 @@ int tableNameStart = packet.getPosition() + 1; int tableNameLength = packet.fastSkipLenString(); + tableNameStart = adjustStartForFieldLength(tableNameStart, tableNameLength); + int nameStart = packet.getPosition() + 1; int nameLength = packet.fastSkipLenString(); + nameStart = adjustStartForFieldLength(nameStart, nameLength); + int colLength = packet.readnBytes(); int colType = packet.readnBytes(); packet.readByte(); // We know it's currently 2 @@ -3485,6 +3496,22 @@ return field; } + private int adjustStartForFieldLength(int nameStart, int nameLength) { + if (nameLength < 251) { + return nameStart; + } + + if (nameLength >= 251 && nameLength < 65536) { + return nameStart + 2; + } + + if (nameLength >= 65536 && nameLength < 16777216) { + return nameStart + 3; + } + + return nameStart + 8; + } + private final void unpackNativeEncodedColumn(Buffer binaryData, Field[] fields, int columnIndex, Object[] unpackedRowData) throws SQLException { Modified: branches/branch_5_1/connector-j/src/testsuite/regression/MetaDataRegressionTest.java =================================================================== --- branches/branch_5_1/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-04-03 17:44:51 UTC (rev 5123) +++ branches/branch_5_1/connector-j/src/testsuite/regression/MetaDataRegressionTest.java 2006-04-03 18:22:07 UTC (rev 5124) @@ -1471,4 +1471,36 @@ } } + + /** + * Tests fix for BUG#18554 - Aliased column names where + * length of name > 251 are corrupted. + * + * @throws Exception if the test fails. + */ + public void testBug18554() throws Exception { + testBug18554(249); + testBug18554(250); + testBug18554(251); + testBug18554(252); + testBug18554(253); + testBug18554(254); + testBug18554(255); + } + + private void testBug18554(int columnNameLength) throws Exception { + StringBuffer buf = new StringBuffer(columnNameLength + 2); + + for (int i = 0; i < columnNameLength; i++) { + buf.append((char)((Math.random() * 26) + 65)); + } + + + String colName = buf.toString(); + this.rs = this.stmt.executeQuery("select curtime() as `" + colName + "`"); + ResultSetMetaData meta = this.rs.getMetaData(); + + assertEquals(colName, meta.getColumnName(1)); + + } }