1 整体流程

1.1 执行流程

  1. 应用->驱动:通过驱动的api建立连接,并执行SQL语句
  2. 驱动->服务端:通过libpq协议封装SQL语句,发送至服务端
  3. 服务端 postgres线程:接收SQL语句,调用exec_siple_query()开始处理SQL语句
  • SQL引擎
  1. 解析器:通过flex进行词法解析,通过yacc进行语法分析,生成解析树
  2. 分析器:对解析树进行语义分析:包括检查表是否存在等,生成查询树
  3. 重写器:
  4. 计划期:根据查询树生成执行计划
  5. 执行器:自顶向下执行各个算子,执行过程中会调用存储引擎统一接口
    • INSERT / UPDATE / DELETE

      ExecModifyTable 算子:EexecInsert / ExecUpdate / ExecDelete
          EexecInsert
              ExecMaterializeSlot
              ExecBRInsertTriggers /* ROW INSERT 触发器 */
              ExecWithCheckOptions /* 检查约束 */
              heap_insert /* 存储引擎统一接口 */
              ExecInsertIndexTuples
              ExecARInsertTriggers /* AFTER ROW 触发器 */
              ExecProcessReturning
      
    • SELECT

      ExecIndexScan
          IndexNext()
              index_getnext()
                  tid = index_getnext_tid(scan)
                  index_fetch_heap(scan)
                      heap_hot_search_buffer()
                          PageGetItem()