diff --git a/dax/test/dax/dax_test.go b/dax/test/dax/dax_test.go index a5f026412..95ff794c6 100644 --- a/dax/test/dax/dax_test.go +++ b/dax/test/dax/dax_test.go @@ -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 { diff --git a/sql3/parser/scanner.go b/sql3/parser/scanner.go index 8bd863de1..af03dec3a 100644 --- a/sql3/parser/scanner.go +++ b/sql3/parser/scanner.go @@ -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() diff --git a/sql3/planner/expressionagg.go b/sql3/planner/expressionagg.go index 6bd90ed86..5d5ad01a3 100644 --- a/sql3/planner/expressionagg.go +++ b/sql3/planner/expressionagg.go @@ -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()) } diff --git a/sql3/test/defs/defs.go b/sql3/test/defs/defs.go index 3018951b4..e25e14510 100644 --- a/sql3/test/defs/defs.go +++ b/sql3/test/defs/defs.go @@ -19,6 +19,8 @@ var TableTests []TableTest = []TableTest{ orderByTests, distinctTests, + subqueryTests, + topTests, deleteTests, diff --git a/sql3/test/defs/defs_subquery.go b/sql3/test/defs/defs_subquery.go new file mode 100644 index 000000000..007046b56 --- /dev/null +++ b/sql3/test/defs/defs_subquery.go @@ -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, + }, + }, +}