blob: 1a9569eeac927d62f3b5900f351794408f24d939 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.drill;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.drill.categories.SqlFunctionTest;
import org.apache.drill.common.expression.SchemaPath;
import org.apache.drill.common.types.TypeProtos;
import org.apache.drill.common.types.Types;
import org.apache.drill.exec.ExecConstants;
import org.apache.drill.test.BaseTestQuery;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
@Category(SqlFunctionTest.class)
public class TestFunctionsWithTypeExpoQueries extends BaseTestQuery {
@BeforeClass
public static void setup() {
dirTestWatcher.copyResourceToRoot(Paths.get("typeExposure"));
alterSession(ExecConstants.EARLY_LIMIT0_OPT_KEY, true);
}
@AfterClass
public static void tearDown() {
resetSessionOption(ExecConstants.EARLY_LIMIT0_OPT_KEY);
}
@Test
public void testConcatWithMoreThanTwoArgs() throws Exception {
final String query = "select concat(r_name, r_name, r_name, 'f') as col \n" +
"from cp.`tpch/region.parquet` limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.VARCHAR)
.setMode(TypeProtos.DataMode.REQUIRED)
.setPrecision(Types.MAX_VARCHAR_LENGTH)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testRow_NumberInView() throws Exception {
try {
test("use dfs.tmp;");
test(
"create view TestFunctionsWithTypeExpoQueries_testViewShield1 as \n" +
"select rnum, position_id, " +
" ntile(4) over(order by position_id) " +
" from (select position_id, row_number() " +
" over(order by position_id) as rnum " +
" from cp.`employee.json`)");
test(
"create view TestFunctionsWithTypeExpoQueries_testViewShield2 as \n" +
"select row_number() over(order by position_id) as rnum, " +
" position_id, " +
" ntile(4) over(order by position_id) " +
" from cp.`employee.json`");
testBuilder()
.sqlQuery("select * from TestFunctionsWithTypeExpoQueries_testViewShield1")
.ordered()
.sqlBaselineQuery("select * from TestFunctionsWithTypeExpoQueries_testViewShield2")
.build()
.run();
} finally {
test("drop view TestFunctionsWithTypeExpoQueries_testViewShield1;");
test("drop view TestFunctionsWithTypeExpoQueries_testViewShield2;");
}
}
@Test
public void testLRBTrimOneArg() throws Exception {
final String query1 = "SELECT ltrim('drill') as col FROM cp.`tpch/region.parquet` limit 0";
final String query2 = "SELECT rtrim('drill') as col FROM cp.`tpch/region.parquet` limit 0";
final String query3 = "SELECT btrim('drill') as col FROM cp.`tpch/region.parquet` limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.VARCHAR)
.setMode(TypeProtos.DataMode.REQUIRED)
.setPrecision(Types.MAX_VARCHAR_LENGTH)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query1)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(query2)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(query3)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testTrim() throws Exception {
final String query1 = "SELECT trim('drill') as col FROM cp.`tpch/region.parquet` limit 0";
final String query2 = "SELECT trim('drill') as col FROM cp.`tpch/region.parquet` limit 0";
final String query3 = "SELECT trim('drill') as col FROM cp.`tpch/region.parquet` limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.VARCHAR)
.setMode(TypeProtos.DataMode.REQUIRED)
.setPrecision(Types.MAX_VARCHAR_LENGTH)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query1)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(query2)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(query3)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testTrimOneArg() throws Exception {
final String query1 = "SELECT trim(leading 'drill') as col FROM cp.`tpch/region.parquet` limit 0";
final String query2 = "SELECT trim(trailing 'drill') as col FROM cp.`tpch/region.parquet` limit 0";
final String query3 = "SELECT trim(both 'drill') as col FROM cp.`tpch/region.parquet` limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.VARCHAR)
.setMode(TypeProtos.DataMode.REQUIRED)
.setPrecision(Types.MAX_VARCHAR_LENGTH)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query1)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(query2)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(query3)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testTrimTwoArg() throws Exception {
final String query1 = "SELECT trim(leading ' ' from 'drill') as col FROM cp.`tpch/region.parquet` limit 0";
final String query2 = "SELECT trim(trailing ' ' from 'drill') as col FROM cp.`tpch/region.parquet` limit 0";
final String query3 = "SELECT trim(both ' ' from 'drill') as col FROM cp.`tpch/region.parquet` limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.VARCHAR)
.setMode(TypeProtos.DataMode.REQUIRED)
.setPrecision(Types.MAX_VARCHAR_LENGTH)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query1)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(query2)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(query3)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testIsNull() throws Exception {
final String query = "select r_name is null as col from cp.`tpch/region.parquet` limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
/**
* In the following query, the extract function would be borrowed from Calcite,
* which asserts the return type as be BIG-INT
*/
@Test
public void testExtractSecond() throws Exception {
String query = "select extract(second from time '02:30:45.100') as col \n" +
"from cp.`tpch/region.parquet` \n" +
"limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.FLOAT8)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testMetaDataExposeType() throws Exception {
final String query = "select count(*) as col " +
"from dfs.`typeExposure/metadata_caching` " +
"where concat(a, 'asdf') = 'asdf'";
// Validate the plan
final String[] expectedPlan = {"Scan.*metadata_caching.*numFiles = 1"};
final String[] excludedPlan = {"Filter"};
PlanTestBase.testPlanMatchingPatterns(query, expectedPlan, excludedPlan);
// Validate the result
testBuilder()
.sqlQuery(query)
.ordered()
.baselineColumns("col")
.baselineValues(1L)
.build()
.run();
}
@Test
public void testDate_Part() throws Exception {
final String query = "select date_part('year', date '2008-2-23') as col " +
"from cp.`tpch/region.parquet` " +
"limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testNegativeByInterpreter() throws Exception {
final String query = "select * from cp.`tpch/region.parquet` " +
"where r_regionkey = negative(-1)";
// Validate the plan
final String[] expectedPlan = {"Filter.*condition=\\[=\\(.*, 1\\)\\]\\)"};
final String[] excludedPlan = {};
PlanTestBase.testPlanMatchingPatterns(query, expectedPlan, excludedPlan);
}
@Test
public void testSumRequiredType() throws Exception {
final String query = "SELECT " +
"SUM(CASE WHEN (CAST(n_regionkey AS INT) = 1) THEN 1 ELSE 0 END) AS col " +
"FROM cp.`tpch/nation.parquet` " +
"GROUP BY CAST(n_regionkey AS INT) " +
"limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testSQRTDecimalLiteral() throws Exception {
final String query = "SELECT sqrt(5.1) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.FLOAT8)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testSQRTIntegerLiteral() throws Exception {
final String query = "SELECT sqrt(4) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.FLOAT8)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testTimestampDiff() throws Exception {
final String query = "select to_timestamp('2014-02-13 00:30:30','YYYY-MM-dd HH:mm:ss') - to_timestamp('2014-02-13 00:30:30','YYYY-MM-dd HH:mm:ss') as col " +
"from cp.`tpch/region.parquet` " +
"limit 0";
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.INTERVALDAY)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testEqualBetweenIntervalAndTimestampDiff() throws Exception {
final String query = "select to_timestamp('2016-11-02 10:00:00','YYYY-MM-dd HH:mm:ss') + interval '10-11' year to month as col " +
"from cp.`tpch/region.parquet` " +
"where (to_timestamp('2016-11-02 10:00:00','YYYY-MM-dd HH:mm:ss') - to_timestamp('2016-01-01 10:00:00','YYYY-MM-dd HH:mm:ss') < interval '5 10:00:00' day to second) " +
"limit 0";
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.TIMESTAMP)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testAvgAndSUM() throws Exception {
final String query = "SELECT AVG(cast(r_regionkey as float)) AS `col1`, " +
"SUM(cast(r_regionkey as float)) AS `col2`, " +
"SUM(1) AS `col3` " +
"FROM cp.`tpch/region.parquet` " +
"GROUP BY CAST(r_regionkey AS INTEGER) " +
"LIMIT 0";
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
final TypeProtos.MajorType majorType1 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.FLOAT8)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final TypeProtos.MajorType majorType2 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.FLOAT8)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final TypeProtos.MajorType majorType3 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col1"), majorType1));
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col2"), majorType2));
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col3"), majorType3));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testAvgCountStar() throws Exception {
final String query = "select avg(distinct cast(r_regionkey as bigint)) + avg(cast(r_regionkey as integer)) as col1, " +
"sum(distinct cast(r_regionkey as bigint)) + 100 as col2, count(*) as col3 " +
"from cp.`tpch/region.parquet` alltypes_v " +
"where cast(r_regionkey as bigint) = 100000000000000000 " +
"limit 0";
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
final TypeProtos.MajorType majorType1 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.FLOAT8)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final TypeProtos.MajorType majorType2 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final TypeProtos.MajorType majorType3 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col1"), majorType1));
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col2"), majorType2));
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col3"), majorType3));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testUDFInGroupBy() throws Exception {
final String query = "select count(*) as col1, substr(lower(UPPER(cast(t3.full_name as varchar(100)))), 5, 2) as col2, " +
"char_length(substr(lower(UPPER(cast(t3.full_name as varchar(100)))), 5, 2)) as col3 " +
"from cp.`tpch/region.parquet` t1 " +
"left outer join cp.`tpch/nation.parquet` t2 on cast(t1.r_regionkey as Integer) = cast(t2.n_nationkey as Integer) " +
"left outer join cp.`employee.json` t3 on cast(t1.r_regionkey as Integer) = cast(t3.employee_id as Integer) " +
"group by substr(lower(UPPER(cast(t3.full_name as varchar(100)))), 5, 2), " +
"char_length(substr(lower(UPPER(cast(t3.full_name as varchar(100)))), 5, 2)) " +
"order by substr(lower(UPPER(cast(t3.full_name as varchar(100)))), 5, 2)," +
"char_length(substr(lower(UPPER(cast(t3.full_name as varchar(100)))), 5, 2)) " +
"limit 0";
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
final TypeProtos.MajorType majorType1 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
final TypeProtos.MajorType majorType2 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.VARCHAR)
.setMode(TypeProtos.DataMode.OPTIONAL)
.setPrecision(Types.MAX_VARCHAR_LENGTH)
.build();
final TypeProtos.MajorType majorType3 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col1"), majorType1));
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col2"), majorType2));
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col3"), majorType3));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testWindowSumAvg() throws Exception {
final String query = "with query as ( " +
"select sum(cast(employee_id as integer)) over w as col1, cast(avg(cast(employee_id as bigint)) over w as double precision) as col2, count(*) over w as col3 " +
"from cp.`tpch/region.parquet` " +
"window w as (partition by cast(full_name as varchar(10)) order by cast(full_name as varchar(10)) nulls first)) " +
"select * " +
"from query " +
"limit 0";
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
final TypeProtos.MajorType majorType1 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final TypeProtos.MajorType majorType2 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.FLOAT8)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final TypeProtos.MajorType majorType3 = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col1"), majorType1));
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col2"), majorType2));
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col3"), majorType3));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testWindowRanking() throws Exception {
final String queryCUME_DIST = "select CUME_DIST() over(order by n_nationkey) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
final String queryDENSE_RANK = "select DENSE_RANK() over(order by n_nationkey) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
final String queryPERCENT_RANK = "select PERCENT_RANK() over(order by n_nationkey) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
final String queryRANK = "select RANK() over(order by n_nationkey) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
final String queryROW_NUMBER = "select ROW_NUMBER() over(order by n_nationkey) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
final TypeProtos.MajorType majorTypeDouble = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.FLOAT8)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
final TypeProtos.MajorType majorTypeBigInt = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchemaCUME_DIST = Lists.newArrayList();
expectedSchemaCUME_DIST.add(Pair.of(SchemaPath.getSimplePath("col"), majorTypeDouble));
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchemaDENSE_RANK = Lists.newArrayList();
expectedSchemaDENSE_RANK.add(Pair.of(SchemaPath.getSimplePath("col"), majorTypeBigInt));
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchemaPERCENT_RANK = Lists.newArrayList();
expectedSchemaPERCENT_RANK.add(Pair.of(SchemaPath.getSimplePath("col"), majorTypeDouble));
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchemaRANK = Lists.newArrayList();
expectedSchemaRANK.add(Pair.of(SchemaPath.getSimplePath("col"), majorTypeBigInt));
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchemaROW_NUMBER = Lists.newArrayList();
expectedSchemaROW_NUMBER.add(Pair.of(SchemaPath.getSimplePath("col"), majorTypeBigInt));
testBuilder()
.sqlQuery(queryCUME_DIST)
.schemaBaseLine(expectedSchemaCUME_DIST)
.build()
.run();
testBuilder()
.sqlQuery(queryDENSE_RANK)
.schemaBaseLine(expectedSchemaDENSE_RANK)
.build()
.run();
testBuilder()
.sqlQuery(queryPERCENT_RANK)
.schemaBaseLine(expectedSchemaPERCENT_RANK)
.build()
.run();
testBuilder()
.sqlQuery(queryRANK)
.schemaBaseLine(expectedSchemaRANK)
.build()
.run();
testBuilder()
.sqlQuery(queryROW_NUMBER)
.schemaBaseLine(expectedSchemaROW_NUMBER)
.build()
.run();
}
@Test
public void testWindowNTILE() throws Exception {
final String query = "select ntile(1) over(order by position_id) as col " +
"from cp.`employee.json` " +
"limit 0";
final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.INT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testLeadLag() throws Exception {
final String queryLEAD = "select lead(cast(n_nationkey as BigInt)) over(order by n_nationkey) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
final String queryLAG = "select lag(cast(n_nationkey as BigInt)) over(order by n_nationkey) as col " +
"from cp.`tpch/nation.parquet` " +
"limit 0";
final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(queryLEAD)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(queryLAG)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test
public void testFirst_Last_Value() throws Exception {
final String queryFirst = "select first_value(cast(position_id as integer)) over(order by position_id) as col " +
"from cp.`employee.json` " +
"limit 0";
final String queryLast = "select first_value(cast(position_id as integer)) over(order by position_id) as col " +
"from cp.`employee.json` " +
"limit 0";
final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.INT)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = Lists.newArrayList();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(queryFirst)
.schemaBaseLine(expectedSchema)
.build()
.run();
testBuilder()
.sqlQuery(queryLast)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test // DRILL-4529
public void testWindowSumConstant() throws Exception {
final String query = "select sum(1) over w as col " +
"from cp.`tpch/region.parquet` " +
"window w as (partition by r_regionkey)";
final String[] expectedPlan = {"\\$SUM0"};
final String[] excludedPlan = {};
PlanTestBase.testPlanMatchingPatterns(query, expectedPlan, excludedPlan);
}
@Test // DRILL-4525
public void testBetweenDateAndTimeStamp() throws Exception {
final String query = "select count(*) as col \n" +
"from cp.`employee.json` \n" +
"where cast(birth_date as DATE) BETWEEN cast('1970-01-01' AS DATE) AND (cast('1999-01-01' AS DATE) + INTERVAL '60' day) \n" +
"limit 0";
final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.BIGINT)
.setMode(TypeProtos.DataMode.REQUIRED)
.build();
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = new ArrayList<>();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
@Test // DRILL-4525
public void testBetweenDecimalAndDouble() throws Exception {
final String query = "select cast(r_regionkey as Integer) as col \n" +
"from cp.`tpch/region.parquet` \n" +
"where cast(r_regionkey as double) BETWEEN 1.1 AND 4.5 \n" +
"limit 0";
final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder()
.setMinorType(TypeProtos.MinorType.INT)
.setMode(TypeProtos.DataMode.OPTIONAL)
.build();
final List<Pair<SchemaPath, TypeProtos.MajorType>> expectedSchema = new ArrayList<>();
expectedSchema.add(Pair.of(SchemaPath.getSimplePath("col"), majorType));
testBuilder()
.sqlQuery(query)
.schemaBaseLine(expectedSchema)
.build()
.run();
}
}