以select语句为例,入口在session.go中的Execute方法。
首先,sql需要解析成AST,这个步骤是通过ParseSQL进行处理的,这块需要了解一下lex+yacc原理,看得懂parser.y中的规则定义。AST的结构定义在ast这个包中。
接下来,要把AST转移成执行计划,这个步骤在Compile进行处理的。最终的执行计划是一个物理计划(physical plan),由一系列的物理逻辑操作符组成。
最后,执行执行计划,这块以后再说。
下面主要关注这个Compile的过程,见compile.go的Compile方法。分为几个步骤: 预处理、生成逻辑计划、生成物理计划。
预处理比较简单,就是检查一些简单的语法,例如表名是否合法,字段是否合法等,都是简单的校验。见plan/preprocess.go
逻辑计划和物理计划有什么区别?这个真有点蒙头,可以看看一下这篇论文脑补一下。
http://oai.dtic.mil/oai/oai?verb=getRecord&metadataPrefix=html&identifier=ADA450829 The Volcano Optimizer Generator