Ensure cancelled context does not prevent FETCH of records
Closes #1395
This commit is contained in:
parent
5b76a25932
commit
50a2c25688
2 changed files with 106 additions and 11 deletions
|
@ -78,30 +78,30 @@ impl Iterator {
|
||||||
// Log the statement
|
// Log the statement
|
||||||
trace!(target: LOG, "Iterating: {}", stm);
|
trace!(target: LOG, "Iterating: {}", stm);
|
||||||
// Enable context override
|
// Enable context override
|
||||||
let mut ctx = Context::new(ctx);
|
let mut run = Context::new(ctx);
|
||||||
self.run = ctx.add_cancel();
|
self.run = run.add_cancel();
|
||||||
// Process the query LIMIT clause
|
// Process the query LIMIT clause
|
||||||
self.setup_limit(&ctx, opt, txn, stm).await?;
|
self.setup_limit(&run, opt, txn, stm).await?;
|
||||||
// Process the query START clause
|
// Process the query START clause
|
||||||
self.setup_start(&ctx, opt, txn, stm).await?;
|
self.setup_start(&run, opt, txn, stm).await?;
|
||||||
// Process prepared values
|
// Process prepared values
|
||||||
self.iterate(&ctx, opt, txn, stm).await?;
|
self.iterate(&run, opt, txn, stm).await?;
|
||||||
// Return any document errors
|
// Return any document errors
|
||||||
if let Some(e) = self.error.take() {
|
if let Some(e) = self.error.take() {
|
||||||
return Err(e);
|
return Err(e);
|
||||||
}
|
}
|
||||||
// Process any SPLIT clause
|
// Process any SPLIT clause
|
||||||
self.output_split(&ctx, opt, txn, stm).await?;
|
self.output_split(ctx, opt, txn, stm).await?;
|
||||||
// Process any GROUP clause
|
// Process any GROUP clause
|
||||||
self.output_group(&ctx, opt, txn, stm).await?;
|
self.output_group(ctx, opt, txn, stm).await?;
|
||||||
// Process any ORDER clause
|
// Process any ORDER clause
|
||||||
self.output_order(&ctx, opt, txn, stm).await?;
|
self.output_order(ctx, opt, txn, stm).await?;
|
||||||
// Process any START clause
|
// Process any START clause
|
||||||
self.output_start(&ctx, opt, txn, stm).await?;
|
self.output_start(ctx, opt, txn, stm).await?;
|
||||||
// Process any LIMIT clause
|
// Process any LIMIT clause
|
||||||
self.output_limit(&ctx, opt, txn, stm).await?;
|
self.output_limit(ctx, opt, txn, stm).await?;
|
||||||
// Process any FETCH clause
|
// Process any FETCH clause
|
||||||
self.output_fetch(&ctx, opt, txn, stm).await?;
|
self.output_fetch(ctx, opt, txn, stm).await?;
|
||||||
// Output the results
|
// Output the results
|
||||||
Ok(mem::take(&mut self.results).into())
|
Ok(mem::take(&mut self.results).into())
|
||||||
}
|
}
|
||||||
|
|
95
lib/tests/limit.rs
Normal file
95
lib/tests/limit.rs
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
mod parse;
|
||||||
|
use parse::Parse;
|
||||||
|
use surrealdb::sql::Value;
|
||||||
|
use surrealdb::Datastore;
|
||||||
|
use surrealdb::Error;
|
||||||
|
use surrealdb::Session;
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn select_limit_fetch() -> Result<(), Error> {
|
||||||
|
let sql = "
|
||||||
|
CREATE tag:rs SET name = 'Rust';
|
||||||
|
CREATE tag:go SET name = 'Golang';
|
||||||
|
CREATE tag:js SET name = 'JavaScript';
|
||||||
|
CREATE person:tobie SET tags = [tag:rs, tag:go, tag:js];
|
||||||
|
CREATE person:jaime SET tags = [tag:js];
|
||||||
|
SELECT * FROM person LIMIT 1 FETCH tags;
|
||||||
|
";
|
||||||
|
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(), 6);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: tag:rs,
|
||||||
|
name: 'Rust'
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: tag:go,
|
||||||
|
name: 'Golang'
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: tag:js,
|
||||||
|
name: 'JavaScript'
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: person:tobie,
|
||||||
|
tags: [tag:rs, tag:go, tag:js]
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: person:jaime,
|
||||||
|
tags: [tag:js]
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: person:jaime,
|
||||||
|
tags: [
|
||||||
|
{
|
||||||
|
id: tag:js,
|
||||||
|
name: 'JavaScript'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
Reference in a new issue