diff --git a/sql3/planner/expressionpql.go b/sql3/planner/expressionpql.go index 48526a841..7d19e3ac7 100644 --- a/sql3/planner/expressionpql.go +++ b/sql3/planner/expressionpql.go @@ -499,18 +499,19 @@ func (p *ExecutionPlanner) generatePQLCallFromBinaryExpr(ctx context.Context, ex if err != nil { return nil, err } - val, ok := pqlValue.(float64) - if !ok { + cond := &pql.Condition{Op: pqlOp} + switch val := pqlValue.(type) { + case float64: + cond.Value = pql.FromFloat64(val) + case int64: + cond.Value = pql.FromInt64(val, 0) + default: return nil, sql3.NewErrInternalf("unexpected type '%T", pqlValue) } - d := pql.FromFloat64(val) return &pql.Call{ Name: "Row", Args: map[string]interface{}{ - lhs.columnName: &pql.Condition{ - Op: pqlOp, - Value: d, - }, + lhs.columnName: cond, }, }, nil @@ -541,7 +542,7 @@ func (p *ExecutionPlanner) generatePQLCallFromBinaryExpr(ctx context.Context, ex pqlOp = pql.NEQ } switch typ := expr.lhs.Type().(type) { - case *parser.DataTypeID, *parser.DataTypeString, *parser.DataTypeIDSet, *parser.DataTypeStringSet: + case *parser.DataTypeID, *parser.DataTypeString, *parser.DataTypeIDSet, *parser.DataTypeStringSet, *parser.DataTypeBool: if strings.EqualFold(lhs.columnName, string(dax.PrimaryKeyFieldName)) { return nil, sql3.NewErrInvalidColumnInFilterExpression(0, 0, string(dax.PrimaryKeyFieldName), "is/is not null") } diff --git a/sql3/planner/oppqlaggregate.go b/sql3/planner/oppqlaggregate.go index b8938d4bf..a4c43ba7a 100644 --- a/sql3/planner/oppqlaggregate.go +++ b/sql3/planner/oppqlaggregate.go @@ -294,6 +294,10 @@ func (i *pqlAggregateRowIter) Next(ctx context.Context) (types.Row, error) { default: return nil, sql3.NewErrInternalf("unhandled return type '%T'", i.aggregate.Type()) } + case nil: + // it's valid for an aggregate to yield a NULL in some cases, such as + // when it's called on what turns out to be an empty set. + i.resultValue = nil default: return nil, sql3.NewErrInternalf("unexpected result type '%T'", queryResponse.Results[0]) } diff --git a/sql3/planner/planoptimizer.go b/sql3/planner/planoptimizer.go index c49813b15..fe73539eb 100644 --- a/sql3/planner/planoptimizer.go +++ b/sql3/planner/planoptimizer.go @@ -102,7 +102,7 @@ func (p *ExecutionPlanner) optimizePlan(ctx context.Context, plan types.PlanOper dumpPlan( []string{"================================================================================", "plan post-optimzation"}, - plan, + result, "--------------------------------------------------------------------------------", ) diff --git a/sql3/test/defs/defs_join.go b/sql3/test/defs/defs_join.go index 8ee73afd1..e52831d51 100644 --- a/sql3/test/defs/defs_join.go +++ b/sql3/test/defs/defs_join.go @@ -113,26 +113,26 @@ var joinTests = TableTest{ { name: "innerjoin-aggregate-groupby-count-distinct-filter", SQLs: sqls( - "SELECT COUNT(DISTINCT u.name) FROM orders o JOIN users u ON o.userid = u._id WHERE o.price > 10;", + "SELECT COUNT(DISTINCT u.name) FROM orders o JOIN users u ON o.userid = u._id WHERE o.price > 9;", ), ExpHdrs: hdrs( hdr("", fldTypeInt), ), ExpRows: rows( - row(int64(4)), + row(int64(2)), ), Compare: CompareExactOrdered, }, { name: "innerjoin-aggregate-groupby-count-filter", SQLs: sqls( - "SELECT COUNT(u.name) FROM orders o JOIN users u ON o.userid = u._id WHERE o.price > 10;", + "SELECT COUNT(u.name) FROM orders o JOIN users u ON o.userid = u._id WHERE o.price > 9;", ), ExpHdrs: hdrs( hdr("", fldTypeInt), ), ExpRows: rows( - row(int64(6)), + row(int64(3)), ), Compare: CompareExactOrdered, },