Fix panic on commit when defining db and tb in strict mode (#2684)
Co-authored-by: Yusuke Kuoka <yusuke.kuoka@surrealdb.com> Co-authored-by: Mees Delzenne <mees.delzenne@gmail.com>
This commit is contained in:
parent
bbc077fc0e
commit
5446666e7d
3 changed files with 34 additions and 36 deletions
|
@ -25,7 +25,6 @@ use channel::Receiver;
|
||||||
use channel::Sender;
|
use channel::Sender;
|
||||||
use futures::lock::Mutex;
|
use futures::lock::Mutex;
|
||||||
use futures::Future;
|
use futures::Future;
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
@ -728,7 +727,6 @@ impl Datastore {
|
||||||
inner,
|
inner,
|
||||||
cache: super::cache::Cache::default(),
|
cache: super::cache::Cache::default(),
|
||||||
cf: cf::Writer::new(),
|
cf: cf::Writer::new(),
|
||||||
write_buffer: HashMap::new(),
|
|
||||||
vso: self.versionstamp_oracle.clone(),
|
vso: self.versionstamp_oracle.clone(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,6 @@ use sql::statements::DefineTokenStatement;
|
||||||
use sql::statements::DefineUserStatement;
|
use sql::statements::DefineUserStatement;
|
||||||
use sql::statements::LiveStatement;
|
use sql::statements::LiveStatement;
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
@ -55,7 +54,6 @@ pub struct Transaction {
|
||||||
pub(super) inner: Inner,
|
pub(super) inner: Inner,
|
||||||
pub(super) cache: Cache,
|
pub(super) cache: Cache,
|
||||||
pub(super) cf: cf::Writer,
|
pub(super) cf: cf::Writer,
|
||||||
pub(super) write_buffer: HashMap<Key, ()>,
|
|
||||||
pub(super) vso: Arc<Mutex<Oracle>>,
|
pub(super) vso: Arc<Mutex<Oracle>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2485,9 +2483,9 @@ impl Transaction {
|
||||||
|
|
||||||
let id = seq.get_next_id();
|
let id = seq.get_next_id();
|
||||||
|
|
||||||
self.cache.set(key.clone(), Entry::Seq(seq));
|
self.cache.set(key.clone(), Entry::Seq(seq.clone()));
|
||||||
|
let (k, v) = seq.finish().unwrap();
|
||||||
self.write_buffer.insert(key.clone(), ());
|
self.set(k, v).await?;
|
||||||
|
|
||||||
Ok(id)
|
Ok(id)
|
||||||
}
|
}
|
||||||
|
@ -2500,9 +2498,9 @@ impl Transaction {
|
||||||
|
|
||||||
seq.remove_id(db);
|
seq.remove_id(db);
|
||||||
|
|
||||||
self.cache.set(key.clone(), Entry::Seq(seq));
|
self.cache.set(key.clone(), Entry::Seq(seq.clone()));
|
||||||
|
let (k, v) = seq.finish().unwrap();
|
||||||
self.write_buffer.insert(key.clone(), ());
|
self.set(k, v).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -2514,9 +2512,9 @@ impl Transaction {
|
||||||
|
|
||||||
let id = seq.get_next_id();
|
let id = seq.get_next_id();
|
||||||
|
|
||||||
self.cache.set(key.clone(), Entry::Seq(seq));
|
self.cache.set(key.clone(), Entry::Seq(seq.clone()));
|
||||||
|
let (k, v) = seq.finish().unwrap();
|
||||||
self.write_buffer.insert(key.clone(), ());
|
self.set(k, v).await?;
|
||||||
|
|
||||||
Ok(id)
|
Ok(id)
|
||||||
}
|
}
|
||||||
|
@ -2529,9 +2527,9 @@ impl Transaction {
|
||||||
|
|
||||||
seq.remove_id(tb);
|
seq.remove_id(tb);
|
||||||
|
|
||||||
self.cache.set(key.clone(), Entry::Seq(seq));
|
self.cache.set(key.clone(), Entry::Seq(seq.clone()));
|
||||||
|
let (k, v) = seq.finish().unwrap();
|
||||||
self.write_buffer.insert(key.clone(), ());
|
self.set(k, v).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -2556,9 +2554,9 @@ impl Transaction {
|
||||||
|
|
||||||
let id = seq.get_next_id();
|
let id = seq.get_next_id();
|
||||||
|
|
||||||
self.cache.set(key.clone(), Entry::Seq(seq));
|
self.cache.set(key.clone(), Entry::Seq(seq.clone()));
|
||||||
|
let (k, v) = seq.finish().unwrap();
|
||||||
self.write_buffer.insert(key.clone(), ());
|
self.set(k, v).await?;
|
||||||
|
|
||||||
Ok(id)
|
Ok(id)
|
||||||
}
|
}
|
||||||
|
@ -2571,9 +2569,9 @@ impl Transaction {
|
||||||
|
|
||||||
seq.remove_id(ns);
|
seq.remove_id(ns);
|
||||||
|
|
||||||
self.cache.set(key.clone(), Entry::Seq(seq));
|
self.cache.set(key.clone(), Entry::Seq(seq.clone()));
|
||||||
|
let (k, v) = seq.finish().unwrap();
|
||||||
self.write_buffer.insert(key.clone(), ());
|
self.set(k, v).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -2595,20 +2593,6 @@ impl Transaction {
|
||||||
// Lastly, you should set lock=true if you want the changefeed to be correctly ordered for
|
// Lastly, you should set lock=true if you want the changefeed to be correctly ordered for
|
||||||
// non-FDB backends.
|
// non-FDB backends.
|
||||||
pub(crate) async fn complete_changes(&mut self, _lock: bool) -> Result<(), Error> {
|
pub(crate) async fn complete_changes(&mut self, _lock: bool) -> Result<(), Error> {
|
||||||
let mut buf = self.write_buffer.clone();
|
|
||||||
let writes = buf.drain();
|
|
||||||
for (k, _) in writes {
|
|
||||||
let v = self.cache.get(&k).unwrap();
|
|
||||||
let mut seq = if let Entry::Seq(v) = v {
|
|
||||||
v
|
|
||||||
} else {
|
|
||||||
unreachable!();
|
|
||||||
};
|
|
||||||
if let Some((k, v)) = seq.finish() {
|
|
||||||
self.set(k, v).await?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let changes = self.cf.get();
|
let changes = self.cf.get();
|
||||||
for (tskey, prefix, suffix, v) in changes {
|
for (tskey, prefix, suffix, v) in changes {
|
||||||
self.set_versionstamped_key(tskey, prefix, suffix, v).await?
|
self.set_versionstamped_key(tskey, prefix, suffix, v).await?
|
||||||
|
|
|
@ -277,3 +277,19 @@ async fn loose_mode_all_ok() -> Result<(), Error> {
|
||||||
//
|
//
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn strict_define_in_transaction() -> Result<(), Error> {
|
||||||
|
let sql = r"
|
||||||
|
DEFINE NS test; DEFINE DB test;
|
||||||
|
USE NS test DB test;
|
||||||
|
BEGIN;
|
||||||
|
DEFINE TABLE test;
|
||||||
|
DEFINE FIELD test ON test; -- Panic used to be caused when you add this query within the transaction
|
||||||
|
COMMIT;
|
||||||
|
";
|
||||||
|
let dbs = new_ds().await?.with_strict_mode(true);
|
||||||
|
let ses = Session::owner().with_ns("test").with_db("test");
|
||||||
|
dbs.execute(sql, &ses, None).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue