/** * 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.fn.hive; import com.google.common.collect.Lists; import org.apache.commons.lang3.tuple.Pair; import org.apache.drill.QueryTestUtil; import org.apache.drill.TestBuilder; import org.apache.drill.common.expression.SchemaPath; import org.apache.drill.common.types.TypeProtos; import org.apache.drill.exec.compile.ClassTransformer; import org.apache.drill.exec.hive.HiveTestBase; import org.apache.drill.exec.server.options.OptionValue; import org.junit.Test; import java.util.List; public class TestInbuiltHiveUDFs extends HiveTestBase { @Test // DRILL-3273 public void testConcatWS() throws Exception { testBuilder() .sqlQuery("SELECT concat_ws(string_field, string_part, '|') as rst from hive.readtest") .unOrdered() .baselineColumns("rst") .baselineValues("stringstringfield|") .baselineValues(new Object[] { null }) .go(); } @Test // DRILL-3273 public void testEncode() throws Exception { testBuilder() .sqlQuery("SELECT encode(varchar_field, 'UTF-8') as rst from hive.readtest") .unOrdered() .baselineColumns("rst") .baselineValues("varcharfield".getBytes()) .baselineValues(new Object[] { null }) .go(); } @Test public void testXpath_Double() throws Exception { final String query = "select xpath_double ('<a><b>20</b><c>40</c></a>', 'a/b * a/c') as col \n" + "from hive.kv \n" + "limit 0"; final TypeProtos.MajorType majorType = TypeProtos.MajorType.newBuilder() .setMinorType(TypeProtos.MinorType.FLOAT8) .setMode(TypeProtos.DataMode.OPTIONAL) .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 // DRILL-4459 public void testGetJsonObject() throws Exception { testBuilder() .sqlQuery("select convert_from(json, 'json') as json from hive.simple_json " + "where GET_JSON_OBJECT(simple_json.json, '$.employee_id') like 'Emp2'") .ordered() .baselineColumns("json") .baselineValues(TestBuilder.mapOf("employee_id","Emp2","full_name","Kamesh", "first_name","Bh","last_name","Venkata","position","Store")) .go(); } @Test // DRILL-3272 public void testIf() throws Exception { testBuilder() .sqlQuery("select `if`(1999 > 2000, 'latest', 'old') Period from hive.kv limit 1") .ordered() .baselineColumns("Period") .baselineValues("old") .go(); } @Test // DRILL-4618 public void testRand() throws Exception { String query = "select 2*rand()=2*rand() col1 from (values (1))"; testBuilder() .sqlQuery(query) .unOrdered() .baselineColumns("col1") .baselineValues(false) .go(); } @Test //DRILL-4868 public void testEmbeddedHiveFunctionCall() throws Exception { // TODO(DRILL-2326) temporary until we fix the scalar replacement bug for this case final OptionValue srOption = QueryTestUtil.setupScalarReplacementOption(bits[0], ClassTransformer.ScalarReplacementOption.TRY); try { final String[] queries = { "SELECT convert_from(unhex(key2), 'INT_BE') as intkey \n" + "FROM cp.`functions/conv/conv.json`", }; for (String query: queries) { testBuilder() .sqlQuery(query) .ordered() .baselineColumns("intkey") .baselineValues(1244739896) .baselineValues(new Object[] { null }) .baselineValues(1313814865) .baselineValues(1852782897) .build() .run(); } } finally { // restore the system option QueryTestUtil.restoreScalarReplacementOption(bits[0], srOption); } } }