博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
阅读量:4073 次
发布时间:2019-05-25

本文共 1833 字,大约阅读时间需要 6 分钟。

PostgreSQL代码分析,查询优化部分。

这里把规范谓词表达式的部分就整理完了,阅读的顺序如下:

*************************************************************************************************************************************************************

pull_ands()和pull_ors()的代码比较便于理解,就是把树状结构的AND操作拉平,下图是pull_ands的例子,pull_ors逻辑相同:

/* * pull_ands *	  Recursively flatten nested AND clauses into a single and-clause list. * * Input is the arglist of an AND clause. * Returns the rebuilt arglist (note original list structure is not touched). */static List *pull_ands(List *andlist){	List	   *out_list = NIL;	ListCell   *arg;	foreach(arg, andlist)	{		Node	   *subexpr = (Node *) lfirst(arg);		/*		 * Note: we can destructively concat the subexpression's arglist		 * because we know the recursive invocation of pull_ands will have		 * built a new arglist not shared with any other expr. Otherwise we'd		 * need a list_copy here.		 */		if (and_clause(subexpr))			out_list = list_concat(out_list,								   pull_ands(((BoolExpr *) subexpr)->args));		else			out_list = lappend(out_list, subexpr);	}	return out_list;}/* * pull_ors *	  Recursively flatten nested OR clauses into a single or-clause list. * * Input is the arglist of an OR clause. * Returns the rebuilt arglist (note original list structure is not touched). */static List *pull_ors(List *orlist){	List	   *out_list = NIL;	ListCell   *arg;	foreach(arg, orlist)	{		Node	   *subexpr = (Node *) lfirst(arg);		/*		 * Note: we can destructively concat the subexpression's arglist		 * because we know the recursive invocation of pull_ors will have		 * built a new arglist not shared with any other expr. Otherwise we'd		 * need a list_copy here.		 */		if (or_clause(subexpr))			out_list = list_concat(out_list,								   pull_ors(((BoolExpr *) subexpr)->args));		else			out_list = lappend(out_list, subexpr);	}	return out_list;}

你可能感兴趣的文章
MFC中由左键单击模拟左键双击引起的问题
查看>>
一个指针的引用引发的血案
查看>>
vector的push_back对于拷贝构造和赋值操作的调用
查看>>
OpenSees开发(一)windows 上编译opensees (使用vs2005)
查看>>
小议函数指针
查看>>
WEB服务器、应用程序服务器、HTTP服务器区别
查看>>
用户名称修改的完美解决方法
查看>>
discuz 3 头像显示不成功
查看>>
手动添加uc应用及其 提示notelist表缺少appX字段的处理方法
查看>>
Discuz!X3.2 uc_server密码正确无法登录的解决方法
查看>>
discuz登录admin后台老是自动跳出来
查看>>
discuz限制用户查看购买记录
查看>>
MFC画图
查看>>
一个GDI双缓冲类
查看>>
InvalidateRect函数
查看>>
无法定位 xxxx 与动态链接库 avcodec-xx.dll上
查看>>
【ffmpeg + VS2010】编译包含libavutil\common.h后出现找不到inttypes.h的问题
查看>>
可编辑的 ListCtrl 封装整合
查看>>
ffmpeg AVFrame 插入静音帧
查看>>
路由器有线桥接的两种方式异同
查看>>