简单数据库实现——Part2 - 世上最简单的SQL编译器和虚拟机

Part2 - 世上最简单的SQL编译器和虚拟机

我们正在复现sqlite。sqlite的前端(front-end)是一个SQL编译器,它解析一个字符串并输出一个字节码。

字节码被传递给虚拟机来处理它(Part1中有提到)。

SQLite Architecture

再看一下这个结构图,我们可以看到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):
+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值