关于 spark sql parser 的源码, 看不懂,求指导


class AstBuilder(conf: SQLConf) extends SqlBaseBaseVisitor[AnyRef] with Logging {
 ...

    override def visitSingleStatement(ctx: SingleStatementContext): LogicalPlan = withOrigin(ctx) {
    
      visit(ctx.statement).asInstanceOf[LogicalPlan]
    }

}

visit是 antlr 的AbstractParseTreeVisitor的一个方法, 返回类型是 T, 函数签名如下

public T visit(ParseTree tree) {
    return tree.accept(this);
}

我的疑问是为什么可以将返回类型转成 LogicalPlan, 这个过程发生了啥??

相关文章

6 thoughts on “关于 spark sql parser 的源码, 看不懂,求指导

  1. 因为 visit(ctx.statement) 会调用其它 visit… 方法并把返回值传上来。spark 实现的这些 visit… 逻辑保证了这个情况下返回值一定会是 LogicalPlan.

    这个 Visitor 要结合语法文件看的,建议读一读 The Definitive ANTLR 4 Reference, 跟着书用用 ANTLR 写个计算器什么的。

  2. sql 语句被解析成语法树,一条 sql 语句对应的语法树中每个节点被 visitor 解析为一个算子,顶层被 visitor 解析为 LogicalPlan. visitSingleStatement 是 visitor 访问单独一条 SQL 语句的,顶层 visitor 结果肯定是 LogicalPlan 类型了

发表评论

电子邮件地址不会被公开。 必填项已用*标注