@Test public void testNullableVarLen2() { final MaterializedField field = MaterializedField.create(EMPTY_SCHEMA_PATH, NullableVarCharHolder.TYPE); // Create a new value vector for 1024 integers. try (final NullableVarCharVector vector = new NullableVarCharVector(field, allocator)) { final NullableVarCharVector.Mutator m = vector.getMutator(); vector.allocateNew(1024 * 10, 1024); m.set(0, STR1); m.set(1, STR2); m.set(2, STR3); // Check the sample strings. final NullableVarCharVector.Accessor accessor = vector.getAccessor(); assertArrayEquals(STR1, accessor.get(0)); assertArrayEquals(STR2, accessor.get(1)); assertArrayEquals(STR3, accessor.get(2)); // Ensure null value throws. boolean b = false; try { vector.getAccessor().get(3); } catch (IllegalStateException e) { b = true; } finally { assertTrue(b); } } }
@Test public void testReAllocNullableVariableWidthVector() { final MaterializedField field = MaterializedField.create(EMPTY_SCHEMA_PATH, NullableVarCharHolder.TYPE); // Create a new value vector for 1024 integers try (final NullableVarCharVector vector = (NullableVarCharVector) TypeHelper.getNewVector(field, allocator)) { final NullableVarCharVector.Mutator m = vector.getMutator(); vector.allocateNew(); int initialCapacity = vector.getValueCapacity(); // Put values in indexes that fall within the initial allocation m.setSafe(0, STR1, 0, STR1.length); m.setSafe(initialCapacity - 1, STR2, 0, STR2.length); // Now try to put values in space that falls beyond the initial allocation m.setSafe(initialCapacity + 200, STR3, 0, STR3.length); // Check valueCapacity is more than initial allocation assertEquals((initialCapacity + 1) * 2 - 1, vector.getValueCapacity()); final NullableVarCharVector.Accessor accessor = vector.getAccessor(); assertArrayEquals(STR1, accessor.get(0)); assertArrayEquals(STR2, accessor.get(initialCapacity - 1)); assertArrayEquals(STR3, accessor.get(initialCapacity + 200)); // Set the valueCount to be more than valueCapacity of current allocation. This is possible // for NullableValueVectors // as we don't call setSafe for null values, but we do call setValueCount when the current // batch is processed. m.setValueCount(vector.getValueCapacity() + 200); } }
@Test public void testSubstringNegative( @Injectable final DrillbitContext bitContext, @Injectable UserServer.UserClientConnection connection) throws Throwable { new NonStrictExpectations() { { bitContext.getMetrics(); result = new MetricRegistry(); bitContext.getAllocator(); result = new TopLevelAllocator(); bitContext.getOperatorCreatorRegistry(); result = new OperatorCreatorRegistry(c); bitContext.getConfig(); result = c; } }; PhysicalPlanReader reader = new PhysicalPlanReader( c, c.getMapper(), CoordinationProtos.DrillbitEndpoint.getDefaultInstance()); PhysicalPlan plan = reader.readPhysicalPlan( Files.toString( FileUtils.getResourceAsFile("/functions/testSubstringNegative.json"), Charsets.UTF_8)); FunctionImplementationRegistry registry = new FunctionImplementationRegistry(c); FragmentContext context = new FragmentContext(bitContext, PlanFragment.getDefaultInstance(), connection, registry); SimpleRootExec exec = new SimpleRootExec( ImplCreator.getExec( context, (FragmentRoot) plan.getSortedOperators(false).iterator().next())); while (exec.next()) { NullableVarCharVector c1 = exec.getValueVectorById( new SchemaPath("col3", ExpressionPosition.UNKNOWN), NullableVarCharVector.class); NullableVarCharVector.Accessor a1; a1 = c1.getAccessor(); int count = 0; for (int i = 0; i < c1.getAccessor().getValueCount(); i++) { if (!a1.isNull(i)) { NullableVarCharHolder holder = new NullableVarCharHolder(); a1.get(i, holder); // when offset is negative, substring return empty string. assertEquals("", holder.toString()); ++count; } } assertEquals(50, count); } if (context.getFailureCause() != null) { throw context.getFailureCause(); } assertTrue(!context.isFailed()); }