blob: fd43fa11bdc3aff59ae403099f259d1d783b0451 [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.exec.nested;
import org.apache.drill.categories.UnlikelyTest;
import org.apache.drill.test.BaseTestQuery;
import org.junit.Test;
import org.junit.experimental.categories.Category;
public class TestFastComplexSchema extends BaseTestQuery {
@Test
public void test() throws Exception {
test("SELECT r.r_name, \n" +
" t1.f \n" +
"FROM cp.`tpch/region.parquet` r \n" +
" JOIN (SELECT flatten(x) AS f \n" +
" FROM (SELECT Convert_from('[0, 1]', 'json') AS x \n" +
" FROM cp.`tpch/region.parquet`)) t1 \n" +
" ON t1.f = cast(r.r_regionkey as bigint)");
}
@Test
public void test2() throws Exception {
test("alter session set `planner.enable_hashjoin` = false");
test("alter session set `planner.slice_target` = 1");
try {
test("SELECT r.r_name, \n" +
" t1.f \n" +
"FROM cp.`tpch/region.parquet` r \n" +
" JOIN (SELECT Flatten(x) AS f \n" +
" FROM (SELECT Convert_from('[0, 1]', 'json') AS x \n" +
" FROM cp.`tpch/region.parquet`)) t1 \n" +
" ON t1.f = cast(r.r_regionkey as bigint) \n" +
"ORDER BY r.r_name");
} finally {
test("alter session reset `planner.enable_hashjoin`");
test("alter session reset `planner.slice_target`");
}
}
@Test
public void test3() throws Exception {
test("alter session set `planner.enable_hashjoin` = false");
test("alter session set `planner.slice_target` = 1");
try {
test("select f from\n" +
"(select convert_from(nation, 'json') as f from\n" +
"(select concat('{\"name\": \"', n.n_name, '\", ', '\"regionkey\": ', r.r_regionkey, '}') as nation\n" +
" from cp.`tpch/nation.parquet` n,\n" +
" cp.`tpch/region.parquet` r\n" +
" where \n" +
" n.n_regionkey = r.r_regionkey)) t\n" +
"order by t.f.name");
} finally {
test("alter session reset `planner.enable_hashjoin`");
test("alter session reset `planner.slice_target`");
}
}
@Test
public void test4() throws Exception {
test("alter session set `planner.enable_hashjoin` = false");
test("alter session set `planner.slice_target` = 1");
try {
test("SELECT f \n" +
"FROM (SELECT Convert_from(nation, 'json') AS f \n" +
" FROM (SELECT Concat('{\"name\": \"', n.n_name, '\", ', '\"regionkey\": ', \n" +
" r.r_regionkey, \n" +
" '}') AS \n" +
" nation \n" +
" FROM cp.`tpch/nation.parquet` n, \n" +
" cp.`tpch/region.parquet` r \n" +
" WHERE n.n_regionkey = r.r_regionkey \n" +
" AND r.r_regionkey = 4)) t \n" +
"ORDER BY t.f.name");
} finally {
test("alter session reset `planner.enable_hashjoin`");
test("alter session reset `planner.slice_target`");
}
}
@Test //DRILL-4783 when resultset is empty, don't throw exception.
@Category(UnlikelyTest.class)
public void test5() throws Exception {
// when there is no incoming record, flatten won't throw exception
testBuilder().sqlQuery("select flatten(j) from \n" +
" (select convert_from(names, 'json') j \n" +
" from (select concat('[\"', first_name, '\", ', '\"', last_name, '\"]') names \n" +
" from cp.`employee.json` where store_id=9999))")
.expectsEmptyResultSet()
.build().run();
// result is not empty and is list type,
testBuilder().sqlQuery("select flatten(j) n from \n" +
" (select convert_from(names, 'json') j \n" +
" from (select concat('[\"', first_name, '\", ', '\"', last_name, '\"]') names \n" +
" from cp.`employee.json` where first_name='Sheri'))")
.unOrdered()
.baselineColumns("n")
.baselineValues("Sheri")
.baselineValues("Nowmer")
.build().run();
// result is not empty, and flatten got incompatible (non-list) incoming records. got exception thrown
errorMsgTestHelper("select flatten(first_name) from \n" +
"(select first_name from cp.`employee.json` where first_name='Sheri')",
"Flatten does not support inputs of non-list values");
}
}