Part2 - 世上最简单的SQL编译器和虚拟机
我们正在复现sqlite。sqlite的前端(front-end)是一个SQL编译器,它解析一个字符串并输出一个字节码。
字节码被传递给虚拟机来处理它(Part1中有提到)。
再看一下这个结构图,我们可以看到SQL Command Processer(SQL命令处理器)处理完数据后将字节码传递给Virtual Machine(虚拟机)。
将事情分为两个步骤(指SQL编译器和虚拟机)有许多好处:
- 减少每一部分的复杂性(例如:虚拟机不需要担心语法错误,SQL编译器已经处理了)
- 允许只编译一次普通查询(个人认为是相同的查询只需要编译一次,因此可以提高效率),并缓存字节码以提高效率。
于是,我们需要重构主功能,并支持两个新的关键字。
int main(int argc, char* argv[]) {
InputBuffer* input_buffer = new_input_buffer();
while (true) {
print_prompt();
read_input(input_buffer);
- if (strcmp(input_buffer->buffer, ".exit") == 0) {
- exit(EXIT_SUCCESS);
- } else {
- printf("Unrecognized command '%s'.\n", input_buffer->buffer);
+ // SQL编译器
+ // 检查是否为元命令
+ if (input_buffer->buffer[0] == '.') {
+ switch (do_meta_command(input_buffer)) {
+ case (META_COMMAND_SUCCESS):
+ continue;
+ case (META_COMMAND_UNRECOGNIZED_COMMAND):
+ printf("Unrecognized command '%s'\n", input_buffer->buffer);
+ continue;
+ }
}
+ // 转换为字节码
+ Statement statement;
+ switch (prepare_statement(input_buffer, &statement)) {
+ case (PREPARE_SUCCESS):
+ break;
+ case (PREPARE_UNRECOGNIZED_STATEMENT):
+