blob: 977fd4b5c5fcaea8a7a6624abbac9f2455f1b12b [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.fn.impl;
import org.apache.drill.test.ClusterFixture;
import org.apache.drill.test.ClusterFixtureBuilder;
import org.apache.drill.test.ClusterTest;
import org.junit.BeforeClass;
import org.junit.Test;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestTimestampAddDiffFunctions extends ClusterTest {
private final List<String> QUALIFIERS = Arrays.asList(
"MILLISECOND",
"MICROSECOND",
"NANOSECOND",
"SECOND",
"MINUTE",
"HOUR",
"DAY",
"WEEK",
"MONTH",
"QUARTER",
"YEAR");
@BeforeClass
public static void setup() throws Exception {
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher);
startCluster(builder);
}
@Test // DRILL-3610
public void testTimestampAddDiffLiteralTypeInference() throws Exception {
Map<String, String> dateTypes = new HashMap<>();
dateTypes.put("DATE", "2013-03-31");
dateTypes.put("TIME", "00:02:03.123");
dateTypes.put("TIMESTAMP", "2013-03-31 00:02:03");
for (String qualifier : QUALIFIERS) {
for (Map.Entry<String, String> typeResultPair : dateTypes.entrySet()) {
String dateTimeLiteral = typeResultPair.getValue();
String type = typeResultPair.getKey();
run("SELECT TIMESTAMPADD(%s, 0, CAST('%s' AS %s)) col1", qualifier, dateTimeLiteral, type);
// TIMESTAMPDIFF with args of different types
for (Map.Entry<String, String> secondArg : dateTypes.entrySet()) {
run("SELECT TIMESTAMPDIFF(%s, CAST('%s' AS %s), CAST('%s' AS %s)) col1",
qualifier, dateTimeLiteral, type, secondArg.getValue(), secondArg.getKey());
}
}
}
}
@Test // DRILL-3610
public void testTimestampAddDiffTypeInference() throws Exception {
for (String qualifier : QUALIFIERS) {
run("SELECT TIMESTAMPADD(%1$s, 0, `date`) col1," +
"TIMESTAMPADD(%1$s, 0, `time`) timeReq," +
"TIMESTAMPADD(%1$s, 0, `timestamp`) timestampReq," +
"TIMESTAMPADD(%1$s, 0, t.time_map.`date`) dateOpt," +
"TIMESTAMPADD(%1$s, 0, t.time_map.`time`) timeOpt," +
"TIMESTAMPADD(%1$s, 0, t.time_map.`timestamp`) timestampOpt\n" +
"FROM cp.`datetime.parquet` t", qualifier);
run("SELECT TIMESTAMPDIFF(%1$s, `date`, `date`) col1," +
"TIMESTAMPDIFF(%1$s, `time`, `time`) timeReq," +
"TIMESTAMPDIFF(%1$s, `timestamp`, `timestamp`) timestampReq," +
"TIMESTAMPDIFF(%1$s, `timestamp`, t.time_map.`date`) timestampReqTimestampOpt," +
"TIMESTAMPDIFF(%1$s, `timestamp`, t.time_map.`timestamp`) timestampReqTimestampOpt," +
"TIMESTAMPDIFF(%1$s, `date`, `time`) timeDate," +
"TIMESTAMPDIFF(%1$s, `time`, `date`) Datetime," +
"TIMESTAMPDIFF(%1$s, t.time_map.`date`, t.time_map.`date`) dateOpt," +
"TIMESTAMPDIFF(%1$s, t.time_map.`time`, t.time_map.`time`) timeOpt," +
"TIMESTAMPDIFF(%1$s, t.time_map.`timestamp`, t.time_map.`timestamp`) timestampOpt\n" +
"FROM cp.`datetime.parquet` t", qualifier);
}
}
@Test // DRILL-3610
public void testTimestampAddParquet() throws Exception {
String query =
"SELECT TIMESTAMPADD(SECOND, 1, `date`) dateReq," +
"TIMESTAMPADD(QUARTER, 1, `time`) timeReq," +
"TIMESTAMPADD(DAY, 1, `timestamp`) timestampReq," +
"TIMESTAMPADD(MONTH, 1, t.time_map.`date`) dateOpt," +
"TIMESTAMPADD(HOUR, 1, t.time_map.`time`) timeOpt," +
"TIMESTAMPADD(YEAR, 1, t.time_map.`timestamp`) timestampOpt\n" +
"FROM cp.`datetime.parquet` t";
testBuilder()
.sqlQuery(query)
.unOrdered()
.baselineColumns("dateReq", "timeReq", "timestampReq", "dateOpt", "timeOpt", "timestampOpt")
.baselineValues(
LocalDateTime.parse("1970-01-11T00:00:01"), LocalTime.parse("00:00:03.600"), LocalDateTime.parse("2018-03-24T17:40:52.123"),
LocalDateTime.parse("1970-02-11T00:00"), LocalTime.parse("01:00:03.600"), LocalDateTime.parse("2019-03-23T17:40:52.123"))
.go();
}
@Test // DRILL-3610
public void testTimestampDiffParquet() throws Exception {
String query =
"SELECT TIMESTAMPDIFF(SECOND, DATE '1970-01-15', `date`) dateReq," +
"TIMESTAMPDIFF(QUARTER, TIME '12:00:03.600', `time`) timeReq," +
"TIMESTAMPDIFF(DAY, TIMESTAMP '2018-03-24 17:40:52.123', `timestamp`) timestampReq," +
"TIMESTAMPDIFF(MONTH, DATE '1971-10-30', t.time_map.`date`) dateOpt," +
"TIMESTAMPDIFF(HOUR, TIME '18:00:03.600', t.time_map.`time`) timeOpt," +
"TIMESTAMPDIFF(YEAR, TIMESTAMP '2020-03-24 17:40:52.123', t.time_map.`timestamp`) timestampOpt\n" +
"FROM cp.`datetime.parquet` t";
testBuilder()
.sqlQuery(query)
.unOrdered()
.baselineColumns("dateReq", "timeReq", "timestampReq", "dateOpt", "timeOpt", "timestampOpt")
.baselineValues(-345600L, 0L, -1L, -21L, -18L, -2L)
.go();
}
@Test // DRILL-3610
public void testTimestampAddDiffNull() throws Exception {
String query =
"SELECT TIMESTAMPDIFF(SECOND, DATE '1970-01-15', a) col1," +
"TIMESTAMPDIFF(QUARTER, a, DATE '1970-01-15') col2," +
"TIMESTAMPDIFF(DAY, a, a) col3," +
"TIMESTAMPADD(MONTH, 1, a) col4," +
"TIMESTAMPADD(MONTH, b, DATE '1970-01-15') col5," +
"TIMESTAMPADD(MONTH, b, a) col6\n" +
"FROM" +
"(SELECT CASE WHEN FALSE THEN TIME '12:00:03.600' ELSE null END AS a," +
"CASE WHEN FALSE THEN 2 ELSE null END AS b)";
testBuilder()
.sqlQuery(query)
.unOrdered()
.baselineColumns("col1", "col2", "col3", "col4", "col5", "col6")
.baselineValues(null, null, null, null, null, null)
.go();
}
@Test // DRILL-3610
public void testTimestampDiffTimeDateTransition() throws Exception {
String query =
"SELECT TIMESTAMPDIFF(SECOND, time '12:30:00.123', time '12:30:00') col1," +
"TIMESTAMPDIFF(DAY, TIMESTAMP '1970-01-15 15:30:00', TIMESTAMP '1970-01-16 12:30:00') col2," +
"TIMESTAMPDIFF(DAY, TIMESTAMP '1970-01-16 12:30:00', TIMESTAMP '1970-01-15 15:30:00') col3," +
"TIMESTAMPDIFF(MONTH, TIMESTAMP '1970-01-16 12:30:00', TIMESTAMP '1970-03-15 15:30:00') col4," +
"TIMESTAMPDIFF(MONTH, TIMESTAMP '1970-03-15 15:30:00', TIMESTAMP '1970-01-16 12:30:00') col5," +
"TIMESTAMPDIFF(DAY, DATE '2012-01-01', DATE '2013-01-01') col6," +
"TIMESTAMPDIFF(DAY, DATE '2013-01-01', DATE '2014-01-01') col7";
testBuilder()
.sqlQuery(query)
.unOrdered()
.baselineColumns("col1", "col2", "col3", "col4", "col5", "col6", "col7")
.baselineValues(0L, 0L, 0L, 1L, -1L, 366L, 365L)
.go();
}
@Test // DRILL-6967
public void testTimestampDiffQuarter() throws Exception {
String query =
"SELECT TIMESTAMPDIFF(QUARTER, date '1996-03-09', date '1998-03-09') AS col1," +
"TIMESTAMPDIFF(QUARTER, date '2019-01-01', date '2019-01-17') AS col2," +
"TIMESTAMPDIFF(QUARTER, date '2019-01-01', date '2019-03-31') AS col3," +
"TIMESTAMPDIFF(QUARTER, date '2019-01-01', date '2019-04-01') AS col4," +
"TIMESTAMPDIFF(QUARTER, date '1970-01-01', date '2019-01-11') AS col5";
testBuilder()
.sqlQuery(query)
.unOrdered()
.baselineColumns("col1", "col2", "col3", "col4", "col5")
.baselineValues(8L, 0L, 0L, 1L, 196L)
.go();
}
}