parent
eca8cd8d1d
commit
8902fc0a70
5 changed files with 65 additions and 20 deletions
|
@ -37,7 +37,7 @@ impl From<DateTime<Utc>> for Datetime {
|
||||||
|
|
||||||
impl From<&str> for Datetime {
|
impl From<&str> for Datetime {
|
||||||
fn from(s: &str) -> Self {
|
fn from(s: &str) -> Self {
|
||||||
match datetime_raw(s) {
|
match datetime_all_raw(s) {
|
||||||
Ok((_, v)) => v,
|
Ok((_, v)) => v,
|
||||||
Err(_) => Self::default(),
|
Err(_) => Self::default(),
|
||||||
}
|
}
|
||||||
|
@ -87,14 +87,23 @@ impl ops::Sub<Self> for Datetime {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn datetime(i: &str) -> IResult<&str, Datetime> {
|
pub fn datetime(i: &str) -> IResult<&str, Datetime> {
|
||||||
alt((
|
alt((datetime_single, datetime_double))(i)
|
||||||
delimited(char('\''), datetime_raw, char('\'')),
|
}
|
||||||
delimited(char('\"'), datetime_raw, char('\"')),
|
|
||||||
))(i)
|
fn datetime_single(i: &str) -> IResult<&str, Datetime> {
|
||||||
|
delimited(char('\''), datetime_raw, char('\''))(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn datetime_double(i: &str) -> IResult<&str, Datetime> {
|
||||||
|
delimited(char('\"'), datetime_raw, char('\"'))(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn datetime_all_raw(i: &str) -> IResult<&str, Datetime> {
|
||||||
|
alt((nano, time, date))(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn datetime_raw(i: &str) -> IResult<&str, Datetime> {
|
fn datetime_raw(i: &str) -> IResult<&str, Datetime> {
|
||||||
alt((nano, time, date))(i)
|
alt((nano, time))(i)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn date(i: &str) -> IResult<&str, Datetime> {
|
fn date(i: &str) -> IResult<&str, Datetime> {
|
||||||
|
@ -247,15 +256,6 @@ mod tests {
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn date() {
|
|
||||||
let sql = "2012-04-23";
|
|
||||||
let res = datetime_raw(sql);
|
|
||||||
assert!(res.is_ok());
|
|
||||||
let out = res.unwrap().1;
|
|
||||||
assert_eq!("\"2012-04-23T00:00:00Z\"", format!("{}", out));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn date_time() {
|
fn date_time() {
|
||||||
let sql = "2012-04-23T18:25:43Z";
|
let sql = "2012-04-23T18:25:43Z";
|
||||||
|
|
|
@ -134,7 +134,7 @@ mod tests {
|
||||||
AND ages CONTAINS 18
|
AND ages CONTAINS 18
|
||||||
AND if IS true
|
AND if IS true
|
||||||
SPLIT test.things
|
SPLIT test.things
|
||||||
VERSION '2019-01-01'
|
VERSION '2019-01-01T08:00:00Z'
|
||||||
TIMEOUT 2w;
|
TIMEOUT 2w;
|
||||||
|
|
||||||
CREATE person SET name = 'Tobie', age += 18;
|
CREATE person SET name = 'Tobie', age += 18;
|
||||||
|
|
|
@ -28,11 +28,11 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn version_statement() {
|
fn version_statement() {
|
||||||
let sql = "VERSION '2020-01-01'";
|
let sql = "VERSION '2020-01-01T00:00:00Z'";
|
||||||
let res = version(sql);
|
let res = version(sql);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let out = res.unwrap().1;
|
let out = res.unwrap().1;
|
||||||
assert_eq!(out, Version(Datetime::from("2020-01-01")));
|
assert_eq!(out, Version(Datetime::from("2020-01-01T00:00:00Z")));
|
||||||
assert_eq!("VERSION \"2020-01-01T00:00:00Z\"", format!("{}", out));
|
assert_eq!("VERSION \"2020-01-01T00:00:00Z\"", format!("{}", out));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
45
lib/tests/datetimes.rs
Normal file
45
lib/tests/datetimes.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
mod parse;
|
||||||
|
use parse::Parse;
|
||||||
|
use surrealdb::sql::Value;
|
||||||
|
use surrealdb::Datastore;
|
||||||
|
use surrealdb::Error;
|
||||||
|
use surrealdb::Session;
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn datetimes_conversion() -> Result<(), Error> {
|
||||||
|
let sql = r#"
|
||||||
|
SELECT * FROM "2012-01-01";
|
||||||
|
SELECT * FROM <datetime> "2012-01-01";
|
||||||
|
SELECT * FROM <string> "2012-01-01T08:00:00Z" + "-test";
|
||||||
|
"#;
|
||||||
|
let dbs = Datastore::new("memory").await?;
|
||||||
|
let ses = Session::for_kv().with_ns("test").with_db("test");
|
||||||
|
let res = &mut dbs.execute(&sql, &ses, None, false).await?;
|
||||||
|
assert_eq!(res.len(), 3);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
'2012-01-01'
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
'2012-01-01T00:00:00Z'
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
'2012-01-01T08:00:00Z-test'
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
Ok(())
|
||||||
|
}
|
|
@ -9,8 +9,8 @@ use surrealdb::Session;
|
||||||
async fn future_function_simple() -> Result<(), Error> {
|
async fn future_function_simple() -> Result<(), Error> {
|
||||||
let sql = "
|
let sql = "
|
||||||
UPDATE person:test SET can_drive = <future> { birthday && time::now() > birthday + 18y };
|
UPDATE person:test SET can_drive = <future> { birthday && time::now() > birthday + 18y };
|
||||||
UPDATE person:test SET birthday = '2007-06-22';
|
UPDATE person:test SET birthday = <datetime> '2007-06-22';
|
||||||
UPDATE person:test SET birthday = '2001-06-22';
|
UPDATE person:test SET birthday = <datetime> '2001-06-22';
|
||||||
";
|
";
|
||||||
let dbs = Datastore::new("memory").await?;
|
let dbs = Datastore::new("memory").await?;
|
||||||
let ses = Session::for_kv().with_ns("test").with_db("test");
|
let ses = Session::for_kv().with_ns("test").with_db("test");
|
||||||
|
|
Loading…
Reference in a new issue