Ensure GROUP BY clauses with multi same-aggregate functions work correctly
Closes #1731
This commit is contained in:
parent
fb2356b17a
commit
cad596cdf3
3 changed files with 106 additions and 5 deletions
|
@ -241,10 +241,7 @@ impl Iterator {
|
||||||
if let Field::Alias(v, i) = field {
|
if let Field::Alias(v, i) = field {
|
||||||
match v {
|
match v {
|
||||||
Value::Function(f) if f.is_aggregate() => {
|
Value::Function(f) if f.is_aggregate() => {
|
||||||
let x = vals
|
let x = vals.all().get(ctx, opt, txn, i).await?;
|
||||||
.all()
|
|
||||||
.get(ctx, opt, txn, v.to_idiom().as_ref())
|
|
||||||
.await?;
|
|
||||||
let x = f.aggregate(x).compute(ctx, opt, txn, None).await?;
|
let x = f.aggregate(x).compute(ctx, opt, txn, None).await?;
|
||||||
obj.set(ctx, opt, txn, i, x).await?;
|
obj.set(ctx, opt, txn, i, x).await?;
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,7 +151,7 @@ impl Fields {
|
||||||
};
|
};
|
||||||
// Check if this is a single VALUE field expression
|
// Check if this is a single VALUE field expression
|
||||||
match self.single().is_some() {
|
match self.single().is_some() {
|
||||||
false => out.set(ctx, opt, txn, v.to_idiom().as_ref(), x).await?,
|
false => out.set(ctx, opt, txn, i, x).await?,
|
||||||
true => out = x,
|
true => out = x,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,3 +233,107 @@ async fn select_limit_fetch() -> Result<(), Error> {
|
||||||
//
|
//
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn select_multi_aggregate() -> Result<(), Error> {
|
||||||
|
let sql = "
|
||||||
|
CREATE test:1 SET group = 1, one = 1.7, two = 2.4;
|
||||||
|
CREATE test:2 SET group = 1, one = 4.7, two = 3.9;
|
||||||
|
CREATE test:3 SET group = 2, one = 3.2, two = 9.7;
|
||||||
|
CREATE test:4 SET group = 2, one = 4.4, two = 3.0;
|
||||||
|
SELECT group, math::sum(one) AS one, math::sum(two) AS two FROM test GROUP BY group;
|
||||||
|
SELECT group, math::sum(two) AS two, math::sum(one) AS one FROM test GROUP BY group;
|
||||||
|
";
|
||||||
|
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: test:1,
|
||||||
|
group: 1,
|
||||||
|
one: 1.7,
|
||||||
|
two: 2.4,
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: test:2,
|
||||||
|
group: 1,
|
||||||
|
one: 4.7,
|
||||||
|
two: 3.9,
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: test:3,
|
||||||
|
group: 2,
|
||||||
|
one: 3.2,
|
||||||
|
two: 9.7,
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
id: test:4,
|
||||||
|
group: 2,
|
||||||
|
one: 4.4,
|
||||||
|
two: 3.0,
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
group: 1,
|
||||||
|
one: 6.4,
|
||||||
|
two: 6.3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
group: 2,
|
||||||
|
one: 7.6,
|
||||||
|
two: 12.7,
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
let tmp = res.remove(0).result?;
|
||||||
|
let val = Value::parse(
|
||||||
|
"[
|
||||||
|
{
|
||||||
|
group: 1,
|
||||||
|
one: 6.4,
|
||||||
|
two: 6.3,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
group: 2,
|
||||||
|
one: 7.6,
|
||||||
|
two: 12.7,
|
||||||
|
}
|
||||||
|
]",
|
||||||
|
);
|
||||||
|
assert_eq!(tmp, val);
|
||||||
|
//
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue