如何在PostgreSQL源代码中找到属于特定功能的所有代码/文件/模块?

时间:2015-08-10 12:45:15

标签: postgresql database-design

假设我想看到为该功能而编写的完整代码"文本搜索配置"在PostgreSQL源代码中,我如何获得它?

调试是一种方式,但这可能还不够,我可能做错了。

如果有办法为每个功能找到它,请告诉我。 或者这是查看PostgreSQL代码的错误方法吗?

基本上我想知道实现新功能需要什么,以及为此修改所有组件/文件的内容。

谢谢。

1 个答案:

答案 0 :(得分:1)

从git克隆源代码,然后git grep。那通常会帮助你找到你想要的东西。还有关于PostgreSQL内部和结构的文档;请参阅PostgreSQL网站和wiki的开发人员部分。一些子系统在源树中有README个文件,并且到处都有注释。

例如:

git grep 'tsearch' src/

在这种情况下,您会快速显示您正在寻找src/backend/tsearchsrc/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_tsvectorto_tsquery的C实现。搜索这些内容会引导您src/backend/tsearch/to_tsany.c,将您带到需要寻找的位置。

有时C函数名称与SQL函数名称不同。在这种情况下,您只能找到pg_proc.h条目,并且会告诉您要查找的C函数名称。在这种情况下,C和SQL函数名称是相同的,因此您不需要通过pg_proc.h

因此,一般来说,我们的想法是使用git grepcscope(或您的文本编辑器的等效代码导航功能)学习导航大量代码。< / p>

如果您不知道它的名称或查找位置,请从SQL-visible入口点开始。查看解析器语法gram.y,然后查看它产生的解析节点的用途。查看实现该功能的SQL级函数(pg_proc.h)和运算符(pg_operator.h),并将它们与源代码一起使用。 grep在代码树中引用它或跟随调用链。

了解高级结构有很大帮助,而且PostgreSQL网站和wiki开发人员部分的会谈,幻灯片和其他文档将帮助您。