fix sum aggregate (fb-1874) (#2404)

* handle sum aggregates with ints; handle escaped quotes in blob literals

* added test ceoverage

* skip subquery test for dax

(cherry picked from commit af475a27f2)
This commit is contained in:
pokeeffe-molecula 2023-01-11 15:46:41 -06:00 committed by Joe Friedrich
parent 1cdcaf472f
commit 0ddf69a322
5 changed files with 82 additions and 0 deletions

View file

@ -112,6 +112,7 @@ func TestDAXIntegration(t *testing.T) {
"alterTable/alterTableBadTable", // looks like table does not exist is a different error in DAX
"top-tests/test-1", // don't know why this is failing at all
"delete_tests",
"subquerytable", // subqueries seem to be a problem
}
doSkip := func(name string) bool {

View file

@ -216,6 +216,11 @@ func (s *Scanner) scanBlob() (Pos, Token, string) {
for i := 0; ; i++ {
ch, _ := s.read()
if ch == '\'' {
if s.peek() == '\'' { // escaped quote
s.read()
s.buf.WriteRune('\'')
continue
}
return pos, BLOB, s.buf.String()
} else if ch == -1 {
return pos, ILLEGAL, string(start) + `'` + s.buf.String()

View file

@ -259,6 +259,24 @@ func (m *aggregateSum) Update(ctx context.Context, row types.Row) error {
}
dsum = pql.AddDecimal(dsum, val)
m.sum = dsum
case *parser.DataTypeInt:
val, ok := v.(int64)
if !ok {
return sql3.NewErrInternalf("unexpected type conversion '%T'", v)
}
var dsum int64
if m.sum != nil {
dsum, ok = m.sum.(int64)
if !ok {
return sql3.NewErrInternalf("unexpected type conversion '%T'", m.sum)
}
} else {
dsum = 0
}
dsum = dsum + val
m.sum = dsum
default:
return sql3.NewErrInternalf("unhandled aggregate expression datatype '%T'", dataType)
}
@ -273,6 +291,13 @@ func (m *aggregateSum) Eval(ctx context.Context) (interface{}, error) {
return nil, sql3.NewErrInternalf("unexpected type conversion '%T'", m.sum)
}
return dsum, nil
case *parser.DataTypeInt:
dsum, ok := m.sum.(int64)
if !ok {
return nil, sql3.NewErrInternalf("unexpected type conversion '%T'", m.sum)
}
return dsum, nil
default:
return nil, sql3.NewErrInternalf("unhandled aggregate expression datatype '%T'", m.expr.Type())
}

View file

@ -19,6 +19,8 @@ var TableTests []TableTest = []TableTest{
orderByTests,
distinctTests,
subqueryTests,
topTests,
deleteTests,

View file

@ -0,0 +1,49 @@
package defs
var subqueryTests = TableTest{
name: "subquerytable",
Table: tbl(
"subquerytable",
srcHdrs(
srcHdr("_id", fldTypeID),
srcHdr("a_string", fldTypeString),
),
srcRows(
srcRow(int64(1), "str1"),
srcRow(int64(2), "str1"),
srcRow(int64(3), "str2"),
srcRow(int64(4), "str2"),
srcRow(int64(5), "str3"),
),
),
SQLTests: []SQLTest{
{
name: "select-count",
SQLs: sqls(
"select sum(mycount) as thecount from (select count(a_string) as mycount, a_string from subquerytable group BY a_string);",
),
ExpHdrs: hdrs(
hdr("thecount", fldTypeInt),
),
ExpRows: rows(
row(int64(5)),
),
Compare: CompareExactUnordered,
SortStringKeys: true,
},
{
name: "select-count-distinct",
SQLs: sqls(
"select sum(mycount) as thecount from (select count(distinct a_string) as mycount, a_string from subquerytable group BY a_string);",
),
ExpHdrs: hdrs(
hdr("thecount", fldTypeInt),
),
ExpRows: rows(
row(int64(3)),
),
Compare: CompareExactUnordered,
SortStringKeys: true,
},
},
}