package net.sourceforge.mayfly.acceptance.expression; import net.sourceforge.mayfly.EndToEndTests; import net.sourceforge.mayfly.acceptance.SqlTestCase; import org.apache.commons.io.IOUtils; import java.io.Reader; import java.io.StringReader; import java.sql.PreparedStatement; import java.sql.ResultSet; public class StringTest extends SqlTestCase { public void testStrings() throws Exception { execute("create table foo (color varchar(80), size varchar(80))"); execute("insert into foo (color, size) values ('red', 'medium')"); { ResultSet results = query("select size, color from foo"); assertTrue(results.next()); assertEquals("medium", results.getString(1)); assertEquals("red", results.getString("color")); assertFalse(results.next()); results.close(); } { ResultSet results = query("select size, color from foo"); assertTrue(results.next()); assertEquals("medium", results.getObject(1)); assertEquals("red", results.getObject("color")); assertFalse(results.next()); results.close(); } } public void testAsciiPunctuation() throws Exception { execute("create table foo (value varchar(255))"); execute("insert into foo (value) values (' !\"#$%&''()*+,-./:;<=>?@[]^_`{|}~')"); ResultSet results = query("select value from foo where value = ' !\"#$%&''()*+,-./:;<=>?@[]^_`{|}~'"); assertTrue(results.next()); assertEquals(" !\"#$%&'()*+,-./:;<=>?@[]^_`{|}~", results.getString(1)); assertFalse(results.next()); } public void testBackSlash() throws Exception { execute("create table foo (value varchar(255))"); String insertSql = "insert into foo (value) values ('\\')"; String selectSql = "select value from foo where value = '\\'"; if (dialect.backslashInAStringIsAnEscape()) { expectExecuteFailure(insertSql, "unterminated string literal"); expectExecuteFailure(selectSql, "unterminated string literal"); } else { execute(insertSql); ResultSet results = query(selectSql); assertTrue(results.next()); assertEquals("\\", results.getString(1)); assertFalse(results.next()); } } public void testTrailingSpaces() throws Exception { execute("create table foo(a varchar(4000))"); execute("insert into foo(a) values('hi ')"); execute("insert into foo(a) values('a')"); assertResultSet( new String[] { " 'hi ' ", " 'a' " }, query("select a from foo")); String equals = "select a from foo where a = 'hi'"; if (dialect.trailingSpacesConsultedInComparisons()) { assertResultSet(new String[] {}, query(equals)); } else { assertResultSet(new String[] { " 'hi ' " }, query(equals)); } String greater = "select a from foo where a > 'hi'"; if (dialect.trailingSpacesConsultedInComparisons()) { assertResultSet(new String[] { " 'hi ' " }, query(greater)); } else { assertResultSet(new String[] {}, query(greater)); } assertResultSet( new String[] { " 'a' " }, query("select a from foo where a < 'hi'")); } public void testInternalAndLeadingSpaces() throws Exception { execute("create table foo(a varchar(255))"); execute("insert into foo(a) values(' a')"); execute("insert into foo(a) values('a b')"); assertResultSet(new String[] { "' a'", "'a b'" }, query("select a from foo")); assertResultSet(new String[] { "' a'" }, query("select a from foo where a = ' a'")); assertResultSet(new String[] { }, query("select a from foo where a = 'a'")); assertResultSet(new String[] { }, query("select a from foo where a = ' a'")); assertResultSet(new String[] { }, query("select a from foo where a = 'a b'")); assertResultSet(new String[] { "'a b'" }, query("select a from foo where a = 'a b'")); } /** * @internal * Also see {@link EndToEndTests#testCharacterStream()} * which checks a few more cases. */ public void testCharacterStream() throws Exception { execute("create table foo (x varchar(255))"); PreparedStatement insert = connection.prepareStatement("insert into foo(x) values(?)"); String data = "value"; // Derby requires that the correct length be passed in. That is bogus, // because there is no way to get that length when reading from, say, a // UTF-8 file, short of reading the whole file. MySQL, Postgres and Hypersonic // do fine with a length of "1000". insert.setCharacterStream(1, new StringReader(data), data.length()); assertEquals(1, insert.executeUpdate()); insert.close(); ResultSet results = query("select x from foo"); assertTrue(results.next()); Reader stream = results.getCharacterStream(1); String contents = IOUtils.toString(stream); assertEquals("value", contents); stream.close(); // Check JDBC documentation: should I close it? assertFalse(results.next()); results.close(); } }