0502: 表达式求值

解释器

解析了表达式,就可以给 select 和 update 语句添加计算功能:

select a + b, c * d from t where a = 123;
update t set x = x + 1 where a = 123;

上一步解析成了树形结构,求值时先计算子树,得到结果后才能计算当前节点。所以这是一个递归遍历树形结构的函数:

func evalExpr(schema *Schema, row Row, expr interface{}) (*Cell, error) {
    switch e := expr.(type) {
    case string:
        // TODO
    case *Cell:
        return e, nil
    case *ExprBinOp:
        left, err := evalExpr(schema, row, e.left)
        if err != nil {
            return nil, err
        }
        right, err := evalExpr(schema, row, e.right)
        if err != nil {
            return nil, err
        }
        // TODO
    default:
        panic("unreachable")
    }
}

evalExpr() 函数输入某一列的数据(schemarow),用 switch 语句判断当前表达式的类型,然后返回计算结果(*Cell)。

您正在阅读免费版教程,从第4章起只有简单的指引,适合爱好挑战和自学的读者。
可以购买有详细指导+背景知识的完整版