1List *pg_parse_query(constchar*query_string) {2List *raw_parsetree_list;3TRACE_POSTGRESQL_QUERY_PARSE_START(query_string);4if(log_parser_stats)5ResetUsage();6raw_parsetree_list =raw_parser(query_string);7if(log_parser_stats)8ShowUsage("PARSER STATISTICS");9#ifdef COPY_PARSE_PLAN_TREES...
exec_simple_query函数由PostgresMain函数调用,其调用栈如下: #30x00000000008c5c35inexec_simple_query(query_string=0x2eed1a8"select * from t1;")atpostgres.c:1050#40x00000000008ca0f8inPostgresMain(argc=1, argv=0x2f16cb8, dbname=0x2f16b20"testdb", username=0x2ee9d48"xdb")atpostgres.c:4159...
数据库客户端会根据前后端协议将用户查询将信息发送到服务端,进入函数PostgresMain,然后进入exec_simple_query,exec_simple_query函数主要分为两部分,第一部分是查询分析,第二部分是查询执行,下面以下图进行说明查询分析: (1)首先exec_simple_query函数会将得到的SQL语句通过调用pg_parse_query进入词法和语法分析的主题...
exec_simple_query ->pg_parse_query ->raw_parser ->pg_analyze_and_rewrite ->parse_analyze ->pg_rewrite_query ->pg_plan_querie 代码目录结构如下: 查询分析 解析sql生成查询树:backend/parser 查询重写 重写查询树生成新的查询树,支持规则和视图:backend/rewrite 查询优化 路径计算,生成最优路径:backend...
然后exec_simple_query 函数一直往下拉, 就可以看到 check_log_duration,顾名思义记录时长 /* * Emit duration logging if appropriate. */ switch (check_log_duration(msec_str, was_logged)) { case 1: ereport(LOG, (errmsg("duration: %s ms", msec_str), errhidestmt(true))); break; case 2...
获得语法树之后需要把语法树转换为查询树,优化器,执行器使用的都是查询树: exec_simple_query获取了parsetree_list之后,会对其中的每一颗子树调用pg_analyze_and_rewrite进行语义分析和查询重写。 analyze_and_rewrite: List * p
PostgreSQL开源数据库的源代码相对路径为Postgresql\source\src\backend,其代码整体编译流程大致如下:PostgresSQL在exec_simple_query函数中处理与用户交互的简单查询请求,其查询操作使用两种协议:Simple query protocol和Extended query protocol。Extended query protocol包含Parse、Bind、Execute三个步骤,并定义了Prepared Stateme...
从源代码的角度来看,查询处理是通过调用exec_simple_query()函数开始的。除非你使用游标或扩展查询协议,否则你通过 psql 发出的绝大多数查询都是从这里开始的。 在exec_simple_query()中,它会调用每个查询处理阶段提供的入口函数,最终返回 DestReceiver 对象。
plpgsql_exec_function <--- 按fcinfo->args初始化参数 exec_toplevel_block exec_stmt_block <--- 按block->initvarnos初始化参数(哪来的?为什么初始化?) exec_stmts exec_stmt_call <--- 怎么构造新参数列表? SPI_execute_plan_extended <--- SPI怎么使用? _SPI_execute_plan ProcessUtility standard...
查询执行器也是被函数exec_simple_query调用,只是调用的顺序上查询编译器在前,查询执行器在后。 总体上, 查询执行器实际就是按照执行计划的安排,有机调用通用存储、索引、并发等模块,按照各种执行计划中各种计划节点的实现算法来完成数据的读取或者修改 查询执行器有4个主要的子模块:Portal(PG中很多模块是以此核心数据...