func (t Tuple) Type() sql.Type {
	if len(t) == 1 {
		return t[0].Type()
	}
	types := make([]sql.Type, len(t))
	for i, e := range t {
		types[i] = e.Type()
	}
	return sql.CreateTuple(types...)
}
Type implements the Expression interface.
package expression
import (
	"fmt"
	"strings"
	"github.com/dolthub/go-mysql-server/sql"
)
type Tuple []sql.Expression
func NewTuple(exprs ...sql.Expression) Tuple {
	return Tuple(exprs)
}
func (t Tuple) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
	if len(t) == 1 {
		return t[0].Eval(ctx, row)
	}
	var result = make([]interface{}, len(t))
	for i, e := range t {
		v, err := e.Eval(ctx, row)
		if err != nil {
			return nil, err
		}
		result[i] = v
	}
	return result, nil
}
func (t Tuple) IsNullable() bool {
	if len(t) == 1 {
		return t[0].IsNullable()
	}
	return false
}
func (t Tuple) String() string {
	var exprs = make([]string, len(t))
	for i, e := range t {
		exprs[i] = e.String()
	}
	return fmt.Sprintf("(%s)", strings.Join(exprs, ", "))
}
func (t Tuple) DebugString() string {
	var exprs = make([]string, len(t))
	for i, e := range t {
		exprs[i] = sql.DebugString(e)
	}
	return fmt.Sprintf("TUPLE(%s)", strings.Join(exprs, ", "))
}
func (t Tuple) Resolved() bool {
	for _, e := range t {
		if !e.Resolved() {
			return false
		}
	}
	return true
}