[Bug](date function) from_unixtime return wrong result (#11410)

* [Bug](date function) `from_unixtime` return wrong result
This commit is contained in:
Gabriel
2022-08-02 14:23:54 +08:00
committed by GitHub
parent ac62c9507e
commit fcfc76f4a9
4 changed files with 88 additions and 52 deletions

View File

@ -105,7 +105,9 @@ public class RewriteFromUnixTimeRule implements ExprRewriteRule {
return expr;
}
// definition: from_unixtime(int, format)
if (params.exprs().size() != 1 && params.exprs().size() != 2) {
// TODO: from_unixtime(col, format) needs to be processed carefully, now only rewrite from_unixtime(col)
// to avoid wrong results.
if (params.exprs().size() != 1) {
return expr;
}
Expr paramSlot = params.exprs().get(0);

View File

@ -1662,57 +1662,6 @@ public class QueryPlanTest extends TestWithFeService {
String sql = "select * from test1 where from_unixtime(query_time) > '2021-03-02 10:01:28'";
String explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `query_time` <= 253402271999, `query_time` > 1614650488"));
//format yyyy-MM-dd HH:mm:ss or %Y-%m-%d %H:%i:%s
sql = "select * from test1 where from_unixtime(query_time, 'yyyy-MM-dd HH:mm:ss') > '2021-03-02 10:01:28'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `query_time` <= 253402271999, `query_time` > 1614650488"));
sql = "select * from test1 where from_unixtime(query_time, '%Y-%m-%d %H:%i:%s') > '2021-03-02 10:01:28'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `query_time` <= 253402271999, `query_time` > 1614650488"));
//format yyyy-MM-dd or %Y-%m-%d
sql = "select * from test1 where from_unixtime(query_time, 'yyyy-MM-dd') > '2021-03-02'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `query_time` <= 253402271999, `query_time` > 1614614400"));
sql = "select * from test1 where from_unixtime(query_time, '%Y-%m-%d') > '2021-03-02'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `query_time` <= 253402271999, `query_time` > 1614614400"));
// format yyyyMMdd or %Y%m%d
sql = "select * from test1 where from_unixtime(query_time, 'yyyyMMdd') > '20210302'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `query_time` <= 253402271999, `query_time` > 1614614400"));
sql = "select * from test1 where from_unixtime(query_time, '%Y%m%d') > '20210302'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `query_time` <= 253402271999, `query_time` > 1614614400"));
//format less than
sql = "select * from test1 where from_unixtime(query_time, 'yyyy-MM-dd') < '2021-03-02'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertTrue(explainString.contains("PREDICATES: `query_time` < 1614614400, `query_time` >= 0"));
// Do not support other format
//format yyyy-MM-dd HH:mm
sql = "select * from test1 where from_unixtime(query_time, 'yyyy-MM-dd HH:mm') > '2021-03-02 10:01'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertFalse(explainString.contains("PREDICATES: `query_time` <= 253402271999"));
//format yyyy-MM-dd HH
sql = "select * from test1 where from_unixtime(query_time, 'yyyy-MM-dd HH') > '2021-03-02 10'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertFalse(explainString.contains("PREDICATES: `query_time` <= 253402271999"));
//format yyyy-MM
sql = "select * from test1 where from_unixtime(query_time, 'yyyy-MM') > '2021-03'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertFalse(explainString.contains("PREDICATES: `query_time` <= 253402271999"));
//format yyyy
sql = "select * from test1 where from_unixtime(query_time, 'yyyy') > '2021'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertFalse(explainString.contains("PREDICATES: `query_time` <= 253402271999"));
// parse error
sql = "select * from test1 where from_unixtime(query_time, 'yyyyMMdd') > '2021-03-02 10:01:28'";
explainString = getSQLPlanOrErrorMsg("EXPLAIN " + sql);
Assert.assertFalse(explainString.contains("PREDICATES: `query_time` <= 253402271999"));
}
@Test

View File

@ -290,3 +290,54 @@ February
-- !sql --
200
-- !sql --
1 2022-08-01
2 2022-08-01
4 2022-08-01
-- !sql --
-- !sql --
3 2022-07-31
-- !sql --
1 2022-08-01
2 2022-08-01
4 2022-08-01
-- !sql --
1 2022-08-01
2 2022-08-01
3 2022-07-31
4 2022-08-01
-- !sql --
1 2022-08-01
2 2022-08-01
4 2022-08-01
-- !sql --
2 2022-08-01 00:00:00
-- !sql --
1 2022-08-01 17:00:31
4 2022-08-01 00:00:01
-- !sql --
3 2022-07-31 23:59:59
-- !sql --
1 2022-08-01 17:00:31
2 2022-08-01 00:00:00
4 2022-08-01 00:00:01
-- !sql --
2 2022-08-01 00:00:00
3 2022-07-31 23:59:59
-- !sql --
2 2022-08-01 00:00:00
-- !sql --
1 2022-08-01 17:00:31

View File

@ -253,4 +253,38 @@ suite("test_date_function", "query") {
qt_sql """ select count(*) from (select * from numbers("200")) tmp1 WHERE 0 <= UNIX_TIMESTAMP(); """
sql """ drop table ${tableName} """
tableName = "test_from_unixtime"
sql """ DROP TABLE IF EXISTS ${tableName} """
sql """
CREATE TABLE IF NOT EXISTS ${tableName} (
`id` INT NOT NULL COMMENT "用户id",
`update_time` INT NOT NULL COMMENT "数据灌入日期时间"
) ENGINE=OLAP
UNIQUE KEY(`id`)
DISTRIBUTED BY HASH(`id`)
PROPERTIES("replication_num" = "1");
"""
sql """ insert into ${tableName} values (1, 1659344431) """
sql """ insert into ${tableName} values (2, 1659283200) """
sql """ insert into ${tableName} values (3, 1659283199) """
sql """ insert into ${tableName} values (4, 1659283201) """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") = '2022-08-01' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") > '2022-08-01' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") < '2022-08-01' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") >= '2022-08-01' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") <= '2022-08-01' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d") LIKE '2022-08-01' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") = '2022-08-01 00:00:00' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") > '2022-08-01 00:00:00' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") < '2022-08-01 00:00:00' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") >= '2022-08-01 00:00:00' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") <= '2022-08-01 00:00:00' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") LIKE '2022-08-01 00:00:00' ORDER BY id; """
qt_sql """ SELECT id,FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") FROM ${tableName} WHERE FROM_UNIXTIME(update_time,"%Y-%m-%d %H:%i:%s") = '2022-08-01 17:00:31' ORDER BY id; """
sql """ drop table ${tableName} """
}