Skip to content

Commit

Permalink
test(regress): enable time (#8363)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangjinwu authored Mar 6, 2023
1 parent 4191d91 commit 03c49d9
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 54 deletions.
11 changes: 9 additions & 2 deletions src/expr/src/expr/expr_binary_nonnull.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

use risingwave_common::array::{
Array, BoolArray, DecimalArray, F64Array, I32Array, I64Array, IntervalArray, JsonbArrayBuilder,
ListArray, NaiveDateArray, NaiveDateTimeArray, StructArray, Utf8Array, Utf8ArrayBuilder,
ListArray, NaiveDateArray, NaiveDateTimeArray, NaiveTimeArray, StructArray, Utf8Array,
Utf8ArrayBuilder,
};
use risingwave_common::types::*;
use risingwave_pb::expr::expr_node::Type;
Expand All @@ -31,7 +32,7 @@ use crate::vector_op::bitwise_op::*;
use crate::vector_op::cmp::*;
use crate::vector_op::date_trunc::{date_trunc_interval, date_trunc_timestamp};
use crate::vector_op::extract::{
extract_from_date, extract_from_timestamp, extract_from_timestamptz,
extract_from_date, extract_from_time, extract_from_timestamp, extract_from_timestamptz,
};
use crate::vector_op::like::like_default;
use crate::vector_op::position::position;
Expand Down Expand Up @@ -382,6 +383,12 @@ fn build_extract_expr(
>::new(
l, r, ret, extract_from_timestamptz
)),
DataType::Time => Box::new(BinaryExpression::<
Utf8Array,
NaiveTimeArray,
DecimalArray,
_,
>::new(l, r, ret, extract_from_time)),
_ => {
return Err(ExprError::UnsupportedFunction(format!(
"Extract ( {:?} ) is not supported yet!",
Expand Down
6 changes: 5 additions & 1 deletion src/expr/src/vector_op/extract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// limitations under the License.

use chrono::{Datelike, Timelike};
use risingwave_common::types::{Decimal, NaiveDateTimeWrapper, NaiveDateWrapper};
use risingwave_common::types::{Decimal, NaiveDateTimeWrapper, NaiveDateWrapper, NaiveTimeWrapper};

use crate::{bail, Result};

Expand Down Expand Up @@ -68,6 +68,10 @@ pub fn extract_from_timestamptz(time_unit: &str, usecs: i64) -> Result<Decimal>
}
}

pub fn extract_from_time(time_unit: &str, time: NaiveTimeWrapper) -> Result<Decimal> {
extract_time(time.0, time_unit)
}

#[cfg(test)]
mod tests {
use chrono::{NaiveDate, NaiveDateTime};
Expand Down
62 changes: 34 additions & 28 deletions src/tests/regress/data/expected/time.out
Original file line number Diff line number Diff line change
@@ -1,34 +1,39 @@
--
-- TIME
--
CREATE TABLE TIME_TBL (f1 time(2));
CREATE TABLE TIME_TBL (f1 time);
INSERT INTO TIME_TBL VALUES ('00:00');
INSERT INTO TIME_TBL VALUES ('01:00');
-- as of 7.4, timezone spec should be accepted and ignored
INSERT INTO TIME_TBL VALUES ('02:03 PST');
INSERT INTO TIME_TBL VALUES ('11:59 EDT');
-- INSERT INTO TIME_TBL VALUES ('02:03 PST');
-- INSERT INTO TIME_TBL VALUES ('11:59 EDT');
INSERT INTO TIME_TBL VALUES ('02:03');
INSERT INTO TIME_TBL VALUES ('11:59');
INSERT INTO TIME_TBL VALUES ('12:00');
INSERT INTO TIME_TBL VALUES ('12:01');
INSERT INTO TIME_TBL VALUES ('23:59');
INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM');
INSERT INTO TIME_TBL VALUES ('2003-03-07 15:36:39 America/New_York');
INSERT INTO TIME_TBL VALUES ('2003-07-07 15:36:39 America/New_York');
-- INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM');
INSERT INTO TIME_TBL VALUES ('23:59:59.993');
-- INSERT INTO TIME_TBL VALUES ('2003-03-07 15:36:39 America/New_York');
-- INSERT INTO TIME_TBL VALUES ('2003-07-07 15:36:39 America/New_York');
INSERT INTO TIME_TBL VALUES ('15:36:39');
INSERT INTO TIME_TBL VALUES ('15:36:39');
-- this should fail (the timezone offset is not known)
INSERT INTO TIME_TBL VALUES ('15:36:39 America/New_York');
ERROR: invalid input syntax for type time: "15:36:39 America/New_York"
LINE 1: INSERT INTO TIME_TBL VALUES ('15:36:39 America/New_York');
^
SELECT f1 AS "Time" FROM TIME_TBL;
Time
-------------
Time
--------------
00:00:00
01:00:00
02:03:00
11:59:00
12:00:00
12:01:00
23:59:00
23:59:59.99
23:59:59.993
15:36:39
15:36:39
(10 rows)
Expand All @@ -42,13 +47,13 @@ SELECT f1 AS "Three" FROM TIME_TBL WHERE f1 < '05:06:07';
(3 rows)

SELECT f1 AS "Five" FROM TIME_TBL WHERE f1 > '05:06:07';
Five
-------------
Five
--------------
11:59:00
12:00:00
12:01:00
23:59:00
23:59:59.99
23:59:59.993
15:36:39
15:36:39
(7 rows)
Expand All @@ -59,16 +64,16 @@ SELECT f1 AS "None" FROM TIME_TBL WHERE f1 < '00:00';
(0 rows)

SELECT f1 AS "Eight" FROM TIME_TBL WHERE f1 >= '00:00';
Eight
-------------
Eight
--------------
00:00:00
01:00:00
02:03:00
11:59:00
12:00:00
12:01:00
23:59:00
23:59:59.99
23:59:59.993
15:36:39
15:36:39
(10 rows)
Expand Down Expand Up @@ -127,72 +132,73 @@ ERROR: operator is not unique: time without time zone + time without time zone
LINE 1: SELECT f1 + time '00:01' AS "Illegal" FROM TIME_TBL;
^
HINT: Could not choose a best candidate operator. You might need to add explicit type casts.
DROP TABLE TIME_TBL;
--
-- test EXTRACT
--
SELECT EXTRACT(MICROSECOND FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(MICROSECOND FROM TIME '13:30:25.575401');
extract
----------
25575401
(1 row)

SELECT EXTRACT(MILLISECOND FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(MILLISECOND FROM TIME '13:30:25.575401');
extract
-----------
25575.401
(1 row)

SELECT EXTRACT(SECOND FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(SECOND FROM TIME '13:30:25.575401');
extract
-----------
25.575401
(1 row)

SELECT EXTRACT(MINUTE FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(MINUTE FROM TIME '13:30:25.575401');
extract
---------
30
(1 row)

SELECT EXTRACT(HOUR FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(HOUR FROM TIME '13:30:25.575401');
extract
---------
13
(1 row)

SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error
SELECT EXTRACT(DAY FROM TIME '13:30:25.575401'); -- error
ERROR: "time" units "day" not recognized
SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error
SELECT EXTRACT(FORTNIGHT FROM TIME '13:30:25.575401'); -- error
ERROR: "time" units "fortnight" not recognized
SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error
SELECT EXTRACT(TIMEZONE FROM TIME '13:30:25.575401'); -- error
ERROR: "time" units "timezone" not recognized
SELECT EXTRACT(EPOCH FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(EPOCH FROM TIME '13:30:25.575401');
extract
--------------
48625.575401
(1 row)

-- date_part implementation is mostly the same as extract, so only
-- test a few cases for additional coverage.
SELECT date_part('microsecond', TIME '2020-05-26 13:30:25.575401');
SELECT date_part('microsecond', TIME '13:30:25.575401');
date_part
-----------
25575401
(1 row)

SELECT date_part('millisecond', TIME '2020-05-26 13:30:25.575401');
SELECT date_part('millisecond', TIME '13:30:25.575401');
date_part
-----------
25575.401
(1 row)

SELECT date_part('second', TIME '2020-05-26 13:30:25.575401');
SELECT date_part('second', TIME '13:30:25.575401');
date_part
-----------
25.575401
(1 row)

SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401');
SELECT date_part('epoch', TIME '13:30:25.575401');
date_part
--------------
48625.575401
Expand Down
2 changes: 1 addition & 1 deletion src/tests/regress/data/schedule
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
# test: tablespace

test: boolean varchar int2 int4 int8 float4 float8 comments
test: date
test: date time
test: jsonb
51 changes: 29 additions & 22 deletions src/tests/regress/data/sql/time.sql
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,25 @@
-- TIME
--

CREATE TABLE TIME_TBL (f1 time(2));
CREATE TABLE TIME_TBL (f1 time);

INSERT INTO TIME_TBL VALUES ('00:00');
INSERT INTO TIME_TBL VALUES ('01:00');
-- as of 7.4, timezone spec should be accepted and ignored
INSERT INTO TIME_TBL VALUES ('02:03 PST');
INSERT INTO TIME_TBL VALUES ('11:59 EDT');
-- INSERT INTO TIME_TBL VALUES ('02:03 PST');
-- INSERT INTO TIME_TBL VALUES ('11:59 EDT');
INSERT INTO TIME_TBL VALUES ('02:03');
INSERT INTO TIME_TBL VALUES ('11:59');
INSERT INTO TIME_TBL VALUES ('12:00');
INSERT INTO TIME_TBL VALUES ('12:01');
INSERT INTO TIME_TBL VALUES ('23:59');
INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM');
-- INSERT INTO TIME_TBL VALUES ('11:59:59.99 PM');
INSERT INTO TIME_TBL VALUES ('23:59:59.993');

INSERT INTO TIME_TBL VALUES ('2003-03-07 15:36:39 America/New_York');
INSERT INTO TIME_TBL VALUES ('2003-07-07 15:36:39 America/New_York');
-- INSERT INTO TIME_TBL VALUES ('2003-03-07 15:36:39 America/New_York');
-- INSERT INTO TIME_TBL VALUES ('2003-07-07 15:36:39 America/New_York');
INSERT INTO TIME_TBL VALUES ('15:36:39');
INSERT INTO TIME_TBL VALUES ('15:36:39');
-- this should fail (the timezone offset is not known)
INSERT INTO TIME_TBL VALUES ('15:36:39 America/New_York');

Expand All @@ -32,9 +37,9 @@ SELECT f1 AS "Eight" FROM TIME_TBL WHERE f1 >= '00:00';

-- Check edge cases
SELECT '23:59:59.999999'::time;
SELECT '23:59:59.9999999'::time; -- rounds up
SELECT '23:59:60'::time; -- rounds up
SELECT '24:00:00'::time; -- allowed
--@ SELECT '23:59:59.9999999'::time; -- rounds up
--@ SELECT '23:59:60'::time; -- rounds up
--@ SELECT '24:00:00'::time; -- allowed
SELECT '24:00:00.01'::time; -- not allowed
SELECT '23:59:60.01'::time; -- not allowed
SELECT '24:01:00'::time; -- not allowed
Expand All @@ -51,22 +56,24 @@ SELECT '25:00:00'::time; -- not allowed

SELECT f1 + time '00:01' AS "Illegal" FROM TIME_TBL;

DROP TABLE TIME_TBL;

--
-- test EXTRACT
--
SELECT EXTRACT(MICROSECOND FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(MILLISECOND FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(SECOND FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(MINUTE FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(HOUR FROM TIME '2020-05-26 13:30:25.575401');
SELECT EXTRACT(DAY FROM TIME '2020-05-26 13:30:25.575401'); -- error
SELECT EXTRACT(FORTNIGHT FROM TIME '2020-05-26 13:30:25.575401'); -- error
SELECT EXTRACT(TIMEZONE FROM TIME '2020-05-26 13:30:25.575401'); -- error
SELECT EXTRACT(EPOCH FROM TIME '2020-05-26 13:30:25.575401');
--@ SELECT EXTRACT(MICROSECOND FROM TIME '13:30:25.575401');
--@ SELECT EXTRACT(MILLISECOND FROM TIME '13:30:25.575401');
--@ SELECT EXTRACT(SECOND FROM TIME '13:30:25.575401');
SELECT EXTRACT(MINUTE FROM TIME '13:30:25.575401');
SELECT EXTRACT(HOUR FROM TIME '13:30:25.575401');
SELECT EXTRACT(DAY FROM TIME '13:30:25.575401'); -- error
SELECT EXTRACT(FORTNIGHT FROM TIME '13:30:25.575401'); -- error
SELECT EXTRACT(TIMEZONE FROM TIME '13:30:25.575401'); -- error
--@ SELECT EXTRACT(EPOCH FROM TIME '13:30:25.575401');

-- date_part implementation is mostly the same as extract, so only
-- test a few cases for additional coverage.
SELECT date_part('microsecond', TIME '2020-05-26 13:30:25.575401');
SELECT date_part('millisecond', TIME '2020-05-26 13:30:25.575401');
SELECT date_part('second', TIME '2020-05-26 13:30:25.575401');
SELECT date_part('epoch', TIME '2020-05-26 13:30:25.575401');
--@ SELECT date_part('microsecond', TIME '13:30:25.575401');
--@ SELECT date_part('millisecond', TIME '13:30:25.575401');
--@ SELECT date_part('second', TIME '13:30:25.575401');
--@ SELECT date_part('epoch', TIME '13:30:25.575401');

0 comments on commit 03c49d9

Please sign in to comment.