1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Copyright Materialize, Inc. and contributors. All rights reserved.
//
// Use of this software is governed by the Business Source License
// included in the LICENSE file.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0.

use chrono::{NaiveTime, Timelike};

use repr::adt::interval::Interval;
use repr::strconv;

use crate::EvalError;

sqlfunc!(
    #[sqlname = "timetostr"]
    #[preserves_uniqueness = true]
    fn cast_time_to_string(a: NaiveTime) -> String {
        let mut buf = String::new();
        strconv::format_time(&mut buf, a);
        buf
    }
);

sqlfunc!(
    #[sqlname = "timetoiv"]
    #[preserves_uniqueness = true]
    fn cast_time_to_interval<'a>(t: NaiveTime) -> Result<Interval, EvalError> {
        Interval::new(
            0,
            t.num_seconds_from_midnight() as i64,
            t.nanosecond() as i64,
        )
        .map_err(|_| EvalError::IntervalOutOfRange)
    }
);