/* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. The MySQL Connector/J is licensed under the terms of the GPLv2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most MySQL Connectors. There are special exceptions to the terms and conditions of the GPLv2 as it is applied to this software, see the FLOSS License Exception <http://www.mysql.com/about/legal/licensing/foss-exception.html>. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package testsuite.simple; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; import testsuite.BaseTestCase; import com.mysql.jdbc.CharsetMapping; import com.mysql.jdbc.ConnectionImpl; public class ResultSetTest extends BaseTestCase { public ResultSetTest(String name) { super(name); } /** * Runs all test cases in this test suite * * @param args */ public static void main(String[] args) { junit.textui.TestRunner.run(ResultSetTest.class); } public void testPadding() throws Exception { if (!versionMeetsMinimum(4, 1, 0)) { return; } Connection paddedConn = null; int numChars = 32; // build map of charsets supported by server Connection c = getConnectionWithProps("detectCustomCollations=true"); Map<String, Integer> charsetsMap = new HashMap<String, Integer>(); Iterator<Integer> collationIndexes = ((ConnectionImpl)c).indexToJavaCharset.keySet().iterator(); while (collationIndexes.hasNext()) { Integer index = collationIndexes.next(); String charsetName = null; if (((ConnectionImpl)c).indexToCustomMysqlCharset != null) { charsetName = ((ConnectionImpl)c).indexToCustomMysqlCharset.get(index); } if (charsetName == null) charsetName = CharsetMapping.STATIC_INDEX_TO_MYSQL_CHARSET_MAP.get(index); if (charsetName != null) charsetsMap.put(charsetName, index); } c.close(); Iterator<String> charsetNames = charsetsMap.keySet().iterator(); StringBuffer columns = new StringBuffer(); StringBuffer emptyBuf = new StringBuffer(); StringBuffer abcBuf = new StringBuffer(); StringBuffer repeatBuf = new StringBuffer(); StringBuffer selectBuf = new StringBuffer(); int counter = 0; while (charsetNames.hasNext()) { String charsetName = charsetNames.next(); if (charsetName.equalsIgnoreCase("LATIN7") || charsetName.equalsIgnoreCase("BINARY")) { continue; // no mapping in Java } try { "".getBytes(charsetName); } catch (UnsupportedEncodingException uee) { continue; // not supported on this platform } if (counter != 0) { columns.append(","); emptyBuf.append(","); abcBuf.append(","); repeatBuf.append(","); selectBuf.append(","); } emptyBuf.append("''"); abcBuf.append("'abc'"); repeatBuf.append("REPEAT('b', " + numChars + ")"); columns.append("field_"); columns.append(charsetName); columns.append(" CHAR("); columns.append(numChars); columns.append(") CHARACTER SET "); columns.append(charsetName); selectBuf.append("field_"); selectBuf.append(charsetName); counter++; } createTable("testPadding", "(" + columns.toString() + ", ord INT)"); this.stmt.executeUpdate("INSERT INTO testPadding VALUES (" + emptyBuf.toString() + ", 1), (" + abcBuf.toString() + ", 2), (" + repeatBuf.toString() + ", 3)"); try { Properties props = new Properties(); props.setProperty("padCharsWithSpace", "true"); paddedConn = getConnectionWithProps(props); testPaddingForConnection(paddedConn, numChars, selectBuf); props.setProperty("useDynamicCharsetInfo", "true"); paddedConn = getConnectionWithProps(props); testPaddingForConnection(paddedConn, numChars, selectBuf); } finally { if (paddedConn != null) { paddedConn.close(); } } } private void testPaddingForConnection(Connection paddedConn, int numChars, StringBuffer selectBuf) throws SQLException { String query = "SELECT " + selectBuf.toString() + " FROM testPadding ORDER by ord"; this.rs = paddedConn.createStatement().executeQuery(query); int numCols = this.rs.getMetaData().getColumnCount(); while (this.rs.next()) { for (int i = 0; i < numCols; i++) { assertEquals("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()).getColumnCharacterSet(i + 1), numChars, this.rs.getString(i + 1).length()); } } this.rs = ((com.mysql.jdbc.Connection) paddedConn) .clientPrepareStatement(query).executeQuery(); while (this.rs.next()) { for (int i = 0; i < numCols; i++) { assertEquals("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()).getColumnCharacterSet(i + 1), numChars, this.rs.getString(i + 1).length()); } } if (versionMeetsMinimum(4, 1)) { this.rs = ((com.mysql.jdbc.Connection) paddedConn).serverPrepareStatement( query).executeQuery(); while (this.rs.next()) { for (int i = 0; i < numCols; i++) { assertEquals("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()) .getColumnCharacterSet(i + 1), numChars, this.rs.getString(i + 1).length()); } } } this.rs = this.stmt.executeQuery(query); while (this.rs.next()) { for (int i = 0; i < numCols; i++) { if (this.rs.getRow() != 3) { assertTrue("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()) .getColumnCharacterSet(i + 1), numChars != this.rs.getString(i + 1).length()); } else { assertEquals("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()) .getColumnCharacterSet(i + 1), numChars, this.rs.getString(i + 1).length()); } } } this.rs = ((com.mysql.jdbc.Connection) this.conn) .clientPrepareStatement(query).executeQuery(); while (this.rs.next()) { for (int i = 0; i < numCols; i++) { if (this.rs.getRow() != 3) { assertTrue("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()) .getColumnCharacterSet(i + 1), numChars != this.rs.getString(i + 1).length()); } else { assertEquals("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()) .getColumnCharacterSet(i + 1), numChars, this.rs.getString(i + 1).length()); } } } if (versionMeetsMinimum(4, 1)) { this.rs = ((com.mysql.jdbc.Connection) this.conn).serverPrepareStatement( query).executeQuery(); while (this.rs.next()) { for (int i = 0; i < numCols; i++) { if (this.rs.getRow() != 3) { assertTrue("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()) .getColumnCharacterSet(i + 1), numChars != this.rs.getString(i + 1).length()); } else { assertEquals("For column '" + this.rs.getMetaData().getColumnName(i + 1) + "' of collation " + ((com.mysql.jdbc.ResultSetMetaData) this.rs .getMetaData()) .getColumnCharacterSet(i + 1), numChars, this.rs.getString(i + 1).length()); } } } } } }