参考学习尚硅谷Hive源码篇,自我总结
程序入口 — CliDriver
run
方法——解析用户参数,包含"-e -f -v -database"等等executeDriver
方法——识别 hivesql语句的"> “和”;"processLine
方法——解析单行 HQLprocessCmd
方法——判别四种开头情况 -1-“quit"或者"exit”-2-“source”-3-"!"-4-HQLprocessLocalCmd
方法——HQL 执行的核心方法qp.run(cmd)
方法——分别进去未编译(false)和已编译(true)的run方法runInternal
方法—— 1.编译 HQL 语句 (包含解析器、编译器和优化器);2.执行 (执行器)
int ret = new CliDriver().run(args);
//*******************************主类的 run 方法************************************
public int run(String[] args) throws Exception {
//解析用户参数,包含"-e -f -v -database"等等
if (!oproc.process_stage2(ss)) {
return 2;}
// execute cli driver work
try {
return executeDriver(ss, conf, oproc); }
//*******************************executeDriver 方法************************************
private int executeDriver(CliSessionState ss, HiveConf conf, OptionsProcessor oproc){
//读取客户端的输入 HQL
while ((line = reader.readLine(curPrompt + "> ")) != null) {
//以按照“;”分割的方式解析
if (line.trim().endsWith(";") && !line.trim().endsWith("\\;")) {
line = prefix + line;
ret = cli.processLine(line, true);
//*******************************processLine 方法************************************
public int processLine(String line, boolean allowInterrupting){
//解析单行 HQL
ret = processCmd(command);
//*******************************processCmd 方法************************************
public int processCmd(String cmd){
//1.如果命令为"quit"或者"exit",则退出
if (cmd_trimmed.toLowerCase(