diff --git beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java index 3ebbc9af9ba1a99dfc1d0af63ba362bae5eb2df4..6c2360c631592d8fced99d4e76aa89fb50b2b30a 100644 --- beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java +++ beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java @@ -77,6 +77,7 @@ private boolean verbose = false; private boolean force = false; private boolean incremental = true; + private boolean convertBinaryArrayToString = true; private int incrementalBufferRows = DEFAULT_INCREMENTAL_BUFFER_ROWS; private boolean showWarnings = false; private boolean showNestedErrs = false; @@ -388,6 +389,14 @@ public String getNumberFormat() { return numberFormat; } + public void setConvertBinaryArrayToString(boolean convert) { + this.convertBinaryArrayToString = convert; + } + + public boolean getConvertBinaryArrayToString() { + return this.convertBinaryArrayToString; + } + public void setMaxWidth(int maxWidth) { this.maxWidth = maxWidth; } diff --git beeline/src/java/org/apache/hive/beeline/Rows.java beeline/src/java/org/apache/hive/beeline/Rows.java index 924b9519a64427936101a9dc4bbe1831719194e6..cd9026895ee6ba8fa50f3b123f126a4c70b643ce 100644 --- beeline/src/java/org/apache/hive/beeline/Rows.java +++ beeline/src/java/org/apache/hive/beeline/Rows.java @@ -39,6 +39,7 @@ final ResultSetMetaData rsMeta; final Boolean[] primaryKeys; final NumberFormat numberFormat; + private boolean convertBinaryArray; private final String nullStr; Rows(BeeLine beeLine, ResultSet rs) throws SQLException { @@ -52,6 +53,7 @@ } else { numberFormat = new DecimalFormat(beeLine.getOpts().getNumberFormat()); } + this.convertBinaryArray = beeLine.getOpts().getConvertBinaryArrayToString(); } public void remove() { @@ -153,19 +155,16 @@ public String toString(){ } for (int i = 0; i < size; i++) { - if (numberFormat != null) { - Object o = rs.getObject(i + 1); - if (o == null) { - values[i] = null; - } else if (o instanceof Number) { - values[i] = numberFormat.format(o); - } else { - values[i] = o.toString(); - } + Object o = rs.getObject(i + 1); + if(rs.wasNull()) { + values[i] = nullStr; + } else if (o instanceof Number) { + values[i] = numberFormat != null ? numberFormat.format(o) : o.toString() ; + } else if (o instanceof byte[]) { + values[i] = convertBinaryArray ? new String((byte[])o) : Arrays.toString((byte[])o); } else { - values[i] = rs.getString(i + 1); + values[i] = o.toString(); } - values[i] = values[i] == null ? nullStr : values[i]; sizes[i] = values[i].length(); } } diff --git beeline/src/test/org/apache/hive/beeline/TestBufferedRows.java beeline/src/test/org/apache/hive/beeline/TestBufferedRows.java index f3f3d3a20cfd751b544636d86ad95e8ad7a2341d..c1ae29b5e5e72a65725fbb14f24f02d547237092 100644 --- beeline/src/test/org/apache/hive/beeline/TestBufferedRows.java +++ beeline/src/test/org/apache/hive/beeline/TestBufferedRows.java @@ -98,7 +98,7 @@ public Boolean answer(InvocationOnMock invocation) { } }); - when(mockResultSet.getString(Matchers.anyInt())).thenAnswer(new Answer() { + when(mockResultSet.getObject(Matchers.anyInt())).thenAnswer(new Answer() { public String answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); int index = ((Integer) args[0]).intValue(); diff --git beeline/src/test/org/apache/hive/beeline/TestIncrementalRowsWithNormalization.java beeline/src/test/org/apache/hive/beeline/TestIncrementalRows.java similarity index 62% rename from beeline/src/test/org/apache/hive/beeline/TestIncrementalRowsWithNormalization.java rename to beeline/src/test/org/apache/hive/beeline/TestIncrementalRows.java index 68da841f850d2e97bf4b89071ec6d20ce8cf5d10..240c979bdf2ea2d94f908a0a777c77de37ee547e 100644 --- beeline/src/test/org/apache/hive/beeline/TestIncrementalRowsWithNormalization.java +++ beeline/src/test/org/apache/hive/beeline/TestIncrementalRows.java @@ -27,52 +27,98 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -public class TestIncrementalRowsWithNormalization { +public class TestIncrementalRows { - @Test - public void testIncrementalRows() throws SQLException { - Integer incrementalBufferRows = 5; + private BeeLineOpts mockBeeLineOpts; + private BeeLine mockBeeline; + private Integer incrementalBufferRows = 5; + private ResultSet mockResultSet; + + @Before + public void init() throws SQLException { // Mock BeeLineOpts - BeeLineOpts mockBeeLineOpts = mock(BeeLineOpts.class); + mockBeeLineOpts = mock(BeeLineOpts.class); when(mockBeeLineOpts.getIncrementalBufferRows()).thenReturn(incrementalBufferRows); when(mockBeeLineOpts.getMaxColumnWidth()).thenReturn(BeeLineOpts.DEFAULT_MAX_COLUMN_WIDTH); when(mockBeeLineOpts.getNumberFormat()).thenReturn("default"); when(mockBeeLineOpts.getNullString()).thenReturn("NULL"); // Mock BeeLine - BeeLine mockBeeline = mock(BeeLine.class); + mockBeeline = mock(BeeLine.class); when(mockBeeline.getOpts()).thenReturn(mockBeeLineOpts); // MockResultSet - ResultSet mockResultSet = mock(ResultSet.class); + mockResultSet = mock(ResultSet.class); ResultSetMetaData mockResultSetMetaData = mock(ResultSetMetaData.class); when(mockResultSetMetaData.getColumnCount()).thenReturn(1); when(mockResultSetMetaData.getColumnLabel(1)).thenReturn("Mock Table"); when(mockResultSet.getMetaData()).thenReturn(mockResultSetMetaData); + } - // First 10 calls to resultSet.next() should return true + @Test + public void testIncrementalRowsBinaryArrayConvert() throws SQLException { + + when(mockBeeLineOpts.getConvertBinaryArrayToString()).thenReturn(true); + + // First call to resultSet.next() should return true + initNrOfResultSetCalls(1); + + when(mockResultSet.getObject(1)).thenReturn(new byte[]{77,77,77}); + IncrementalRows convertedIr = new IncrementalRows(mockBeeline, mockResultSet); + + convertedIr.next(); + String row = convertedIr.next().toString(); + Assert.assertEquals("[MMM]", row); + } + + @Test + public void testIncrementalRowsBinaryArraySkipConvert() throws SQLException { + + when(mockBeeLineOpts.getConvertBinaryArrayToString()).thenReturn(false); + + // First call to resultSet.next() should return true + initNrOfResultSetCalls(1); + + when(mockResultSet.getObject(1)).thenReturn(new byte[]{77,77,77}); + IncrementalRows convertedIr = new IncrementalRows(mockBeeline, mockResultSet); + + convertedIr.next(); + String row = convertedIr.next().toString(); + Assert.assertEquals("[[77, 77, 77]]", row); + } + + public void initNrOfResultSetCalls(final int iter) throws SQLException { when(mockResultSet.next()).thenAnswer(new Answer() { - private int iterations = 10; + private int iterations = iter; @Override public Boolean answer(InvocationOnMock invocation) { return this.iterations-- > 0; } }); + } + + @Test + public void testIncrementalRowsWithNormalization() throws SQLException { + + // First 10 calls to resultSet.next() should return true + initNrOfResultSetCalls(10); - when(mockResultSet.getString(1)).thenReturn("Hello World"); + when(mockResultSet.getObject(1)).thenReturn("Hello World"); // IncrementalRows constructor should buffer the first "incrementalBufferRows" rows IncrementalRowsWithNormalization incrementalRowsWithNormalization = new IncrementalRowsWithNormalization( - mockBeeline, mockResultSet); + mockBeeline, mockResultSet); // When the first buffer is loaded ResultSet.next() should be called "incrementalBufferRows" times verify(mockResultSet, times(5)).next(); diff --git beeline/src/test/org/apache/hive/beeline/TestTableOutputFormat.java beeline/src/test/org/apache/hive/beeline/TestTableOutputFormat.java index c7d9f8095cf56df957ebe2f50ed033a09bd4e31b..0f557e8bc4a3db02dfcff4a29a42d02e04f72d30 100644 --- beeline/src/test/org/apache/hive/beeline/TestTableOutputFormat.java +++ beeline/src/test/org/apache/hive/beeline/TestTableOutputFormat.java @@ -96,7 +96,7 @@ public Boolean answer(final InvocationOnMock invocation) { } }); - when(mockResultSet.getString(Matchers.anyInt())).thenAnswer(new Answer() { + when(mockResultSet.getObject(Matchers.anyInt())).thenAnswer(new Answer() { @Override public String answer(final InvocationOnMock invocation) { Object[] args = invocation.getArguments();