postgres源码学习之简单sql查询
- 游戏开发
- 2025-08-29 13:09:02

postgres源码学习之sql查询 sql查询的主流程读取sql解析sql重写sql获得执行计划执行查询操作结果返回 sql查询的主流程
参考postgres的处理流程 由上一节,我们可以看到,当有新的连接通过权限认证之后,将进入等待接收sql语句,并执行sql语句的过程。
读取sql建立连接后,服务端postgres就等待接收命令
解析sql解析sql语句函数为pg_parse_query,其调用栈如下:
重写sql重写sql语句函数为parse_analyze_fixedparams,其调用栈如下:
获得执行计划获得执行计划函数为pg_plan_queries,调用栈如下:
执行查询操作查询操作调用顺序为PortalRun–>PortRunSelect–>ExecutorRun–>standard_ExecutorRun–>ExecutePlan
结果返回在ExecutePlan中,会将结果集返回给客户端,调用栈如下:
涉及到查询结果返回的,会调用到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 解析记录中介绍的结果集存储有着相似的地方。
postgres源码学习之简单sql查询由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“postgres源码学习之简单sql查询”