假设我想看到为该功能而编写的完整代码"文本搜索配置"在PostgreSQL源代码中,我如何获得它?
调试是一种方式,但这可能还不够,我可能做错了。
如果有办法为每个功能找到它,请告诉我。 或者这是查看PostgreSQL代码的错误方法吗?
基本上我想知道实现新功能需要什么,以及为此修改所有组件/文件的内容。
谢谢。
答案 0 :(得分:1)
从git克隆源代码,然后git grep
。那通常会帮助你找到你想要的东西。还有关于PostgreSQL内部和结构的文档;请参阅PostgreSQL网站和wiki的开发人员部分。一些子系统在源树中有README
个文件,并且到处都有注释。
例如:
git grep 'tsearch' src/
在这种情况下,您会快速显示您正在寻找src/backend/tsearch
和src/include/tsearch
,以及src/backend/utils/adt/ts*
和src/backend/commands/tsearchcmds.c
。
“tsearch”是该功能的内部名称。
如果你不知道你能用以下的东西找到它:
git grep 'TEXT.*SEARCH' src/
查找文本搜索SQL命令。这会引导您src/backend/parser/gram.y
,解析器语法和src/backend/commands/tsearchcmds.c
。
如果你在解析器语法中查找它,你会在第5130行找到它:
| CREATE TEXT_P SEARCH CONFIGURATION any_name definition
{
DefineStmt *n = makeNode(DefineStmt);
n->kind = OBJECT_TSCONFIGURATION;
n->args = NIL;
n->defnames = $5;
n->definition = $6;
$$ = (Node *)n;
}
显示了OBJECT_TSCONFIGURATION
类型的解析节点的创建。所以你可以寻找OBJECT_TSCONFIGURATION
:
$ git grep OBJECT_TSCONFIGURATION
src/backend/catalog/objectaddress.c: "text search configuration", OBJECT_TSCONFIGURATION
src/backend/catalog/objectaddress.c: case OBJECT_TSCONFIGURATION:
src/backend/catalog/objectaddress.c: case OBJECT_TSCONFIGURATION:
src/backend/commands/alter.c: case OBJECT_TSCONFIGURATION:
src/backend/commands/alter.c: case OBJECT_TSCONFIGURATION:
src/backend/commands/alter.c: case OBJECT_TSCONFIGURATION:
src/backend/commands/dropcmds.c: case OBJECT_TSCONFIGURATION:
src/backend/commands/event_trigger.c: case OBJECT_TSCONFIGURATION:
src/backend/parser/gram.y: n->objtype = OBJECT_TSCONFIGURATION;
src/backend/parser/gram.y: n->kind = OBJECT_TSCONFIGURATION;
src/backend/parser/gram.y: | TEXT_P SEARCH CONFIGURATION { $$ = OBJECT_TSCONFIGURATION; }
src/backend/parser/gram.y: | TEXT_P SEARCH CONFIGURATION { $$ = OBJECT_TSCONFIGURATION; }
src/backend/parser/gram.y: n->renameType = OBJECT_TSCONFIGURATION;
src/backend/parser/gram.y: n->objectType = OBJECT_TSCONFIGURATION;
src/backend/parser/gram.y: n->objectType = OBJECT_TSCONFIGURATION;
src/backend/tcop/utility.c: case OBJECT_TSCONFIGURATION:
src/backend/tcop/utility.c: case OBJECT_TSCONFIGURATION:
src/backend/tcop/utility.c: case OBJECT_TSCONFIGURATION:
src/backend/tcop/utility.c: case OBJECT_TSCONFIGURATION:
src/include/nodes/parsenodes.h: OBJECT_TSCONFIGURATION,
从这里有一些途径可以找到你真正想要的东西。例如,standard_ProcessUtility
中的utility.c
函数会在DefineTSConfiguration
中为src/backend/commands/tsearchcmds.c
调用case OBJECT_TSCONFIGURATION
。您可以使用cscope或ctags找到函数的位置git grep
或(更好),最好是通过文本编辑器的C编辑集成。
该文件包含操纵tsearch配置的命令,但不包含全文搜索的实现。如果这是你想要的,那么你首先要寻找to_tsvector
和to_tsquery
的C实现。搜索这些内容会引导您src/backend/tsearch/to_tsany.c
,将您带到需要寻找的位置。
有时C函数名称与SQL函数名称不同。在这种情况下,您只能找到pg_proc.h
条目,并且会告诉您要查找的C函数名称。在这种情况下,C和SQL函数名称是相同的,因此您不需要通过pg_proc.h
。
因此,一般来说,我们的想法是使用git grep
和cscope
(或您的文本编辑器的等效代码导航功能)学习导航大量代码。< / p>
如果您不知道它的名称或查找位置,请从SQL-visible入口点开始。查看解析器语法gram.y
,然后查看它产生的解析节点的用途。查看实现该功能的SQL级函数(pg_proc.h
)和运算符(pg_operator.h
),并将它们与源代码一起使用。 grep在代码树中引用它或跟随调用链。
了解高级结构有很大帮助,而且PostgreSQL网站和wiki开发人员部分的会谈,幻灯片和其他文档将帮助您。