postgresql查询编译源码分析——接收和返回

本文详细介绍了通过VSCode调试PostgreSQL源码的过程,重点分析了查询接收、执行及返回结果的步骤。从设置断点到读取用户命令,再到调用exec_simple_query()执行查询,文章揭示了PostgreSQL如何处理SQL请求并返回结果。在异常处理部分,文章提到了错误处理机制以及循环重新开始的逻辑。最后,概述了结果返回给用户后,系统如何准备接受新的查询请求。
摘要由CSDN通过智能技术生成

一,前言

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

二,接收和返回

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

		if (send_ready_for_query)
		{
			......
		}

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

		/*
		 * (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。

		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函数中,等待用户的再次请求。

		if (send_ready_for_query)
		{
		   ......
			ReadyForQuery(whereToSendOutput);
			send_ready_for_query = false;
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值