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{}{