Skip to content

Commit 9da65be

Browse files
committed
0.3.6
Timestamp Casting
1 parent ad26eab commit 9da65be

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

Diff for: Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "multisql"
3-
version = "0.3.5"
3+
version = "0.3.6"
44
authors = ["Kyran Gostelow <kyran@gostelow.me>", "Taehoon Moon <taehoon.moon@outlook.com>"]
55
edition = "2021"
66
description = "MultiSQL"

Diff for: src/data/value/cast.rs

+4
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ impl CastWithRules<NaiveDateTime> for Value {
246246
const TRY_RULES_TIME: [i64; 2] = [100, 101];
247247

248248
match rule {
249+
Value::Null => try_rules(&self, &TRY_RULES_TIMESTAMP)
250+
.or_else(|_| try_rules(&self, &TRY_RULES_DATETIME))
251+
.or_else(|_| try_rules(&self, &TRY_RULES_DATE))
252+
.or_else(|_| try_rules(&self, &TRY_RULES_TIME)),
249253
Value::Bool(true) => try_rules(&self, &TRY_RULES_TIMESTAMP),
250254
Value::Str(custom) => match custom.as_str() {
251255
"TIMESTAMP" => try_rules(&self, &TRY_RULES_TIMESTAMP),

Diff for: src/data/value/value_type/cast.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use {
2-
crate::{Cast, Result, Value, ValueError, ValueType},
2+
crate::{Cast, CastWithRules, Result, Value, ValueError, ValueType},
3+
chrono::NaiveDateTime,
34
std::string::ToString,
45
};
56

@@ -17,6 +18,11 @@ impl Value {
1718
(ValueType::I64, value) => value.clone().cast().map(Value::I64),
1819
(ValueType::F64, value) => value.clone().cast().map(Value::F64),
1920
(ValueType::Str, value) => value.clone().cast().map(Value::Str),
21+
(ValueType::Timestamp, value) => {
22+
let datetime: NaiveDateTime = value.clone().cast_with_rule(Value::Null)?;
23+
let timestamp = datetime.timestamp();
24+
Ok(Value::Timestamp(timestamp))
25+
}
2026

2127
_ => Err(ValueError::UnimplementedCast.into()),
2228
}

Diff for: tests/functionality/query/function/convert_timestamp.rs

+16-3
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,18 @@ crate::util_macros::testcase!(
1717
"VALUES (CONVERT('TIMESTAMP', '2001-02-03', 'DATE'))" => unnamed_0 = I64:
1818
(981158400)
1919
);
20-
crate::util_macros::assert_error!(glue, "VALUES (CONVERT('TIMESTAMP', '2001-02-03', 'DATETIME'))");
20+
crate::util_macros::assert_error!(
21+
glue,
22+
"VALUES (CONVERT('TIMESTAMP', '2001-02-03', 'DATETIME'))"
23+
);
2124
crate::util_macros::assert_select!(glue,
2225
"VALUES (CONVERT('TIMESTAMP', '2001-02-03 04:05', 'DATETIME'))" => unnamed_0 = I64:
2326
(981173100)
2427
);
25-
crate::util_macros::assert_error!(glue, "VALUES (CONVERT('TIMESTAMP', '2001-02-03', 'TIME'))");
28+
crate::util_macros::assert_error!(
29+
glue,
30+
"VALUES (CONVERT('TIMESTAMP', '2001-02-03', 'TIME'))"
31+
);
2632
crate::util_macros::assert_select!(glue,
2733
"VALUES (CONVERT('TIMESTAMP', '04:05', 'TIME'))" => unnamed_0 = I64:
2834
(14700)
@@ -45,7 +51,10 @@ crate::util_macros::testcase!(
4551
"VALUES (CONVERT('TIMESTAMP', '13/02/2001', 'DATE'))" => unnamed_0 = I64:
4652
(982022400)
4753
);
48-
crate::util_macros::assert_error!(glue, "VALUES (CONVERT('TIMESTAMP', '02/13/2001', 'DATE'))");
54+
crate::util_macros::assert_error!(
55+
glue,
56+
"VALUES (CONVERT('TIMESTAMP', '02/13/2001', 'DATE'))"
57+
);
4958
crate::util_macros::assert_select!(glue,
5059
"VALUES (CONVERT('TIMESTAMP', '03-Feb-2001', 'DATE'))" => unnamed_0 = I64:
5160
(981158400)
@@ -76,5 +85,9 @@ crate::util_macros::testcase!(
7685
"VALUES (CONVERT('TIMESTAMP', '03/02/2001 04:05', 60))" => unnamed_0 = I64:
7786
(981173100)
7887
);
88+
crate::util_macros::assert_select!(glue,
89+
"VALUES (CAST('03/02/2001 04:05' AS TIMESTAMP))" => unnamed_0 = Timestamp:
90+
(981173100)
91+
);
7992
})
8093
);

0 commit comments

Comments
 (0)