我是靠谱客的博主 无辜溪流,这篇文章主要介绍postgresql查询编译源码分析——接收和返回,现在分享给大家,希望可以做个参考。

一,前言

    源码分析的过程是以vscode调试的形式进行的源码阅读,所以我们要先启动pgsql然后attatch 到对应的进程,并在postgres.c的for (;;)语句位置设置断点,并执行查询SQL。

二,接收和返回

    在for(;;)死循环中,pgsql一直接受当前回话用户的请求并把执行结果返回给用户。
 变量send_ready_for_query是个bool值,判断发送回用户的数据是否已经准备好,首次执行时为假。

复制代码
1
2
3
4
5
if (send_ready_for_query) { ...... }

  之后阻塞在这里,等待用户输入请求。返回值firstchar为对应请求的命令类型。常见的取值为:Q(增删改查入口都在这)。

复制代码
1
2
3
4
5
/* * (3) read a command (loop blocks here) */ firstchar = ReadCommand(&input_message);

  判断命令,如果是Q(增删改查),则读取转码后的用户输入,并调用主函数exec_simple_query()。
  如果在整个exec_simple_query中发生异常。则PortalRun函数会调用elog.c:pg_re_throw,之后会直接跳回 postgres.c 中 if (sigsetjmp(local_sigjmp_buf, 1) != 0),然后 再次开始for(; ; )。
  如果执行过程成功则设置send_ready_for_query 为真,并退出switch。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
switch (firstchar) { case 'Q': /* simple query */ { const char *query_string; /* Set statement_timestamp() */ SetCurrentStatementStartTimestamp(); /* 获取转码后的用户输入 */ query_string = pq_getmsgstring(&input_message); pq_getmsgend(&input_message); if (am_walsender) { if (!exec_replication_command(query_string)) exec_simple_query(query_string); } else exec_simple_query(query_string); send_ready_for_query = true; } break;

  进入for(; ; )的下一个循环,再次判断if (send_ready_for_query),并进入到if语句中,将结果返回给用户,同时设置send_ready_for_query为假。之后再次阻塞在ReadCommand函数中,等待用户的再次请求。

复制代码
1
2
3
4
5
6
7
if (send_ready_for_query) { ...... ReadyForQuery(whereToSendOutput); send_ready_for_query = false; }

最后

以上就是无辜溪流最近收集整理的关于postgresql查询编译源码分析——接收和返回的全部内容,更多相关postgresql查询编译源码分析——接收和返回内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部