/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.jdbc; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.stub; import java.nio.charset.Charset; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Types; import java.util.*; import org.junit.Test; import org.mockito.Mockito; import org.teiid.client.DQP; import org.teiid.client.ResultsMessage; import org.teiid.client.lob.LobChunk; import org.teiid.client.util.ResultsFuture; import org.teiid.core.TeiidProcessingException; import org.teiid.core.types.XMLType; @SuppressWarnings("nls") public class TestResultSet { private static final int BATCH_SIZE = 400; /** test next() without walking through */ @Test public void testNext1() throws SQLException { ResultSet cs = helpExecuteQuery(); assertEquals(" Actual doesn't match with expected. ", new Integer(0), new Integer(cs.getRow())); //$NON-NLS-1$ cs.close(); } /** test next() with walking through all the rows and compare records */ @Test public void testNext2() throws SQLException { List<?>[] expected = TestAllResultsImpl.exampleResults1(1000); ResultSetImpl cs = helpExecuteQuery(); int i=0; while(cs.next()) { assertEquals(" Actual doesn't match with expected. ", expected[i], cs.getCurrentRecord()); //$NON-NLS-1$ assertEquals((i < 800?BATCH_SIZE:200) - (i%BATCH_SIZE) - 1, cs.available()); i++; } cs.close(); } /** test with LargeA -- only work with real model rather than fake metadata*/ // Note for all the following: processor batch size is 100, // so some of these tests check what happens when the client // fetch size is above, the same, or below it public static final int PROC_BATCH_SIZE = 100; /** Test stability when next() is called beyond the rowcount. */ @Test public void testNextBeyondEnd_fetchEqualsCount() throws Exception { helpTestNextBeyondResultSet(1000, 1000); } /** Test stability when next() is called beyond the rowcount. */ @Test public void testNextBeyondEnd_fetchLessThanCount() throws Exception { helpTestNextBeyondResultSet(100, 1000); } /** Test stability when next() is called beyond the rowcount with one more row. */ @Test public void testNextBeyondEnd_fetchLessThanCount1() throws Exception { helpTestNextBeyondResultSet(100, 101); } /** Test stability when next() is called beyond the rowcount. */ @Test public void testNextBeyondEnd_fetchLessThanCountNonMultiple() throws Exception { helpTestNextBeyondResultSet(120, 1000); } /** Test stability when next() is called beyond the rowcount. */ @Test public void testNextBeyondEnd_fetchGreaterThanCount() throws Exception { helpTestNextBeyondResultSet(300, PROC_BATCH_SIZE); } /** Test stability when next() is called beyond the rowcount. */ @Test public void testNextBeyondEnd_fetchGreaterThanCountNonMultiple() throws Exception { helpTestNextBeyondResultSet(310, PROC_BATCH_SIZE-50); } /** Test stability when next() is called beyond the rowcount. */ @Test public void testNextBeyondEnd_fetchGreaterThanCountNonMultiple2() throws Exception { helpTestNextBeyondResultSet(300, PROC_BATCH_SIZE+10); } /** Test that the returned results walks through all results if * fetchSize < rows < proc batch size. * Test for defect 11356 */ @Test public void testNextBeyondEnd_fetchLessThanCount_ResultsBetweenFetchAndProcBatch() throws Exception { helpTestNextBeyondResultSet(30, PROC_BATCH_SIZE-25); } public void helpTestNextBeyondResultSet(int fetchSize, int numRows) throws Exception { ResultSet cs = helpExecuteQuery(fetchSize, numRows, ResultSet.TYPE_SCROLL_INSENSITIVE); try { Object lastRowValue = null; for (int rowNum = 1; rowNum <= numRows; rowNum++) { assertEquals("Should return true before end cs.next()", true, cs.next()); //$NON-NLS-1$ } lastRowValue = cs.getObject(1); // Should just return false and leave cursor where it is for(int i=numRows+1; i<numRows+4; i++) { assertEquals("Should return false when going past the end: " + i, false, cs.next()); //$NON-NLS-1$ assertEquals("Is after last should be true: " + i, true, cs.isAfterLast()); //$NON-NLS-1$ } // Should still be just after last row cs.previous(); assertEquals("Is last should be true", true, cs.isLast()); //$NON-NLS-1$ assertEquals("Not on last row", lastRowValue, cs.getObject(1)); //$NON-NLS-1$ } finally { cs.close(); } } /** test both next() and previous() -- when result set scroll in bidirection */ @Test public void testBidirection() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); assertNotNull(cs); cs.absolute(290); assertEquals(" Actual value doesn't match with expected one.", new Integer(290), cs.getCurrentRecord().get(0)); //$NON-NLS-1$ cs.next(); assertEquals(" Actual value doesn't match with expected one.", new Integer(291), cs.getCurrentRecord().get(0)); //$NON-NLS-1$ cs.next(); assertEquals(" Actual value doesn't match with expected one.", new Integer(292), cs.getCurrentRecord().get(0)); //$NON-NLS-1$ cs.previous(); assertEquals(" Actual value doesn't match with expected one.", new Integer(291), cs.getCurrentRecord().get(0)); //$NON-NLS-1$ cs.next(); assertEquals(" Actual value doesn't match with expected one.", new Integer(292), cs.getCurrentRecord().get(0)); //$NON-NLS-1$ cs.close(); } /** test hasNext() without walking through any row */ @Test public void testHasNext1() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); assertEquals(" hasNext() doesn't match expected value. ", true, cs.hasNext()); //$NON-NLS-1$ cs.close(); } /** test hasNext() with blocking for the Next batch -- triggering point */ @Test public void testHasNext2() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.absolute(100); assertEquals(" hasNext() doesn't match expected value. ", true, cs.hasNext()); //$NON-NLS-1$ cs.close(); } /** test hasNext() with nextBatch!=null -- short response */ @Test public void testHasNext3() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); int i = 0; while (cs.next()) { if (i == 289) { break; } i++; } assertEquals(" hasNext() doesn't match expected value. ", true, cs.hasNext()); //$NON-NLS-1$ cs.close(); } /** at the end of all batches */ @Test public void testHasNext4() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.absolute(1000); assertTrue(!cs.hasNext()); cs.close(); } /** walk all way through from the end back to first row */ @Test public void testPrevious1() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); List<?>[] expected = TestAllResultsImpl.exampleResults1(1000); while(cs.next()) { //System.out.println(" rs.next == " + cs.getCurrentRecord()); } // cursor is after the last row. getRow() should return 0 when not on a valid row assertEquals(" current row doesn't match expected value. ", 0, cs.getRow()); //$NON-NLS-1$ int i= 1000; while (cs.previous()) { //System.out.println(" rs.previous == " + cs.getCurrentRecord()); assertEquals(" Actual doesn't match with expected. ", expected[i-1], cs.getCurrentRecord()); //$NON-NLS-1$ i--; } assertEquals(" current row doesn't match expected value. ", 0, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** test the previous in the middle of a batch */ @Test public void testPrevious2() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.absolute(290); // cursor is at the row of 289 now assertTrue(cs.previous()); assertEquals(" current row doesn't match expected value. ", 289, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** walk all way through from the end back to first row */ @Test public void testPrevious3() throws Exception { //large batch size ResultSetImpl cs = helpExecuteQuery(600, 10000, ResultSet.TYPE_SCROLL_INSENSITIVE); List<?>[] expected = TestAllResultsImpl.exampleResults1(10000); while(cs.next()) { } // cursor is after the last row. getRow() should return 0 when not on a valid row assertEquals(" current row doesn't match expected value. ", 0, cs.getRow()); //$NON-NLS-1$ int i= 10000; while (cs.previous()) { //System.out.println(" rs.previous == " + cs.getCurrentRecord()); assertEquals(" Actual doesn't match with expected. ", expected[i-1], cs.getCurrentRecord()); //$NON-NLS-1$ i--; } assertEquals(" current row doesn't match expected value. ", 0, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** walk all way through from the end back to first row */ @Test public void testPrevious4() throws Exception { //small batch size ResultSetImpl cs = helpExecuteQuery(50, 1000, ResultSet.TYPE_SCROLL_INSENSITIVE); List<?>[] expected = TestAllResultsImpl.exampleResults1(1000); while(cs.next()) { //System.out.println(" rs.next == " + cs.getCurrentRecord()); } // cursor is after the last row. getRow() should return 0 when not on a valid row assertEquals(" current row doesn't match expected value. ", 0, cs.getRow()); //$NON-NLS-1$ int i= 1000; while (cs.previous()) { //System.out.println(" rs.previous == " + cs.getCurrentRecord()); assertEquals(" Actual doesn't match with expected. ", expected[i-1], cs.getCurrentRecord()); //$NON-NLS-1$ i--; } assertEquals(" current row doesn't match expected value. ", 0, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** test rare case that cursor change direction */ @Test public void testChangeDirection() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.absolute(291); cs.previous(); assertEquals(" current row doesn't match expected value. ", 290, cs.getRow()); //$NON-NLS-1$ cs.close(); } @Test public void testIsFirst() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.next(); assertTrue(cs.isFirst()); cs.close(); } /** test cursor is in the middle of all batches */ @Test public void testIsLast1() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.next(); assertTrue(!cs.isLast()); cs.close(); } /** test cursor at the triggering point -- blocking case*/ @Test public void testIsLast2() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); int i = 0; while (cs.next()) { if (i == 99) { break; } i++; } assertTrue(!cs.isLast()); cs.close(); } /** test cursor at the last row of all batches */ @Test public void testIsLast3() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.absolute(1000); assertTrue(cs.isLast()); cs.close(); } @Test public void testIsBeforeFirst() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); assertTrue(cs.isBeforeFirst()); cs.close(); } @Test public void testBeforeFirst() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to row 1 cs.next(); assertEquals(" Current row number doesn't match with expected one.", 1, cs.getRow()); //$NON-NLS-1$ // move back to before first row cs.beforeFirst(); assertTrue(cs.isBeforeFirst()); cs.close(); } @Test public void testFirst() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to row #2 cs.next(); cs.next(); assertEquals(" Current row number doesn't match with expected one.", 2, cs.getRow()); //$NON-NLS-1$ // move back to the 1st row cs.first(); assertEquals(" Current row number doesn't match with expected one.", 1, cs.getRow()); //$NON-NLS-1$ cs.close(); } @Test public void testAfterLast() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.afterLast(); assertTrue(cs.isAfterLast()); cs.close(); } /** right after the last row */ @Test public void testIsAfterLast1() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.absolute(1000); cs.next(); assertTrue(cs.isAfterLast()); cs.close(); } /** right before the first */ @Test public void testIsAfterLast2() throws Exception { ResultSetImpl cs = helpExecuteQuery(); assertTrue(!cs.isAfterLast()); cs.close(); } /** absolute with cursor movement backward in the same batch -- absolute(positive) */ @Test public void testAbsolute1() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to row #2 cs.next(); cs.next(); assertEquals(" Current row number doesn't match with expected one.", 2, cs.getRow()); //$NON-NLS-1$ // move back to the 1st row cs.absolute(1); assertEquals(" Current row number doesn't match with expected one.", 1, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** absolute with cursor movement forward in the same batch -- absolute(positive) */ @Test public void testAbsolute2() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to row #2 cs.next(); cs.next(); assertEquals(" Current row number doesn't match with expected one.", 2, cs.getRow()); //$NON-NLS-1$ // move back to the 1st row cs.absolute(3); assertEquals(" Current row number doesn't match with expected one.", 3, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** absolute with cursor movement forward -- absolute(positive) -- blocking */ @Test public void testAbsolute3() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to row #2 cs.next(); cs.next(); assertEquals(" Current row number doesn't match with expected one.", 2, cs.getRow()); //$NON-NLS-1$ // move to row #100 -- blocking cs.absolute(100); assertEquals(" Current row number doesn't match with expected one.", 100, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** absolute with cursor movement forward -- absolute(positive) -- triggering point */ @Test public void testAbsolute4() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to row #2 cs.next(); cs.next(); assertEquals(" Current row number doesn't match with expected one.", 2, cs.getRow()); //$NON-NLS-1$ // move to row #200 -- new batch cs.absolute(200); assertEquals(" Current row number doesn't match with expected one.", 200, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** absolute with cursor movement back in the same batch -- absolute(negative) */ @Test public void testAbsolute5() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to row #2 cs.next(); cs.next(); assertEquals(" Current row number doesn't match with expected one.", 2, cs.getRow()); //$NON-NLS-1$ // move back to the 1st row cs.absolute(-1); assertEquals(" Current row number doesn't match with expected one.", 1000, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** absolute after last row */ @Test public void testAbsolute6() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.absolute(1005); // Cursor should be after last row. getRow() should return 0 because // cursor is not on a valid row assertEquals(" Current row number doesn't match with expected one.", 0, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** relative(positive) -- forward to another batch */ @Test public void testRelative1() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to the row #3 cs.absolute(3); assertEquals(" Current row number doesn't match with expected one.", 3, cs.getRow()); //$NON-NLS-1$ // move to the row #140 cs.relative(137); assertEquals(" Current row number doesn't match with expected one.", 140, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** relative(negative) -- backward to another batch */ @Test public void testRelative2() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to the row #137 cs.absolute(137); assertEquals(" Current row number doesn't match with expected one.", 137, cs.getRow()); //$NON-NLS-1$ // move to the row #4 cs.relative(-133); assertEquals(" Current row number doesn't match with expected one.", 4, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** relative(negative) -- backward to triggering point or blocking batch */ @Test public void testRelative3() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to the row #137 cs.absolute(137); assertEquals(" Current row number doesn't match with expected one.", 137, cs.getRow()); //$NON-NLS-1$ // move to the row #100 cs.relative(-37); assertEquals(" Current row number doesn't match with expected one.", 100, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** relative(negative) -- backward to triggering point or blocking batch */ @Test public void testRelative4() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // move to the row #237 in the third batch, so that the fourth batch has been requested when we switch direction cs.absolute(237); assertEquals(" Current row number doesn't match with expected one.", 237, cs.getRow()); //$NON-NLS-1$ // move to the row #37 cs.relative(-200); assertEquals(" Current row number doesn't match with expected one.", 37, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** in the first fetched batch */ @Test public void testGetRow1() throws SQLException { ResultSet cs = helpExecuteQuery(); int i = 0; while (cs.next()) { if (i == 102) { break; } i++; } assertEquals(" Current row number doesn't match with expected one.", i+1, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** in the first batch */ @Test public void testGetRow2() throws SQLException { ResultSet cs = helpExecuteQuery(); cs.next(); assertEquals(" Current row number doesn't match with expected one.", 1, cs.getRow()); //$NON-NLS-1$ cs.close(); } /** in the triggering point -- blocking */ @Test public void testGetRow3() throws SQLException { ResultSet cs = helpExecuteQuery(); int i = 0; while (cs.next()) { if (i == 99) { break; } i++; } assertEquals(" Current row number doesn't match with expected one.", 100, cs.getRow()); //$NON-NLS-1$ cs.close(); } @Test public void testGetCurrentRecord() throws SQLException { ResultSet cs = helpExecuteQuery(); cs.absolute(103); assertEquals(" Current record doesn't match with expected one.", new Integer(103), ((ResultSetImpl)cs).getCurrentRecord().get(0)); //$NON-NLS-1$ cs.close(); } /** test close() without walking through any of the record*/ @Test public void testClose() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); assertEquals(" Actual doesn't match with expected. ", new Integer(0), new Integer(cs.getRow())); //$NON-NLS-1$ cs.close(); } /** test basic results-related metadata */ @Test public void testGetMetaData() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); // check result set metadata // expected column info. List<String> columnName = getBQTRSMetaData1a(); List<Integer> columnType = getBQTRSMetaData1b(); List<String> columnTypeName = getBQTRSMetaData1c(); ResultSetMetaData rm = cs.getMetaData(); assertNotNull(rm); for (int j = 1; j <= rm.getColumnCount(); j++) { assertEquals(" Actual doesn't match with expected. ", columnName.get(j-1), rm.getColumnLabel(j)); //$NON-NLS-1$ assertEquals(" Actual doesn't match with expected. ", columnType.get(j-1), new Integer(rm.getColumnType(j))); //$NON-NLS-1$ assertEquals(" Actual doesn't match with expected. ", columnTypeName.get(j-1), rm.getColumnTypeName(j)); //$NON-NLS-1$ } cs.close(); } @Test public void testFindColumn() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); ResultSetMetaData rm = cs.getMetaData(); assertNotNull(rm); //assertEquals(" Actual columnName doesn't match with expected. ", 1, cs.findColumn("BQT1.MediumA.IntKey")); assertEquals(" Actual columnName doesn't match with expected. ", 1, cs.findColumn("IntKey")); //$NON-NLS-1$ //$NON-NLS-2$ cs.close(); } @Test public void testFindNonExistentColumn() throws SQLException { ResultSet rs = helpExecuteQuery(); rs.next(); try { rs.findColumn("BOGUS"); //$NON-NLS-1$ } catch(SQLException e) { } try { rs.getObject("BOGUS"); //$NON-NLS-1$ } catch(SQLException e) { } rs.close(); } @Test public void testGetStatement() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); assertNotNull(cs.getStatement()); cs.close(); } @Test public void testGetPlanDescription() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); assertNotNull(cs); assertNull((cs.getStatement()).getPlanDescription()); cs.close(); } /** getObject(String) */ @Test public void testGetObject2() throws SQLException { ResultSet cs = helpExecuteQuery(); // move to the 1st row cs.next(); assertEquals(" Actual value doesn't match with expected. ", new Integer(1), cs.getObject("IntKey")); //$NON-NLS-1$ //$NON-NLS-2$ cs.close(); } @Test public void testGetWarnings() throws SQLException { ResultSet cs = helpExecuteQuery(); assertNull(cs.getWarnings()); cs.close(); } @Test public void testGetCursorName() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); assertNull(cs.getCursorName()); cs.close(); } @Test public void testAllGetters() throws SQLException { ResultSetImpl cs = helpExecuteQuery(); cs.next(); assertEquals(" Actual value of getInt() doesn't match with expected one. ", 1, cs.getInt("IntKey")); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals(" Actual value of getString() doesn't match with expected one. ", "1", cs.getString("IntKey")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // Add these back when the MediumA has all those columns assertEquals(" Actual value of getFloat() doesn't match with expected one. ", new Float(1), new Float(cs.getFloat("IntKey"))); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals(" Actual value of getLong() doesn't match with expected one. ", 1, cs.getLong("IntKey")); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals(" Actual value of getDouble() doesn't match with expected one. ", new Double(1), new Double(cs.getDouble("IntKey"))); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals(" Actual value of getByte() doesn't match with expected one. ", (byte)1, cs.getByte("IntKey")); //$NON-NLS-1$ //$NON-NLS-2$ } /** test wasNull() for ResultSet, this result actually is not a cursor result, but AllResults here. */ @Test public void testWasNull() throws SQLException { ResultSet cs = helpExecuteQuery(); cs.next(); assertNotNull(cs.getObject("IntKey")); //$NON-NLS-1$ assertFalse(cs.wasNull()); } @Test public void testForwardOnly() throws Exception { ResultSetImpl cs = helpExecuteQuery(400, 1300, ResultSet.TYPE_FORWARD_ONLY); int i = 0; while (cs.next()) { i++; if (i <= 1200) { assertNotNull(cs.getPrefetch()); } else { assertNull(cs.getPrefetch()); } cs.getObject(1); } assertTrue(cs.isAfterLast()); cs.close(); } @Test public void testForwardOnlyPrefetchSmallFetchSize() throws Exception { StatementImpl statement = createMockStatement(ResultSet.TYPE_FORWARD_ONLY); ResultSetImpl cs = TestAllResultsImpl.helpTestBatching(statement, 10, 128, 256, true); for (int i = 0; i < 256; i++) { cs.next(); cs.getObject(1); } Mockito.verify(statement.getDQP(), Mockito.atMost(1)).processCursorRequest(TestAllResultsImpl.REQUEST_ID, 11, 10); assertFalse(cs.next()); assertTrue(cs.isAfterLast()); cs.close(); } @Test public void testOutputParameter() throws Exception { StatementImpl statement = createMockStatement(ResultSet.TYPE_FORWARD_ONLY); ResultsMessage resultsMsg = new ResultsMessage(); resultsMsg.setResults(new List<?>[] {Arrays.asList(1, null, null), Arrays.asList(null, 2, 3)}); resultsMsg.setLastRow(2); resultsMsg.setFirstRow(1); resultsMsg.setFinalRow(2); resultsMsg.setColumnNames(new String[] {"x", "out1", "out2"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ resultsMsg.setDataTypes(new String[] {"integer", "integer", "integer"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ ResultSetImpl cs = new ResultSetImpl(resultsMsg, statement, null, 2); int count = 0; while (cs.next()) { cs.getObject(1); count++; } assertEquals(1, count); assertTrue(cs.isAfterLast()); assertEquals(2, cs.getOutputParamValue(2)); assertEquals(3, cs.getOutputParamValue(3)); } @Test public void testXML() throws Exception { StatementImpl statement = createMockStatement(ResultSet.TYPE_FORWARD_ONLY); ResultsFuture<LobChunk> future = new ResultsFuture<LobChunk>(); future.getResultsReceiver().receiveResults(new LobChunk("<a/>".getBytes(Charset.forName("UTF-8")), true)); XMLType result = new XMLType(); Mockito.stub(statement.getDQP().requestNextLobChunk(0, 0, result.getReferenceStreamId())).toReturn(future); ResultsMessage resultsMsg = new ResultsMessage(); result.setEncoding("UTF-8"); resultsMsg.setResults(new List<?>[] {Arrays.asList(result)}); resultsMsg.setLastRow(1); resultsMsg.setFirstRow(1); resultsMsg.setFinalRow(1); resultsMsg.setColumnNames(new String[] {"x"}); //$NON-NLS-1$ resultsMsg.setDataTypes(new String[] {"xml"}); //$NON-NLS-1$ ResultSetImpl cs = new ResultSetImpl(resultsMsg, statement); cs.next(); assertEquals("<a/>", cs.getString(1)); } /////////////////////// Helper Method /////////////////// private ResultSetImpl helpExecuteQuery() { try { return helpExecuteQuery(BATCH_SIZE, 1000, ResultSet.TYPE_SCROLL_INSENSITIVE); } catch (Exception e) { throw new RuntimeException(e); } } private ResultSetImpl helpExecuteQuery(int fetchSize, int totalResults, int cursorType) throws SQLException, TeiidProcessingException { StatementImpl statement = createMockStatement(cursorType); return TestAllResultsImpl.helpTestBatching(statement, fetchSize, Math.min(fetchSize, totalResults), totalResults); } static StatementImpl createMockStatement(int cursorType) throws SQLException { StatementImpl statement = mock(StatementImpl.class); DQP dqp = mock(DQP.class); stub(statement.getDQP()).toReturn(dqp); stub(statement.getResultSetType()).toReturn(cursorType); TimeZone tz = TimeZone.getTimeZone("GMT-06:00"); //$NON-NLS-1$ TimeZone serverTz = TimeZone.getTimeZone("GMT-05:00"); //$NON-NLS-1$ stub(statement.getDefaultCalendar()).toReturn(Calendar.getInstance(tz)); stub(statement.getServerTimeZone()).toReturn(serverTz); return statement; } ////////////////////////Expected Results//////////////// /** column name */ private List<String> getBQTRSMetaData1a() { List<String> results = new ArrayList<String>(); results.add("IntKey"); //$NON-NLS-1$ return results; } /** column type */ private List<Integer> getBQTRSMetaData1b() { List<Integer> results = new ArrayList<Integer>(); results.add(Types.INTEGER); return results; } /** column type name*/ private List<String> getBQTRSMetaData1c() { List<String> results = new ArrayList<String>(); results.add("integer"); //$NON-NLS-1$ return results; } }