Ensure DELETE statements with UNIQUE INDEX work correctly

Closes 
This commit is contained in:
Tobie Morgan Hitchcock 2022-09-24 18:58:56 +01:00
parent 25926cba83
commit 4db61d89a2
2 changed files with 39 additions and 14 deletions
lib
src/sql/value
tests

View file

@ -11,7 +11,7 @@ impl Value {
_opt: &Options,
_txn: &Transaction,
) -> Result<(), Error> {
*self = Value::base();
*self = Value::None;
Ok(())
}
}
@ -24,19 +24,10 @@ mod tests {
use crate::sql::test::Parse;
#[tokio::test]
async fn clear_none() {
async fn clear_value() {
let (ctx, opt, txn) = mock().await;
let mut val = Value::parse("{ test: { other: null, something: 123 } }");
let res = Value::parse("{}");
val.clear(&ctx, &opt, &txn).await.unwrap();
assert_eq!(res, val);
}
#[tokio::test]
async fn clear_path() {
let (ctx, opt, txn) = mock().await;
let mut val = Value::parse("{ test: { other: null, something: 123 } }");
let res = Value::parse("{}");
let res = Value::None;
val.clear(&ctx, &opt, &txn).await.unwrap();
assert_eq!(res, val);
}

View file

@ -656,11 +656,13 @@ async fn define_statement_index_single_unique() -> Result<(), Error> {
INFO FOR TABLE user;
CREATE user:1 SET email = 'test@surrealdb.com';
CREATE user:2 SET email = 'test@surrealdb.com';
DELETE user:1;
CREATE user:2 SET email = 'test@surrealdb.com';
";
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(), 5);
assert_eq!(res.len(), 7);
//
let tmp = res.remove(0).result;
assert!(tmp.is_ok());
@ -689,6 +691,13 @@ async fn define_statement_index_single_unique() -> Result<(), Error> {
Some(e) if e.to_string() == r#"Database index `test` already contains "test@surrealdb.com", with record `user:2`"#
));
//
let tmp = res.remove(0).result;
assert!(tmp.is_ok());
//
let tmp = res.remove(0).result?;
let val = Value::parse("[{ id: user:2, email: 'test@surrealdb.com' }]");
assert_eq!(tmp, val);
//
Ok(())
}
@ -702,11 +711,16 @@ async fn define_statement_index_multiple_unique() -> Result<(), Error> {
CREATE user:2 SET account = 'tesla', email = 'test@surrealdb.com';
CREATE user:3 SET account = 'apple', email = 'test@surrealdb.com';
CREATE user:4 SET account = 'tesla', email = 'test@surrealdb.com';
DELETE user:1;
CREATE user:3 SET account = 'apple', email = 'test@surrealdb.com';
CREATE user:4 SET account = 'tesla', email = 'test@surrealdb.com';
DELETE user:2;
CREATE user:4 SET account = 'tesla', email = 'test@surrealdb.com';
";
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(), 7);
assert_eq!(res.len(), 12);
//
let tmp = res.remove(0).result;
assert!(tmp.is_ok());
@ -745,6 +759,26 @@ async fn define_statement_index_multiple_unique() -> Result<(), Error> {
Some(e) if e.to_string() == r#"Database index `test` already contains ["tesla", "test@surrealdb.com"], with record `user:4`"#
));
//
let tmp = res.remove(0).result;
assert!(tmp.is_ok());
//
let tmp = res.remove(0).result?;
let val = Value::parse("[{ id: user:3, account: 'apple', email: 'test@surrealdb.com' }]");
assert_eq!(tmp, val);
//
let tmp = res.remove(0).result;
assert!(matches!(
tmp.err(),
Some(e) if e.to_string() == r#"Database index `test` already contains ["tesla", "test@surrealdb.com"], with record `user:4`"#
));
//
let tmp = res.remove(0).result;
assert!(tmp.is_ok());
//
let tmp = res.remove(0).result?;
let val = Value::parse("[{ id: user:4, account: 'tesla', email: 'test@surrealdb.com' }]");
assert_eq!(tmp, val);
//
Ok(())
}