1 整体流程
1.1 执行流程
- 应用->驱动:通过驱动的api建立连接,并执行SQL语句
- 驱动->服务端:通过libpq协议封装SQL语句,发送至服务端
- 服务端 postgres线程:接收SQL语句,调用exec_siple_query()开始处理SQL语句
- SQL引擎
- 解析器:通过flex进行词法解析,通过yacc进行语法分析,生成解析树
- 分析器:对解析树进行语义分析:包括检查表是否存在等,生成查询树
- 重写器:
- 计划期:根据查询树生成执行计划
- 执行器:自顶向下执行各个算子,执行过程中会调用存储引擎统一接口
INSERT / UPDATE / DELETE
ExecModifyTable 算子:EexecInsert / ExecUpdate / ExecDelete EexecInsert ExecMaterializeSlot ExecBRInsertTriggers /* ROW INSERT 触发器 */ ExecWithCheckOptions /* 检查约束 */ heap_insert /* 存储引擎统一接口 */ ExecInsertIndexTuples ExecARInsertTriggers /* AFTER ROW 触发器 */ ExecProcessReturningSELECT
ExecIndexScan IndexNext() index_getnext() tid = index_getnext_tid(scan) index_fetch_heap(scan) heap_hot_search_buffer() PageGetItem()