spanner/spannertest: fix expansion of * in SELECT list
This was inadvertently broken in some other cleanup work. As a result,
this is now implemented in a more principled, robust way, instead of
special-casing `SELECT *`.
Change-Id: I5db43ae77ce3a77b6b19c4120d8f2c2b6279475e
Reviewed-on: https://code-review.googlesource.com/c/gocloud/+/52951
Reviewed-by: Shanika Kuruppu <skuruppu@google.com>
diff --git a/spanner/spannertest/db_query.go b/spanner/spannertest/db_query.go
index 620e5c2..d450d74 100644
--- a/spanner/spannertest/db_query.go
+++ b/spanner/spannertest/db_query.go
@@ -171,18 +171,25 @@
func (si selIter) Cols() []colInfo { return si.cis }
func (si selIter) Next() (row, error) {
- row, err := si.ri.Next()
+ r, err := si.ri.Next()
if err != nil {
return nil, err
}
- si.ec.row = row
+ si.ec.row = r
- selectStar := len(si.list) == 1 && si.list[0] == spansql.Star
- if selectStar {
- return row, nil
+ var out row
+ for _, e := range si.list {
+ if e == spansql.Star {
+ out = append(out, r...)
+ } else {
+ v, err := si.ec.evalExpr(e)
+ if err != nil {
+ return nil, err
+ }
+ out = append(out, v)
+ }
}
-
- return si.ec.evalExprList(si.list)
+ return out, nil
}
// distinctIter applies a DISTINCT filter.
@@ -492,13 +499,10 @@
// Apply SELECT list.
var colInfos []colInfo
- // Is this a `SELECT *` query?
- selectStar := len(sel.List) == 1 && sel.List[0] == spansql.Star
- if selectStar {
- // Every column will appear in the output.
- colInfos = ec.cols
- } else {
- for i, e := range sel.List {
+ for i, e := range sel.List {
+ if e == spansql.Star {
+ colInfos = append(colInfos, ec.cols...)
+ } else {
ci, err := ec.colInfo(e)
if err != nil {
return nil, err
diff --git a/spanner/spannertest/db_test.go b/spanner/spannertest/db_test.go
index efa0278..6f509e0 100644
--- a/spanner/spannertest/db_test.go
+++ b/spanner/spannertest/db_test.go
@@ -433,6 +433,14 @@
},
},
{
+ // Exactly the same as the previous, except with a redundant ORDER BY clause.
+ `SELECT * FROM Staff WHERE Name LIKE "S%" ORDER BY Name`,
+ nil,
+ [][]interface{}{
+ {"Sam", int64(3), int64(9), false, 1.75, nil, nil, nil},
+ },
+ },
+ {
`SELECT Name FROM Staff WHERE FirstSeen >= @min`,
queryParams{"min": queryParam{Value: "1996-01-01", Type: spansql.Type{Base: spansql.Date}}},
[][]interface{}{