[Bug](date function) from_unixtime return wrong result (#11410)
* [Bug](date function) `from_unixtime` return wrong result
This commit is contained in:
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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} """
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user