@Test public void testNonDeterministicTableScanPredicatePushdown() { MaterializedResult materializedResult = computeActual("" + "SELECT COUNT(*)\n" + "FROM (\n" + " SELECT *\n" + " FROM lineitem\n" + " LIMIT 1000\n" + ")\n" + "WHERE rand() > 0.5"); MaterializedRow row = getOnlyElement(materializedResult.getMaterializedRows()); assertEquals(row.getFieldCount(), 1); long count = (Long) row.getField(0); // Technically non-deterministic unit test but has essentially a next to impossible chance of a false positive assertTrue(count > 0 && count < 1000); }
@Test public void testNonDeterministicAggregationPredicatePushdown() { MaterializedResult materializedResult = computeActual("" + "SELECT COUNT(*)\n" + "FROM (\n" + " SELECT orderkey, COUNT(*)\n" + " FROM lineitem\n" + " GROUP BY orderkey\n" + " LIMIT 1000\n" + ")\n" + "WHERE rand() > 0.5"); MaterializedRow row = getOnlyElement(materializedResult.getMaterializedRows()); assertEquals(row.getFieldCount(), 1); long count = (Long) row.getField(0); // Technically non-deterministic unit test but has essentially a next to impossible chance of a false positive assertTrue(count > 0 && count < 1000); }
@Test public void testNonDeterministicJoinPredicatePushdown() { MaterializedResult materializedResult = computeActual("" + "SELECT COUNT(*)\n" + "FROM (\n" + " SELECT DISTINCT *\n" + " FROM (\n" + " SELECT 'abc' AS col1a, 500 AS col1b FROM lineitem LIMIT 1\n" + " ) table1\n" + " JOIN (\n" + " SELECT 'abc' AS col2a FROM lineitem LIMIT 1000000\n" + " ) table2\n" + " ON table1.col1a = table2.col2a\n" + " WHERE rand() * 1000 > table1.col1b\n" + ")"); MaterializedRow row = getOnlyElement(materializedResult.getMaterializedRows()); assertEquals(row.getFieldCount(), 1); long count = (Long) row.getField(0); // Technically non-deterministic unit test but has essentially a next to impossible chance of a false positive assertTrue(count > 0 && count < 1000000); }
@Test public void testJoinWithNonDeterministicLessThan() { MaterializedRow actualRow = getOnlyElement(computeActual( "SELECT count(*) FROM " + "customer c1 JOIN customer c2 ON c1.nationkey=c2.nationkey " + "WHERE c1.custkey - RANDOM(CAST(c1.custkey AS BIGINT)) < c2.custkey").getMaterializedRows()); assertEquals(actualRow.getFieldCount(), 1); long actualCount = (Long) actualRow.getField(0); // this should be around ~69000 MaterializedRow expectedAtLeastRow = getOnlyElement(computeActual( "SELECT count(*) FROM " + "customer c1 JOIN customer c2 ON c1.nationkey=c2.nationkey " + "WHERE c1.custkey < c2.custkey").getMaterializedRows()); assertEquals(expectedAtLeastRow.getFieldCount(), 1); long expectedAtLeastCount = (Long) expectedAtLeastRow.getField(0); // this is exactly 45022 // Technically non-deterministic unit test but has hopefully a next to impossible chance of a false positive assertTrue(actualCount > expectedAtLeastCount); }
private void assertThatQueryReturnsValue(String sql, Object expected, Session session) { MaterializedResult rows = session == null ? queryRunner.execute(sql) : queryRunner.execute(session, sql); MaterializedRow materializedRow = Iterables.getOnlyElement(rows); int fieldCount = materializedRow.getFieldCount(); assertTrue(fieldCount == 1, format("Expected only one column, but got '%d'", fieldCount)); Object value = materializedRow.getField(0); assertEquals(value, expected); assertTrue(Iterables.getOnlyElement(rows).getFieldCount() == 1); } }
private void assertThatQueryReturnsValue(@Language("SQL") String sql, Object expected) { MaterializedResult rows = queryRunner.execute(sql); MaterializedRow materializedRow = Iterables.getOnlyElement(rows); int fieldCount = materializedRow.getFieldCount(); assertTrue(fieldCount == 1, format("Expected only one column, but got '%d'", fieldCount)); Object value = materializedRow.getField(0); assertEquals(value, expected); assertTrue(Iterables.getOnlyElement(rows).getFieldCount() == 1); } }
@Test public void testNonDeterministicProjection() { MaterializedResult materializedResult = computeActual("SELECT r, r + 1 FROM (SELECT rand(100) r FROM orders) LIMIT 10"); assertEquals(materializedResult.getRowCount(), 10); for (MaterializedRow materializedRow : materializedResult) { assertEquals(materializedRow.getFieldCount(), 2); assertEquals(((Number) materializedRow.getField(0)).intValue() + 1, materializedRow.getField(1)); } }
private static void appendToPage(PageBuilder pageBuilder, MaterializedRow row) { for (int field = 0; field < row.getFieldCount(); field++) { Type type = pageBuilder.getType(field); Object value = row.getField(field); BlockBuilder blockBuilder = pageBuilder.getBlockBuilder(field); writeValue(type, blockBuilder, value); } pageBuilder.declarePosition(); }
private static MaterializedRow convertToTestTypes(MaterializedRow prestoRow) for (int field = 0; field < prestoRow.getFieldCount(); field++) { Object prestoValue = prestoRow.getField(field); Object convertedValue;
private void assertQueryResult(@Language("SQL") String sql, Object... expected) { MaterializedResult rows = computeActual(sql); assertEquals(rows.getRowCount(), expected.length); for (int i = 0; i < expected.length; i++) { MaterializedRow materializedRow = rows.getMaterializedRows().get(i); int fieldCount = materializedRow.getFieldCount(); assertTrue(fieldCount == 1, format("Expected only one column, but got '%d'", fieldCount)); Object value = materializedRow.getField(0); assertEquals(value, expected[i]); assertTrue(materializedRow.getFieldCount() == 1); } } }
assertEquals(expectedRows.size(), 1, "For query: \n " + actual + "\n:"); MaterializedRow row = expectedRows.get(0); assertEquals(row.getFieldCount(), 1, "For query: \n " + actual + "\n:"); assertEquals(row.getField(0), actualResults.getUpdateCount().getAsLong(), "For query: \n " + actual + "\n:");
private void assertOneNotNullResult(String query) { MaterializedResult results = getQueryRunner().execute(getSession(), query).toTestTypes(); assertEquals(results.getRowCount(), 1); assertEquals(results.getMaterializedRows().get(0).getFieldCount(), 1); assertNotNull(results.getMaterializedRows().get(0).getField(0)); } }
@Test public void testSelectAllTypes() { createBlackholeAllTypesTable(); MaterializedResult rows = queryRunner.execute("SELECT * FROM blackhole_all_types"); assertEquals(rows.getRowCount(), 1); MaterializedRow row = Iterables.getOnlyElement(rows); assertEquals(row.getFieldCount(), 13); assertEquals(row.getField(0), "**********"); assertEquals(row.getField(1), 0L); assertEquals(row.getField(2), 0); assertEquals(row.getField(3), (short) 0); assertEquals(row.getField(4), (byte) 0); assertEquals(row.getField(5), 0.0f); assertEquals(row.getField(6), 0.0); assertEquals(row.getField(7), false); assertEquals(row.getField(8), LocalDate.ofEpochDay(0)); assertEquals(row.getField(9), LocalDateTime.of(1969, 12, 31, 13, 0, 0)); // TODO #7122 should be 1970-01-01 00:00:00 assertEquals(row.getField(10), "****************".getBytes()); assertEquals(row.getField(11), new BigDecimal("0.00")); assertEquals(row.getField(12), new BigDecimal("00000000000000000000.0000000000")); dropBlackholeAllTypesTable(); }
@Test public void fieldLength() { Session session = testSessionBuilder() .setCatalog("blackhole") .setSchema("default") .build(); assertThatQueryReturnsValue( format("CREATE TABLE nation WITH ( %s = 8, %s = 1, %s = 1, %s = 1 ) AS " + "SELECT nationkey, name, regionkey, comment, 'abc' short_varchar FROM tpch.tiny.nation", FIELD_LENGTH_PROPERTY, ROWS_PER_PAGE_PROPERTY, PAGES_PER_SPLIT_PROPERTY, SPLIT_COUNT_PROPERTY), 25L, session); MaterializedResult rows = queryRunner.execute(session, "SELECT * FROM nation"); assertEquals(rows.getRowCount(), 1); MaterializedRow row = Iterables.getOnlyElement(rows); assertEquals(row.getFieldCount(), 5); assertEquals(row.getField(0), 0L); assertEquals(row.getField(1), "********"); assertEquals(row.getField(2), 0L); assertEquals(row.getField(3), "********"); assertEquals(row.getField(4), "***"); // this one is shorter due to column type being VARCHAR(3) assertThatQueryReturnsValue("DROP TABLE nation", true); }
assertEquals(input.getFieldCount(), 5); return (String) input.getField(0); });
@Test public void dataGenerationUsage() { Session session = testSessionBuilder() .setCatalog("blackhole") .setSchema("default") .build(); assertThatQueryReturnsValue( format("CREATE TABLE nation WITH ( %s = 3, %s = 2, %s = 1 ) as SELECT * FROM tpch.tiny.nation", ROWS_PER_PAGE_PROPERTY, PAGES_PER_SPLIT_PROPERTY, SPLIT_COUNT_PROPERTY), 25L, session); assertThatQueryReturnsValue("SELECT count(*) FROM nation", 6L, session); assertThatQueryReturnsValue("INSERT INTO nation SELECT * FROM tpch.tiny.nation", 25L, session); assertThatQueryReturnsValue("SELECT count(*) FROM nation", 6L, session); MaterializedResult rows = queryRunner.execute(session, "SELECT * FROM nation LIMIT 1"); assertEquals(rows.getRowCount(), 1); MaterializedRow row = Iterables.getOnlyElement(rows); assertEquals(row.getFieldCount(), 4); assertEquals(row.getField(0), 0L); assertEquals(row.getField(1), "****************"); assertEquals(row.getField(2), 0L); assertEquals(row.getField(3), "****************"); assertThatQueryReturnsValue("DROP TABLE nation", true); }
private void assertOneNotNullResult(@Language("SQL") String query) { MaterializedResult results = getQueryRunner().execute(getSession(), query).toTestTypes(); assertEquals(results.getRowCount(), 1); assertEquals(results.getMaterializedRows().get(0).getFieldCount(), 1); assertNotNull(results.getMaterializedRows().get(0).getField(0)); }
assertEquals(input.getFieldCount(), 6); return (String) input.getField(0); });
private void assertThatQueryReturnsValue(String sql, Object expected, Session session) { MaterializedResult rows = session == null ? queryRunner.execute(sql) : queryRunner.execute(session, sql); MaterializedRow materializedRow = Iterables.getOnlyElement(rows); int fieldCount = materializedRow.getFieldCount(); assertTrue(fieldCount == 1, format("Expected only one column, but got '%d'", fieldCount)); Object value = materializedRow.getField(0); assertEquals(value, expected); assertTrue(Iterables.getOnlyElement(rows).getFieldCount() == 1); } }
private static void appendToPage(PageBuilder pageBuilder, MaterializedRow row) { for (int field = 0; field < row.getFieldCount(); field++) { Type type = pageBuilder.getType(field); Object value = row.getField(field); BlockBuilder blockBuilder = pageBuilder.getBlockBuilder(field); writeValue(type, blockBuilder, value); } pageBuilder.declarePosition(); }