{"Entry":{"collection":"hook","key":"join_search_hook","name":"join_search_hook","aliases":[],"metadata":{"aliases":[],"category":"Query planning","content_hash":"66c109a34a7078e0b9221ee20bbe2d1cd435e199dae9b7933817370b93e5159e","derived_content_hash":"54e095b66fde4646d5db2fca21b96567a71c369b6817b972028179c2a1756660","imported_at":"2026-09-27T17:57:58.876844+08:00","name":"join_search_hook","name_zh":"join_search_hook","repair_provenance":{"original_source_revision":"","receipt_sha256":"94b7e379974f8fbd711604fe2be2d313aa13ab5193a98aa354694e38ce21891f","repair":"wiki-repair-20261023"},"slug":"join_search_hook","source_rev":"wiki-repair-20261023:fc41ebaf4f7228887bfe6c875091b16d5528a6c716ad4a781dcea8ee17940065","summary":"Hook for plugins to replace standard_join_search()"}},"Definition":{"Collection":"hook","Key":"join_search_hook","SourceDatabase":"center","Version":"18","SourceTable":"hook","SourceKey":"join_search_hook","SourceRevision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","Facts":{"description":["Hook for plugins to replace standard_join_search()"],"description_zh":"供插件替换 standard_join_search() 的钩子。","description_zh_html":"\u003cp\u003e供插件替换 standard_join_search() 的钩子。\u003c/p\u003e\u003cp\u003e以下中文为本站依据所列 PostgreSQL 源码注释编译的说明。\u003c/p\u003e\u003ch3\u003e接口声明\u003c/h3\u003e\u003cpre\u003etypedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;\u003c/pre\u003e\u003ch3\u003e调用位置\u003c/h3\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003esrc/backend/optimizer/path/allpaths.c:3423\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3\u003e核心调用上下文：src/backend/optimizer/path/allpaths.c:3417–3431\u003c/h3\u003e\u003cpre\u003e\t\t * We put the initial_rels list into a PlannerInfo field because\n\t\t * has_legal_joinclause() needs to look at it (ugly :-().\n\t\t */\n\t\troot-\u0026gt;initial_rels = initial_rels;\n\n\t\tif (join_search_hook)\n\t\t\treturn (*join_search_hook) (root, levels_needed, initial_rels);\n\t\telse if (enable_geqo \u0026amp;\u0026amp; levels_needed \u0026gt;= geqo_threshold)\n\t\t\treturn geqo(root, levels_needed, initial_rels);\n\t\telse\n\t\t\treturn standard_join_search(root, levels_needed, initial_rels);\n\t}\n}\n\n/*\u003c/pre\u003e","facts":[{"label":"Interface type","value":"join_search_hook_type"},{"label":"Header","value":"src/include/optimizer/paths.h"},{"label":"Subsystem","value":"Query planning"},{"label":"Initial value","value":"NULL (no hook installed)"}],"related":[{"label":"The Planner/Optimizer","url":"/docs/18/planner-optimizer.html"}],"release":{"channel":"stable","label":"18","major":"18","ref":"REL_18_STABLE","revision":"753057e340da8f22e57c9a409ea7a235fd6a46bd"},"sections":[{"paragraphs":["src/backend/optimizer/path/allpaths.c:3423"],"title":"Call sites"},{"code":"\t\t * We put the initial_rels list into a PlannerInfo field because\n\t\t * has_legal_joinclause() needs to look at it (ugly :-().\n\t\t */\n\t\troot-\u003einitial_rels = initial_rels;\n\n\t\tif (join_search_hook)\n\t\t\treturn (*join_search_hook) (root, levels_needed, initial_rels);\n\t\telse if (enable_geqo \u0026\u0026 levels_needed \u003e= geqo_threshold)\n\t\t\treturn geqo(root, levels_needed, initial_rels);\n\t\telse\n\t\t\treturn standard_join_search(root, levels_needed, initial_rels);\n\t}\n}\n\n/*","paragraphs":[],"title":"Core call context: src/backend/optimizer/path/allpaths.c:3417–3431"}],"signature":"typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;","sources":[{"label":"Interface declaration","path":"src/include/optimizer/paths.h","sha256":"bf497b2e5501e7c86250147c9cc779785ccec7bb2a806d3c71571313e890208f","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/paths.h#L46"},{"label":"Core definition","path":"src/backend/optimizer/path/allpaths.c","sha256":"285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L88"},{"label":"Call sites","path":"src/backend/optimizer/path/allpaths.c","sha256":"285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L3423"}],"translation_provenance":{"inputs":[{"label":"Interface declaration","path":"src/include/optimizer/paths.h","sha256":"bf497b2e5501e7c86250147c9cc779785ccec7bb2a806d3c71571313e890208f","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/paths.h#L46"},{"label":"Core definition","path":"src/backend/optimizer/path/allpaths.c","sha256":"285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L88"},{"label":"Call sites","path":"src/backend/optimizer/path/allpaths.c","sha256":"285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L3423"}],"kind":"authored-source-translation","locale":"zh-Hans","source_revision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","translated_source_sha256":"4873ebb444bdf52bdfc066b803ae7c9cb9e08e3e98ce08f07ac40ac592ce93bd","version":"18"},"zh_from":"authored-source-translation"},"ManualEvidence":{"release":{"channel":"stable","label":"18","major":"18","ref":"REL_18_STABLE","revision":"753057e340da8f22e57c9a409ea7a235fd6a46bd"},"sources":[{"label":"Interface declaration","path":"src/include/optimizer/paths.h","sha256":"bf497b2e5501e7c86250147c9cc779785ccec7bb2a806d3c71571313e890208f","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/paths.h#L46"},{"label":"Core definition","path":"src/backend/optimizer/path/allpaths.c","sha256":"285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L88"},{"label":"Call sites","path":"src/backend/optimizer/path/allpaths.c","sha256":"285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d","url":"https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L3423"}]},"MeasuredEvidence":{}},"Text":{"Collection":"hook","Key":"join_search_hook","SourceDatabase":"center","Version":"18","Locale":"en","Title":"join_search_hook","Summary":"Hook for plugins to replace standard_join_search()","BodyHTML":"\u003cp\u003eHook for plugins to replace standard_join_search()\u003c/p\u003e","SourceRevision":"753057e340da8f22e57c9a409ea7a235fd6a46bd","ContentHash":"16b64ac6a19e6793089ec6b929526623e21a3a9e93464e0fb389e0720d876f38","Payload":{"description":["Hook for plugins to replace standard_join_search()"],"related":[{"label":"The Planner/Optimizer","url":"/docs/18/planner-optimizer.html"}],"sections":[{"paragraphs":["src/backend/optimizer/path/allpaths.c:3423"],"title":"Call sites"},{"code":"\t\t * We put the initial_rels list into a PlannerInfo field because\n\t\t * has_legal_joinclause() needs to look at it (ugly :-().\n\t\t */\n\t\troot-\u003einitial_rels = initial_rels;\n\n\t\tif (join_search_hook)\n\t\t\treturn (*join_search_hook) (root, levels_needed, initial_rels);\n\t\telse if (enable_geqo \u0026\u0026 levels_needed \u003e= geqo_threshold)\n\t\t\treturn geqo(root, levels_needed, initial_rels);\n\t\telse\n\t\t\treturn standard_join_search(root, levels_needed, initial_rels);\n\t}\n}\n\n/*","paragraphs":[],"title":"Core call context: src/backend/optimizer/path/allpaths.c:3417–3431"}]}},"RequestedLocale":"en","Fallback":false,"Versions":["10","11","12","13","14","15","16","17","18","19","20"],"Locales":["en","zh-Hans"],"Signatures":null,"Spellings":null,"SQLState":null,"Evidence":null}
