您的位置:首页 > 游戏 > 手游 > 永久免费建站地址_山东seo第一_网站搜索引擎优化的方法_百度官方优化软件

永久免费建站地址_山东seo第一_网站搜索引擎优化的方法_百度官方优化软件

2025/4/22 2:23:38 来源:https://blog.csdn.net/chnming1987/article/details/145734791  浏览:    关键词:永久免费建站地址_山东seo第一_网站搜索引擎优化的方法_百度官方优化软件
永久免费建站地址_山东seo第一_网站搜索引擎优化的方法_百度官方优化软件

postgres源码学习之sql查询

  • sql查询的主流程
  • 读取sql
  • 解析sql
  • 重写sql
  • 获得执行计划
  • 执行查询操作
  • 结果返回

sql查询的主流程

参考postgres的处理流程
图1
由上一节,我们可以看到,当有新的连接通过权限认证之后,将进入等待接收sql语句,并执行sql语句的过程。

读取sql

建立连接后,服务端postgres就等待接收命令
图2

解析sql

解析sql语句函数为pg_parse_query,其调用栈如下:
图3

重写sql

重写sql语句函数为parse_analyze_fixedparams,其调用栈如下:
图4

获得执行计划

获得执行计划函数为pg_plan_queries,调用栈如下:
图5

执行查询操作

查询操作调用顺序为PortalRun–>PortRunSelect–>ExecutorRun–>standard_ExecutorRun–>ExecutePlan
图6

结果返回

在ExecutePlan中,会将结果集返回给客户端,调用栈如下:
图7

涉及到查询结果返回的,会调用到printtup函数。
其函数主要内容如下:

/** send the attributes of this tuple*/for (i = 0; i < natts; ++i){PrinttupAttrInfo *thisState = myState->myinfo + i;Datum		attr = slot->tts_values[i];if (slot->tts_isnull[i]){pq_sendint32(buf, -1);continue;}if (thisState->typisvarlena)VALGRIND_CHECK_MEM_IS_DEFINED(DatumGetPointer(attr),VARSIZE_ANY(attr));if (thisState->format == 0){/* Text output */char	   *outputstr;outputstr = OutputFunctionCall(&thisState->finfo, attr);pq_sendcountedtext(buf, outputstr, strlen(outputstr));}else{/* Binary output */bytea	   *outputbytes;outputbytes = SendFunctionCall(&thisState->finfo, attr);pq_sendint32(buf, VARSIZE(outputbytes) - VARHDRSZ);pq_sendbytes(buf, VARDATA(outputbytes),VARSIZE(outputbytes) - VARHDRSZ);}}

其输出形式和之前介绍的Mysql Resultset 解析记录中介绍的结果集存储有着相似的地方。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com