{"kind": "hook", "major": "18", "rows": [{"slug": "clientauthentication_hook", "name": "ClientAuthentication_hook", "name_zh": "ClientAuthentication_hook", "category": "Authentication and connections", "summary": "Hook for plugins to get control in ClientAuthentication()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/libpq/auth.h#L26", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "3a5f072463c74e5545c3e826363ce025c0e9beb72c3f1a8754fb8292f0d05342"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/libpq/auth.c#L236", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "15418faa6d6ee1b2a4ad1e50ebc9b34c2daf4799f7062df425e33dbf777ade61"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/libpq/auth.c#L597", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "15418faa6d6ee1b2a4ad1e50ebc9b34c2daf4799f7062df425e33dbf777ade61"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:597"]}, {"code": "\t\tcase uaTrust:\n\t\t\tstatus = STATUS_OK;\n\t\t\tbreak;\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:591\u2013605", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "11": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/libpq/auth.h#L26", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "f67fa69205f65d0be4db0088ab7c3a859ca35ccfa09a7f13e66725cf505f5ab7"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/libpq/auth.c#L244", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "400ded30a0146825f89e86efc2a66a08f8f31a7391a4cc8ff61160e827885f1e"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/libpq/auth.c#L605", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "400ded30a0146825f89e86efc2a66a08f8f31a7391a4cc8ff61160e827885f1e"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:605"]}, {"code": "\t\tcase uaTrust:\n\t\t\tstatus = STATUS_OK;\n\t\t\tbreak;\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:599\u2013613", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "12": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/libpq/auth.h#L26", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "e056d52ae2a186d7e06c36e234b359b78e84c68946eea3fb5ac9cc241bd6c5b9"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/libpq/auth.c#L240", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "2b9b1528350251095f1a992f21b279848cac098bc92ab0b46ce5c52e29e36ef0"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/libpq/auth.c#L613", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "2b9b1528350251095f1a992f21b279848cac098bc92ab0b46ce5c52e29e36ef0"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:613"]}, {"code": "#else\n\t\tAssert(false);\n#endif\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:607\u2013621", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "13": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/libpq/auth.h#L26", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "70ef80e7bd9cf3367cdd94796d021e4aea75e4ad8fa1d1c3b74fff0da311e203"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/libpq/auth.c#L249", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "69b6071b483aaf91d9638ca58dafaa395063baf43b0d4a5421ab590bd3e3a04b"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/libpq/auth.c#L618", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "69b6071b483aaf91d9638ca58dafaa395063baf43b0d4a5421ab590bd3e3a04b"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:618"]}, {"code": "#else\n\t\tAssert(false);\n#endif\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:612\u2013626", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "14": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/libpq/auth.h#L26", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "de30a014a41c0e60ef1bec9e8eea43e570176eb9c7de4e5417349442d26b391a"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/libpq/auth.c#L253", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "c8408d5f03a643baf14ca9f3e2d080ebd47325bd59804b0d5b89e242469d56c2"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/libpq/auth.c#L667", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "c8408d5f03a643baf14ca9f3e2d080ebd47325bd59804b0d5b89e242469d56c2"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:667"]}, {"code": "#else\n\t\tAssert(false);\n#endif\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:661\u2013675", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "15": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/libpq/auth.h#L28", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "c590dc7c1662362509f87d8458681023facbe5ab1859ef6b2b38c0516c1bf56a"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/libpq/auth.c#L244", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "fe7f3af2259e011b7033d1a45e948db3c8eebff5337c93ed9dcd638fb39b55c8"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/libpq/auth.c#L658", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "fe7f3af2259e011b7033d1a45e948db3c8eebff5337c93ed9dcd638fb39b55c8"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:658"]}, {"code": "#else\n\t\tAssert(false);\n#endif\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:652\u2013666", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "16": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/libpq/auth.h#L28", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "66c65b1a4254066bc368b56219742d0b3f21b8cad1c4cdf5bac5508414c94cd5"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/libpq/auth.c#L240", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "6803da2f479c149bec539985f611a83df73716f2b79838f0c972959a2bf2ec65"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/libpq/auth.c#L657", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "6803da2f479c149bec539985f611a83df73716f2b79838f0c972959a2bf2ec65"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:657"]}, {"code": "#else\n\t\tAssert(false);\n#endif\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:651\u2013665", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "17": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/libpq/auth.h#L28", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "a0066453dfde98129af96e8258339d958b4a400b967049ca7a9422adc7d8b8bf"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/libpq/auth.c#L238", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "3257a7b822764268e1ac47c0002959c56d203d17b008538ecb179b48c6c64e0b"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/libpq/auth.c#L671", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "3257a7b822764268e1ac47c0002959c56d203d17b008538ecb179b48c6c64e0b"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:671"]}, {"code": "\t\t\t\t\t   \"(%s:%d)\",\n\t\t\t\t\t   port->user_name, hba_authname(port->hba->auth_method),\n\t\t\t\t\t   port->hba->sourcefile, port->hba->linenumber));\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:665\u2013679", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "18": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/libpq/auth.h#L45", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "976773a9612d289da53c43129ef0438a57904cdd19ffa2ca3d6d2b00104ec241"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/libpq/auth.c#L223", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "94252cb1e2c49b0ddb15f6596d0abf8056c84493de07cc81439da4c5b07018f1"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/libpq/auth.c#L664", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "94252cb1e2c49b0ddb15f6596d0abf8056c84493de07cc81439da4c5b07018f1"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:664"]}, {"code": "\t\t\t\t\t   \"(%s:%d)\",\n\t\t\t\t\t   port->user_name, hba_authname(port->hba->auth_method),\n\t\t\t\t\t   port->hba->sourcefile, port->hba->linenumber));\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port, status, logdetail);\n}\n\n", "title": "Core call context: src/backend/libpq/auth.c:658\u2013672", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "19": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/libpq/auth.h#L45", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "8d296fc93077825992c59353c99cf4e3cb27407349c9e150a3ea90b2e36a2db2"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/libpq/auth.c#L219", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "d3ab30f5024f21b3ba60959b760898f8d84ba0a90498c3cde8c24fbb8b6ea734"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/libpq/auth.c#L668", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "d3ab30f5024f21b3ba60959b760898f8d84ba0a90498c3cde8c24fbb8b6ea734"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:668"]}, {"code": "\t\t\t\t\t   \"(%s:%d)\",\n\t\t\t\t\t   port->user_name, hba_authname(port->hba->auth_method),\n\t\t\t\t\t   port->hba->sourcefile, port->hba->linenumber));\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port,\n\t\t\t\t\tabandoned ? FATAL_CLIENT_ONLY : FATAL,\n\t\t\t\t\tstatus,\n\t\t\t\t\tlogdetail);", "title": "Core call context: src/backend/libpq/auth.c:662\u2013676", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}, "20": {"facts": [{"label": "Interface type", "value": "ClientAuthentication_hook_type"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/libpq/auth.h#L45", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "8d296fc93077825992c59353c99cf4e3cb27407349c9e150a3ea90b2e36a2db2"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/libpq/auth.c#L219", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "d3ab30f5024f21b3ba60959b760898f8d84ba0a90498c3cde8c24fbb8b6ea734"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/libpq/auth.c#L668", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "d3ab30f5024f21b3ba60959b760898f8d84ba0a90498c3cde8c24fbb8b6ea734"}], "sections": [{"title": "Core source comments", "paragraphs": ["This hook allows plugins to get control following client authentication, but before the user has been informed about the results. It could be used to record login events, insert a delay after failed authentication, etc."]}, {"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:668"]}, {"code": "\t\t\t\t\t   \"(%s:%d)\",\n\t\t\t\t\t   port->user_name, hba_authname(port->hba->auth_method),\n\t\t\t\t\t   port->hba->sourcefile, port->hba->linenumber));\n\t}\n\n\tif (ClientAuthentication_hook)\n\t\t(*ClientAuthentication_hook) (port, status);\n\n\tif (status == STATUS_OK)\n\t\tsendAuthRequest(port, AUTH_REQ_OK, NULL, 0);\n\telse\n\t\tauth_failed(port,\n\t\t\t\t\tabandoned ? FATAL_CLIENT_ONLY : FATAL,\n\t\t\t\t\tstatus,\n\t\t\t\t\tlogdetail);", "title": "Core call context: src/backend/libpq/auth.c:662\u2013676", "paragraphs": []}], "signature": "typedef void (*ClientAuthentication_hook_type) (Port *, int);\nextern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;", "description": ["Hook for plugins to get control in ClientAuthentication()"]}}, "content_hash": "ffb7f90abd6354eec46a90a9341b34dc08a1bace366c386eef1a70dbfd87c0b7", "imported_at": "2026-09-27T09:57:58.826", "url": "/wiki/hook/clientauthentication_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/clientauthentication_hook/?v=20"}], "present": true}, {"slug": "check_password_hook", "name": "check_password_hook", "name_zh": "check_password_hook", "category": "Authentication and connections", "summary": "Hook to check passwords in CreateRole() and AlterRole()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/commands/user.h#L23", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "acb3e7bc99807911910fe71a223ff409aa84351676d5a600da951817ad3f76a9"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/commands/user.c#L50", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "9fc68a5a18c4bb5388cc817d2f3f2fcdc64f2752eaa429f78f54b0b443fb59ec"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/commands/user.c#L362", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "9fc68a5a18c4bb5388cc817d2f3f2fcdc64f2752eaa429f78f54b0b443fb59ec"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:362", "src/backend/commands/user.c:761"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:356\u2013370", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:755\u2013769", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "11": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/commands/user.h#L23", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "acb3e7bc99807911910fe71a223ff409aa84351676d5a600da951817ad3f76a9"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/commands/user.c#L50", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "7aa6e101e573039b4547652ff8e5023b34bef736039a54768fef4f00d1f97136"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/commands/user.c#L362", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "7aa6e101e573039b4547652ff8e5023b34bef736039a54768fef4f00d1f97136"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:362", "src/backend/commands/user.c:761"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:356\u2013370", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:755\u2013769", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "12": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/commands/user.h#L23", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "acb3e7bc99807911910fe71a223ff409aa84351676d5a600da951817ad3f76a9"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/commands/user.c#L49", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "4f2eed417a0a43103a1d83819a0f39e4749073ff9ba52ef50c5decba458146e6"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/commands/user.c#L370", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "4f2eed417a0a43103a1d83819a0f39e4749073ff9ba52ef50c5decba458146e6"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:370", "src/backend/commands/user.c:776"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:364\u2013378", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:770\u2013784", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "13": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/commands/user.h#L23", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "acb3e7bc99807911910fe71a223ff409aa84351676d5a600da951817ad3f76a9"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/commands/user.c#L49", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "0397346047e5b744c705075f56afc7a76a558672dac179a41505dc880b03cb66"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/commands/user.c#L370", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "0397346047e5b744c705075f56afc7a76a558672dac179a41505dc880b03cb66"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:370", "src/backend/commands/user.c:776"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:364\u2013378", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:770\u2013784", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "14": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/commands/user.h#L23", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "acb3e7bc99807911910fe71a223ff409aa84351676d5a600da951817ad3f76a9"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/commands/user.c#L49", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "c6a692fc7b15efba556b1ca54e055995fe6b2359d2358074e3e47b6bca367c0d"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/commands/user.c#L370", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "c6a692fc7b15efba556b1ca54e055995fe6b2359d2358074e3e47b6bca367c0d"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:370", "src/backend/commands/user.c:776"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:364\u2013378", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:770\u2013784", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "15": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/commands/user.h#L23", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "b07cf0ae584d791cba6474bf5e4a5eb63b8a8a07af87786bf6ad86a82a508187"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/commands/user.c#L50", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "16c253691c40cea4dc11a61174e4a94f79a8c592e0f68e07a9149ffb7a299d47"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/commands/user.c#L332", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "16c253691c40cea4dc11a61174e4a94f79a8c592e0f68e07a9149ffb7a299d47"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:332", "src/backend/commands/user.c:685"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:326\u2013340", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:679\u2013693", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "16": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/commands/user.h#L25", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "07915b0338269813ec0931d1403f3b4d9e837d789aeeef73125dee3f6d197eaa"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/commands/user.c#L92", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "444d24b777e2fd2edca6051179d789efaf0613cc502a55a10ed33a6c9d8131ae"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/commands/user.c#L400", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "444d24b777e2fd2edca6051179d789efaf0613cc502a55a10ed33a6c9d8131ae"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:400", "src/backend/commands/user.c:850"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:394\u2013408", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:844\u2013858", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "17": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/commands/user.h#L25", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "07915b0338269813ec0931d1403f3b4d9e837d789aeeef73125dee3f6d197eaa"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/commands/user.c#L91", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "99ef1d657d0c774f695f511aeccc40fbf5b19fdec0d8fc16359cde73c6f87090"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/commands/user.c#L399", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "99ef1d657d0c774f695f511aeccc40fbf5b19fdec0d8fc16359cde73c6f87090"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:399", "src/backend/commands/user.c:849"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:393\u2013407", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:843\u2013857", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "18": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/commands/user.h#L25", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "07915b0338269813ec0931d1403f3b4d9e837d789aeeef73125dee3f6d197eaa"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/user.c#L91", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "53455e7697c69d5fcb687fcc223e11d827b9f8c3d71f8072a67a08189ae610fa"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/user.c#L399", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "53455e7697c69d5fcb687fcc223e11d827b9f8c3d71f8072a67a08189ae610fa"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:399", "src/backend/commands/user.c:849"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:393\u2013407", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:843\u2013857", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "19": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/commands/user.h#L25", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "07915b0338269813ec0931d1403f3b4d9e837d789aeeef73125dee3f6d197eaa"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/user.c#L92", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "e193f1fbfc7cde9fdf85bb3d5ef8a5b445da8d0f3206acb3536fbdcd0cc31347"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/user.c#L406", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "e193f1fbfc7cde9fdf85bb3d5ef8a5b445da8d0f3206acb3536fbdcd0cc31347"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:406", "src/backend/commands/user.c:856"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:400\u2013414", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:850\u2013864", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}, "20": {"facts": [{"label": "Interface type", "value": "check_password_hook_type"}, {"label": "Header", "value": "src/include/commands/user.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/commands/user.h#L25", "path": "src/include/commands/user.h", "label": "Interface declaration", "sha256": "07915b0338269813ec0931d1403f3b4d9e837d789aeeef73125dee3f6d197eaa"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/user.c#L92", "path": "src/backend/commands/user.c", "label": "Core definition", "sha256": "e193f1fbfc7cde9fdf85bb3d5ef8a5b445da8d0f3206acb3536fbdcd0cc31347"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/user.c#L406", "path": "src/backend/commands/user.c", "label": "Call sites", "sha256": "e193f1fbfc7cde9fdf85bb3d5ef8a5b445da8d0f3206acb3536fbdcd0cc31347"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/user.c:406", "src/backend/commands/user.c:856"]}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (stmt->role,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build a tuple to insert\n\t */", "title": "Core call context: src/backend/commands/user.c:400\u2013414", "paragraphs": []}, {"code": "\t}\n\n\t/*\n\t * Call the password checking hook if there is one defined\n\t */\n\tif (check_password_hook && password)\n\t\t(*check_password_hook) (rolename,\n\t\t\t\t\t\t\t\tpassword,\n\t\t\t\t\t\t\t\tget_password_type(password),\n\t\t\t\t\t\t\t\tvalidUntil_datum,\n\t\t\t\t\t\t\t\tvalidUntil_null);\n\n\t/*\n\t * Build an updated tuple, perusing the information just obtained\n\t */", "title": "Core call context: src/backend/commands/user.c:850\u2013864", "paragraphs": []}], "signature": "typedef void (*check_password_hook_type) (const char *username, const char *shadow_pass, PasswordType password_type, Datum validuntil_time, bool validuntil_null);\nextern PGDLLIMPORT check_password_hook_type check_password_hook;", "description": ["Hook to check passwords in CreateRole() and AlterRole()"]}}, "content_hash": "a52cdfa1c41379cdfed44c8b1e65fd486ec0e66d0fc026a22fc56b09016e6c16", "imported_at": "2026-09-27T09:57:58.819", "url": "/wiki/hook/check_password_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/check_password_hook/?v=20"}], "present": true}, {"slug": "ldap_password_hook", "name": "ldap_password_hook", "name_zh": "ldap_password_hook", "category": "Authentication and connections", "summary": "hook type for password manglers", "aliases": [], "versions": {"16": {"facts": [{"label": "Interface type", "value": "auth_password_hook_typ"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "dummy_ldap_password_mutator"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/libpq/auth.h#L32", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "66c65b1a4254066bc368b56219742d0b3f21b8cad1c4cdf5bac5508414c94cd5"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/libpq/auth.c#L157", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "6803da2f479c149bec539985f611a83df73716f2b79838f0c972959a2bf2ec65"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/libpq/auth.c#L2529", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "6803da2f479c149bec539985f611a83df73716f2b79838f0c972959a2bf2ec65"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:2529"]}, {"code": "\t\t/*\n\t\t * Bind with a pre-defined username/password (if available) for\n\t\t * searching. If none is specified, this turns into an anonymous bind.\n\t\t */\n\t\tr = ldap_simple_bind_s(ldap,\n\t\t\t\t\t\t\t   port->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\t   port->hba->ldapbindpasswd ? ldap_password_hook(port->hba->ldapbindpasswd) : \"\");\n\t\tif (r != LDAP_SUCCESS)\n\t\t{\n\t\t\tereport(LOG,\n\t\t\t\t\t(errmsg(\"could not perform initial LDAP bind for ldapbinddn \\\"%s\\\" on server \\\"%s\\\": %s\",\n\t\t\t\t\t\t\tport->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\tserver_name,\n\t\t\t\t\t\t\tldap_err2string(r)),\n\t\t\t\t\t errdetail_for_ldap(ldap)));", "title": "Core call context: src/backend/libpq/auth.c:2523\u20132537", "paragraphs": []}], "signature": "typedef char *(*auth_password_hook_typ) (char *input);\nextern PGDLLIMPORT auth_password_hook_typ ldap_password_hook;", "description": ["hook type for password manglers"]}, "17": {"facts": [{"label": "Interface type", "value": "auth_password_hook_typ"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "dummy_ldap_password_mutator"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/libpq/auth.h#L32", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "a0066453dfde98129af96e8258339d958b4a400b967049ca7a9422adc7d8b8bf"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/libpq/auth.c#L155", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "3257a7b822764268e1ac47c0002959c56d203d17b008538ecb179b48c6c64e0b"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/libpq/auth.c#L2538", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "3257a7b822764268e1ac47c0002959c56d203d17b008538ecb179b48c6c64e0b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:2538"]}, {"code": "\t\t/*\n\t\t * Bind with a pre-defined username/password (if available) for\n\t\t * searching. If none is specified, this turns into an anonymous bind.\n\t\t */\n\t\tr = ldap_simple_bind_s(ldap,\n\t\t\t\t\t\t\t   port->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\t   port->hba->ldapbindpasswd ? ldap_password_hook(port->hba->ldapbindpasswd) : \"\");\n\t\tif (r != LDAP_SUCCESS)\n\t\t{\n\t\t\tereport(LOG,\n\t\t\t\t\t(errmsg(\"could not perform initial LDAP bind for ldapbinddn \\\"%s\\\" on server \\\"%s\\\": %s\",\n\t\t\t\t\t\t\tport->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\tserver_name,\n\t\t\t\t\t\t\tldap_err2string(r)),\n\t\t\t\t\t errdetail_for_ldap(ldap)));", "title": "Core call context: src/backend/libpq/auth.c:2532\u20132546", "paragraphs": []}], "signature": "typedef char *(*auth_password_hook_typ) (char *input);\nextern PGDLLIMPORT auth_password_hook_typ ldap_password_hook;", "description": ["hook type for password manglers"]}, "18": {"facts": [{"label": "Interface type", "value": "auth_password_hook_typ"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "dummy_ldap_password_mutator"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/libpq/auth.h#L49", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "976773a9612d289da53c43129ef0438a57904cdd19ffa2ca3d6d2b00104ec241"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/libpq/auth.c#L156", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "94252cb1e2c49b0ddb15f6596d0abf8056c84493de07cc81439da4c5b07018f1"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/libpq/auth.c#L2536", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "94252cb1e2c49b0ddb15f6596d0abf8056c84493de07cc81439da4c5b07018f1"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:2536"]}, {"code": "\t\t/*\n\t\t * Bind with a pre-defined username/password (if available) for\n\t\t * searching. If none is specified, this turns into an anonymous bind.\n\t\t */\n\t\tr = ldap_simple_bind_s(ldap,\n\t\t\t\t\t\t\t   port->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\t   port->hba->ldapbindpasswd ? ldap_password_hook(port->hba->ldapbindpasswd) : \"\");\n\t\tif (r != LDAP_SUCCESS)\n\t\t{\n\t\t\tereport(LOG,\n\t\t\t\t\t(errmsg(\"could not perform initial LDAP bind for ldapbinddn \\\"%s\\\" on server \\\"%s\\\": %s\",\n\t\t\t\t\t\t\tport->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\tserver_name,\n\t\t\t\t\t\t\tldap_err2string(r)),\n\t\t\t\t\t errdetail_for_ldap(ldap)));", "title": "Core call context: src/backend/libpq/auth.c:2530\u20132544", "paragraphs": []}], "signature": "typedef char *(*auth_password_hook_typ) (char *input);\nextern PGDLLIMPORT auth_password_hook_typ ldap_password_hook;", "description": ["hook type for password manglers"]}, "19": {"facts": [{"label": "Interface type", "value": "auth_password_hook_typ"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "dummy_ldap_password_mutator"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/libpq/auth.h#L49", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "8d296fc93077825992c59353c99cf4e3cb27407349c9e150a3ea90b2e36a2db2"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/libpq/auth.c#L159", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "d3ab30f5024f21b3ba60959b760898f8d84ba0a90498c3cde8c24fbb8b6ea734"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/libpq/auth.c#L2583", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "d3ab30f5024f21b3ba60959b760898f8d84ba0a90498c3cde8c24fbb8b6ea734"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:2583"]}, {"code": "\t\t/*\n\t\t * Bind with a pre-defined username/password (if available) for\n\t\t * searching. If none is specified, this turns into an anonymous bind.\n\t\t */\n\t\tr = ldap_simple_bind_s(ldap,\n\t\t\t\t\t\t\t   port->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\t   port->hba->ldapbindpasswd ? ldap_password_hook(port->hba->ldapbindpasswd) : \"\");\n\t\tif (r != LDAP_SUCCESS)\n\t\t{\n\t\t\tereport(LOG,\n\t\t\t\t\t(errmsg(\"could not perform initial LDAP bind for ldapbinddn \\\"%s\\\" on server \\\"%s\\\": %s\",\n\t\t\t\t\t\t\tport->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\tserver_name,\n\t\t\t\t\t\t\tldap_err2string(r)),\n\t\t\t\t\t errdetail_for_ldap(ldap)));", "title": "Core call context: src/backend/libpq/auth.c:2577\u20132591", "paragraphs": []}], "signature": "typedef char *(*auth_password_hook_typ) (char *input);\nextern PGDLLIMPORT auth_password_hook_typ ldap_password_hook;", "description": ["hook type for password manglers"]}, "20": {"facts": [{"label": "Interface type", "value": "auth_password_hook_typ"}, {"label": "Header", "value": "src/include/libpq/auth.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "dummy_ldap_password_mutator"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/libpq/auth.h#L49", "path": "src/include/libpq/auth.h", "label": "Interface declaration", "sha256": "8d296fc93077825992c59353c99cf4e3cb27407349c9e150a3ea90b2e36a2db2"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/libpq/auth.c#L159", "path": "src/backend/libpq/auth.c", "label": "Core definition", "sha256": "d3ab30f5024f21b3ba60959b760898f8d84ba0a90498c3cde8c24fbb8b6ea734"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/libpq/auth.c#L2583", "path": "src/backend/libpq/auth.c", "label": "Call sites", "sha256": "d3ab30f5024f21b3ba60959b760898f8d84ba0a90498c3cde8c24fbb8b6ea734"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/auth.c:2583"]}, {"code": "\t\t/*\n\t\t * Bind with a pre-defined username/password (if available) for\n\t\t * searching. If none is specified, this turns into an anonymous bind.\n\t\t */\n\t\tr = ldap_simple_bind_s(ldap,\n\t\t\t\t\t\t\t   port->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\t   port->hba->ldapbindpasswd ? ldap_password_hook(port->hba->ldapbindpasswd) : \"\");\n\t\tif (r != LDAP_SUCCESS)\n\t\t{\n\t\t\tereport(LOG,\n\t\t\t\t\t(errmsg(\"could not perform initial LDAP bind for ldapbinddn \\\"%s\\\" on server \\\"%s\\\": %s\",\n\t\t\t\t\t\t\tport->hba->ldapbinddn ? port->hba->ldapbinddn : \"\",\n\t\t\t\t\t\t\tserver_name,\n\t\t\t\t\t\t\tldap_err2string(r)),\n\t\t\t\t\t errdetail_for_ldap(ldap)));", "title": "Core call context: src/backend/libpq/auth.c:2577\u20132591", "paragraphs": []}], "signature": "typedef char *(*auth_password_hook_typ) (char *input);\nextern PGDLLIMPORT auth_password_hook_typ ldap_password_hook;", "description": ["hook type for password manglers"]}}, "content_hash": "480366d39b4b4c734bdcd1f51ddba0f75f94b0196e8c480d370aefad6c512c3b", "imported_at": "2026-09-27T09:57:58.828", "url": "/wiki/hook/ldap_password_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/ldap_password_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/ldap_password_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/ldap_password_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/ldap_password_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/ldap_password_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/ldap_password_hook/?v=15"}, {"major": "16", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 16 \u00b7 First recorded in this sample", "url": "/wiki/hook/ldap_password_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/ldap_password_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/ldap_password_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/ldap_password_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/ldap_password_hook/?v=20"}], "present": true}, {"slug": "openssl_tls_init_hook", "name": "openssl_tls_init_hook", "name_zh": "openssl_tls_init_hook", "category": "Authentication and connections", "summary": "Call init hook (usually to set password callback)", "aliases": [], "versions": {"13": {"facts": [{"label": "Interface type", "value": "openssl_tls_init_hook_typ"}, {"label": "Header", "value": "src/include/libpq/libpq-be.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "default_openssl_tls_init"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/libpq/libpq-be.h#L293", "path": "src/include/libpq/libpq-be.h", "label": "Interface declaration", "sha256": "79267bb3363037d70410e0f595211f4da3918ea92bdfe34ae9f7a015d1762cc0"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/libpq/be-secure-openssl.c#L50", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Core definition", "sha256": "4965fce722f893397fc7ffe3bb3814569dd7056b789246b0d3c975a30f5f3161"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/libpq/be-secure-openssl.c#L129", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Call sites", "sha256": "4965fce722f893397fc7ffe3bb3814569dd7056b789246b0d3c975a30f5f3161"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/be-secure-openssl.c:129"]}, {"code": "\t */\n\tSSL_CTX_set_mode(context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n\n\t/*\n\t * Call init hook (usually to set password callback)\n\t */\n\t(*openssl_tls_init_hook) (context, isServerStart);\n\n\t/* used by the callback */\n\tssl_is_server_start = isServerStart;\n\n\t/*\n\t * Load and verify server's certificate and private key\n\t */\n\tif (SSL_CTX_use_certificate_chain_file(context, ssl_cert_file) != 1)", "title": "Core call context: src/backend/libpq/be-secure-openssl.c:123\u2013137", "paragraphs": []}], "signature": "typedef void (*openssl_tls_init_hook_typ) (SSL_CTX *context, bool isServerStart);\nextern PGDLLIMPORT openssl_tls_init_hook_typ openssl_tls_init_hook;", "description": ["Call init hook (usually to set password callback)"]}, "14": {"facts": [{"label": "Interface type", "value": "openssl_tls_init_hook_typ"}, {"label": "Header", "value": "src/include/libpq/libpq-be.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "default_openssl_tls_init"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/libpq/libpq-be.h#L311", "path": "src/include/libpq/libpq-be.h", "label": "Interface declaration", "sha256": "7879d08ca8eaf5045b82e2b8236e1d77f38f6ad16bcd4bc8dc3d5ef6e92c8c09"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/libpq/be-secure-openssl.c#L50", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Core definition", "sha256": "e91f7cade802e2f5826d90336d8de1601341abbe1b9be6b75ead06ff437722ba"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/libpq/be-secure-openssl.c#L129", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Call sites", "sha256": "e91f7cade802e2f5826d90336d8de1601341abbe1b9be6b75ead06ff437722ba"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/be-secure-openssl.c:129"]}, {"code": "\t */\n\tSSL_CTX_set_mode(context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n\n\t/*\n\t * Call init hook (usually to set password callback)\n\t */\n\t(*openssl_tls_init_hook) (context, isServerStart);\n\n\t/* used by the callback */\n\tssl_is_server_start = isServerStart;\n\n\t/*\n\t * Load and verify server's certificate and private key\n\t */\n\tif (SSL_CTX_use_certificate_chain_file(context, ssl_cert_file) != 1)", "title": "Core call context: src/backend/libpq/be-secure-openssl.c:123\u2013137", "paragraphs": []}], "signature": "typedef void (*openssl_tls_init_hook_typ) (SSL_CTX *context, bool isServerStart);\nextern PGDLLIMPORT openssl_tls_init_hook_typ openssl_tls_init_hook;", "description": ["Call init hook (usually to set password callback)"]}, "15": {"facts": [{"label": "Interface type", "value": "openssl_tls_init_hook_typ"}, {"label": "Header", "value": "src/include/libpq/libpq-be.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "default_openssl_tls_init"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/libpq/libpq-be.h#L310", "path": "src/include/libpq/libpq-be.h", "label": "Interface declaration", "sha256": "4c5ca3dc4b4b058af1d67a9a22a76171c4b4a13938b7ed00c418f53a81b7e4f9"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/libpq/be-secure-openssl.c#L57", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Core definition", "sha256": "e64233e571eb95cabc65b7e143358743668df4b8812ffaa3add3016edf5eab82"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/libpq/be-secure-openssl.c#L136", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Call sites", "sha256": "e64233e571eb95cabc65b7e143358743668df4b8812ffaa3add3016edf5eab82"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/be-secure-openssl.c:136"]}, {"code": "\t */\n\tSSL_CTX_set_mode(context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n\n\t/*\n\t * Call init hook (usually to set password callback)\n\t */\n\t(*openssl_tls_init_hook) (context, isServerStart);\n\n\t/* used by the callback */\n\tssl_is_server_start = isServerStart;\n\n\t/*\n\t * Load and verify server's certificate and private key\n\t */\n\tif (SSL_CTX_use_certificate_chain_file(context, ssl_cert_file) != 1)", "title": "Core call context: src/backend/libpq/be-secure-openssl.c:130\u2013144", "paragraphs": []}], "signature": "typedef void (*openssl_tls_init_hook_typ) (SSL_CTX *context, bool isServerStart);\nextern PGDLLIMPORT openssl_tls_init_hook_typ openssl_tls_init_hook;", "description": ["Call init hook (usually to set password callback)"]}, "16": {"facts": [{"label": "Interface type", "value": "openssl_tls_init_hook_typ"}, {"label": "Header", "value": "src/include/libpq/libpq-be.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "default_openssl_tls_init"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/libpq/libpq-be.h#L319", "path": "src/include/libpq/libpq-be.h", "label": "Interface declaration", "sha256": "29b74059bb0439d8cef77b7cf6b61760084649fd1bb585c55ccd2d7b553b710b"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/libpq/be-secure-openssl.c#L57", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Core definition", "sha256": "aff351b26a88ac9a39920cee063b4b337cf1a898d7cd3f44c734c5ae2b7ca47a"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/libpq/be-secure-openssl.c#L139", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Call sites", "sha256": "aff351b26a88ac9a39920cee063b4b337cf1a898d7cd3f44c734c5ae2b7ca47a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/be-secure-openssl.c:139"]}, {"code": "\t */\n\tSSL_CTX_set_mode(context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n\n\t/*\n\t * Call init hook (usually to set password callback)\n\t */\n\t(*openssl_tls_init_hook) (context, isServerStart);\n\n\t/* used by the callback */\n\tssl_is_server_start = isServerStart;\n\n\t/*\n\t * Load and verify server's certificate and private key\n\t */\n\tif (SSL_CTX_use_certificate_chain_file(context, ssl_cert_file) != 1)", "title": "Core call context: src/backend/libpq/be-secure-openssl.c:133\u2013147", "paragraphs": []}], "signature": "typedef void (*openssl_tls_init_hook_typ) (SSL_CTX *context, bool isServerStart);\nextern PGDLLIMPORT openssl_tls_init_hook_typ openssl_tls_init_hook;", "description": ["Call init hook (usually to set password callback)"]}, "17": {"facts": [{"label": "Interface type", "value": "openssl_tls_init_hook_typ"}, {"label": "Header", "value": "src/include/libpq/libpq-be.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "default_openssl_tls_init"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/libpq/libpq-be.h#L326", "path": "src/include/libpq/libpq-be.h", "label": "Interface declaration", "sha256": "efa84547718a4027a4f8d786fc3dae0b090feda9f489b18b61b4ebae4e8e1fb4"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/libpq/be-secure-openssl.c#L57", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Core definition", "sha256": "f4cc17235758b4a81811c34b916858c0e69344992f308e285573fa4e912bfe7c"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/libpq/be-secure-openssl.c#L145", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Call sites", "sha256": "f4cc17235758b4a81811c34b916858c0e69344992f308e285573fa4e912bfe7c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/be-secure-openssl.c:145"]}, {"code": "\t */\n\tSSL_CTX_set_mode(context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n\n\t/*\n\t * Call init hook (usually to set password callback)\n\t */\n\t(*openssl_tls_init_hook) (context, isServerStart);\n\n\t/* used by the callback */\n\tssl_is_server_start = isServerStart;\n\n\t/*\n\t * Load and verify server's certificate and private key\n\t */\n\tif (SSL_CTX_use_certificate_chain_file(context, ssl_cert_file) != 1)", "title": "Core call context: src/backend/libpq/be-secure-openssl.c:139\u2013153", "paragraphs": []}], "signature": "typedef void (*openssl_tls_init_hook_typ) (SSL_CTX *context, bool isServerStart);\nextern PGDLLIMPORT openssl_tls_init_hook_typ openssl_tls_init_hook;", "description": ["Call init hook (usually to set password callback)"]}, "18": {"facts": [{"label": "Interface type", "value": "openssl_tls_init_hook_typ"}, {"label": "Header", "value": "src/include/libpq/libpq-be.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "default_openssl_tls_init"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/libpq/libpq-be.h#L335", "path": "src/include/libpq/libpq-be.h", "label": "Interface declaration", "sha256": "1588b2cfe9ea1f737055880b8d09667feb59d918ab16dfeb855b0eae996596db"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/libpq/be-secure-openssl.c#L57", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Core definition", "sha256": "68195987503c2b0c32048559352fa8e7e7265cdd047777941eb8fefae98fb4f7"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/libpq/be-secure-openssl.c#L132", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Call sites", "sha256": "68195987503c2b0c32048559352fa8e7e7265cdd047777941eb8fefae98fb4f7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/be-secure-openssl.c:132"]}, {"code": "\t */\n\tSSL_CTX_set_mode(context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n\n\t/*\n\t * Call init hook (usually to set password callback)\n\t */\n\t(*openssl_tls_init_hook) (context, isServerStart);\n\n\t/* used by the callback */\n\tssl_is_server_start = isServerStart;\n\n\t/*\n\t * Load and verify server's certificate and private key\n\t */\n\tif (SSL_CTX_use_certificate_chain_file(context, ssl_cert_file) != 1)", "title": "Core call context: src/backend/libpq/be-secure-openssl.c:126\u2013140", "paragraphs": []}], "signature": "typedef void (*openssl_tls_init_hook_typ) (SSL_CTX *context, bool isServerStart);\nextern PGDLLIMPORT openssl_tls_init_hook_typ openssl_tls_init_hook;", "description": ["Call init hook (usually to set password callback)"]}, "19": {"facts": [{"label": "Interface type", "value": "openssl_tls_init_hook_typ"}, {"label": "Header", "value": "src/include/libpq/libpq-be.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "default_openssl_tls_init"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/libpq/libpq-be.h#L335", "path": "src/include/libpq/libpq-be.h", "label": "Interface declaration", "sha256": "545d2f582f009763d2a5c31618e54d4bfd40018d5ee4f5f41716f897ab43c1d6"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/libpq/be-secure-openssl.c#L78", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Core definition", "sha256": "c189b9b2ae40c72866e4da45ec09a6273ba4f3921be4fb6d3e3a94382d6203c7"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/libpq/be-secure-openssl.c#L634", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Call sites", "sha256": "c189b9b2ae40c72866e4da45ec09a6273ba4f3921be4fb6d3e3a94382d6203c7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/be-secure-openssl.c:634"]}, {"code": "\t * TLS context used so it cannot function properly; we warn if one has\n\t * been installed.\n\t *\n\t * If SNI is enabled, we set password callback based what was configured.\n\t */\n\tif (!ssl_sni)\n\t\t(*openssl_tls_init_hook) (ctx, isServerStart);\n\telse\n\t{\n\t\tif (openssl_tls_init_hook != default_openssl_tls_init && !init_warned)\n\t\t{\n\t\t\tereport(WARNING,\n\t\t\t\t\terrcode(ERRCODE_CONFIG_FILE_ERROR),\n\t\t\t\t\terrmsg(\"SNI is enabled; installed TLS init hook will be ignored\"),\n\t\t\t/*- translator: first %s is a GUC, second %s contains a filename */", "title": "Core call context: src/backend/libpq/be-secure-openssl.c:628\u2013642", "paragraphs": []}], "signature": "typedef void (*openssl_tls_init_hook_typ) (SSL_CTX *context, bool isServerStart);\nextern PGDLLIMPORT openssl_tls_init_hook_typ openssl_tls_init_hook;", "description": ["openssl_tls_init_hook: core extension hook declared in src/include/libpq/libpq-be.h. The exact interface and call sites are recorded below."]}, "20": {"facts": [{"label": "Interface type", "value": "openssl_tls_init_hook_typ"}, {"label": "Header", "value": "src/include/libpq/libpq-be.h"}, {"label": "Subsystem", "value": "Authentication and connections"}, {"label": "Initial value", "value": "default_openssl_tls_init"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/libpq/libpq-be.h#L335", "path": "src/include/libpq/libpq-be.h", "label": "Interface declaration", "sha256": "545d2f582f009763d2a5c31618e54d4bfd40018d5ee4f5f41716f897ab43c1d6"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/libpq/be-secure-openssl.c#L78", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Core definition", "sha256": "7fed824adeabf2abd3773c13ef5eaa8c76b09123efbd318b7c592f1319245584"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/libpq/be-secure-openssl.c#L644", "path": "src/backend/libpq/be-secure-openssl.c", "label": "Call sites", "sha256": "7fed824adeabf2abd3773c13ef5eaa8c76b09123efbd318b7c592f1319245584"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/libpq/be-secure-openssl.c:644"]}, {"code": "\t * TLS context used so it cannot function properly; we warn if one has\n\t * been installed.\n\t *\n\t * If SNI is enabled, we set password callback based what was configured.\n\t */\n\tif (!ssl_sni)\n\t\t(*openssl_tls_init_hook) (ctx, isServerStart);\n\telse\n\t{\n\t\tif (openssl_tls_init_hook != default_openssl_tls_init && !*hasWarned)\n\t\t{\n\t\t\tereport(WARNING,\n\t\t\t\t\terrcode(ERRCODE_CONFIG_FILE_ERROR),\n\t\t\t\t\terrmsg(\"SNI is enabled; installed TLS init hook will be ignored\"),\n\t\t\t/*- translator: first %s is a GUC, second %s contains a filename */", "title": "Core call context: src/backend/libpq/be-secure-openssl.c:638\u2013652", "paragraphs": []}], "signature": "typedef void (*openssl_tls_init_hook_typ) (SSL_CTX *context, bool isServerStart);\nextern PGDLLIMPORT openssl_tls_init_hook_typ openssl_tls_init_hook;", "description": ["openssl_tls_init_hook: core extension hook declared in src/include/libpq/libpq-be.h. The exact interface and call sites are recorded below."]}}, "content_hash": "61b2e6517ab7c91122da207af487a933a710cef5d167514d87702a65fec3500f", "imported_at": "2026-09-27T09:57:58.830", "url": "/wiki/hook/openssl_tls_init_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/openssl_tls_init_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/openssl_tls_init_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/openssl_tls_init_hook/?v=12"}, {"major": "13", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 13 \u00b7 First recorded in this sample", "url": "/wiki/hook/openssl_tls_init_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/openssl_tls_init_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/openssl_tls_init_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/openssl_tls_init_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/openssl_tls_init_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/openssl_tls_init_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/openssl_tls_init_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/openssl_tls_init_hook/?v=20"}], "present": true}, {"slug": "explainonequery_hook", "name": "ExplainOneQuery_hook", "name_zh": "ExplainOneQuery_hook", "category": "EXPLAIN", "summary": "Hook for plugins to get control in ExplainOneQuery()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=10", "label": "EXPLAIN"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/commands/explain.h#L51", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "83095ec641f8dd8a8aff61104f476a5c7879fac321ecb46bcf2d230a26e8ae14"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/commands/explain.c#L44", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "a785298532047cfeda969e78c3597a343dc1c56d61ba85830b0f16a02a14b5a1"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/commands/explain.c#L356", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "a785298532047cfeda969e78c3597a343dc1c56d61ba85830b0f16a02a14b5a1"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:356"]}, {"code": "\t\t\t\t\t\t  queryEnv);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params);\n\telse\n\t{\n\t\tPlannedStmt *plan;\n\t\tinstr_time\tplanstart,\n\t\t\t\t\tplanduration;\n\n\t\tINSTR_TIME_SET_CURRENT(planstart);", "title": "Core call context: src/backend/commands/explain.c:350\u2013364", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "11": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=11", "label": "EXPLAIN"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/commands/explain.h#L51", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "0db925e1fcbada78bb7ef4fb90e3e33caf64ab9640c93bbe2920dfabf222e721"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/commands/explain.c#L45", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "9df8400c1a4377179572ceb916d6020fca4e2760f74bf416d77ed97476523bbd"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/commands/explain.c#L355", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "9df8400c1a4377179572ceb916d6020fca4e2760f74bf416d77ed97476523bbd"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:355"]}, {"code": "\t\t\t\t\t\t  queryEnv);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params, queryEnv);\n\telse\n\t{\n\t\tPlannedStmt *plan;\n\t\tinstr_time\tplanstart,\n\t\t\t\t\tplanduration;\n\n\t\tINSTR_TIME_SET_CURRENT(planstart);", "title": "Core call context: src/backend/commands/explain.c:349\u2013363", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "12": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=12", "label": "EXPLAIN"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/commands/explain.h#L52", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "ffc72104e557e06d69bd79eaed2ebb0268f584d1ce6348cbc3b838548cffc1f9"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/commands/explain.c#L44", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "d02ea84fdaa201de5d9360645a9f24bfbd2c31f7d45a639e09560ac0e6b6471d"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/commands/explain.c#L357", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "d02ea84fdaa201de5d9360645a9f24bfbd2c31f7d45a639e09560ac0e6b6471d"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:357"]}, {"code": "\t\t\t\t\t\t  queryEnv);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params, queryEnv);\n\telse\n\t{\n\t\tPlannedStmt *plan;\n\t\tinstr_time\tplanstart,\n\t\t\t\t\tplanduration;\n\n\t\tINSTR_TIME_SET_CURRENT(planstart);", "title": "Core call context: src/backend/commands/explain.c:351\u2013365", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "13": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=13", "label": "EXPLAIN"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/commands/explain.h#L65", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "d63f9c12b4732512f365a634b4effbc15f4192eef9bd4c573b313aff09c9887d"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/commands/explain.c#L44", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "541713e0e7f1c9cc352c2b6028964d440c19d2678a4463000094c24a88c1e730"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/commands/explain.c#L376", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "541713e0e7f1c9cc352c2b6028964d440c19d2678a4463000094c24a88c1e730"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:376"]}, {"code": "\t\t\t\t\t\t  queryEnv);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params, queryEnv);\n\telse\n\t{\n\t\tPlannedStmt *plan;\n\t\tinstr_time\tplanstart,\n\t\t\t\t\tplanduration;\n\t\tBufferUsage bufusage_start,\n\t\t\t\t\tbufusage;", "title": "Core call context: src/backend/commands/explain.c:370\u2013384", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "14": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=14", "label": "EXPLAIN"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/commands/explain.h#L65", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "3981f2b6dc0e07b4a9895a90760f3d6b3c9b2e652520cded32a55cbad2bf7f12"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/commands/explain.c#L45", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "e091be4e2a083b8dea39ccd09beedede22c1716ef974da66c214a44f48be8c41"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/commands/explain.c#L382", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "e091be4e2a083b8dea39ccd09beedede22c1716ef974da66c214a44f48be8c41"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:382"]}, {"code": "\t\t\t\t\t\t  queryEnv);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params, queryEnv);\n\telse\n\t{\n\t\tPlannedStmt *plan;\n\t\tinstr_time\tplanstart,\n\t\t\t\t\tplanduration;\n\t\tBufferUsage bufusage_start,\n\t\t\t\t\tbufusage;", "title": "Core call context: src/backend/commands/explain.c:376\u2013390", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "15": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=15", "label": "EXPLAIN"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/commands/explain.h#L65", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "463daa126ef5dac0fb4aaff0a8c34f717536f815c117908be1c35c7e8997ed85"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/commands/explain.c#L45", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "bb3b442d0f1b098aa8707335250102f027a596cd94117308bd16d1d36b258f5c"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/commands/explain.c#L382", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "bb3b442d0f1b098aa8707335250102f027a596cd94117308bd16d1d36b258f5c"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:382"]}, {"code": "\t\t\t\t\t\t  queryEnv);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params, queryEnv);\n\telse\n\t{\n\t\tPlannedStmt *plan;\n\t\tinstr_time\tplanstart,\n\t\t\t\t\tplanduration;\n\t\tBufferUsage bufusage_start,\n\t\t\t\t\tbufusage;", "title": "Core call context: src/backend/commands/explain.c:376\u2013390", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "16": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=16", "label": "EXPLAIN"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/commands/explain.h#L66", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "eecdb37c84d097a4b6d5d4fa915c141aec640c01110ca0eedd60cf0dea9aaacf"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/commands/explain.c#L45", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "8e017f0116dbea471339b40c37a667cc9f95039e7e0329c783e5e8ce194de7e1"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/commands/explain.c#L391", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "8e017f0116dbea471339b40c37a667cc9f95039e7e0329c783e5e8ce194de7e1"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:391"]}, {"code": "\t\t\t\t\t\t  queryEnv);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params, queryEnv);\n\telse\n\t{\n\t\tPlannedStmt *plan;\n\t\tinstr_time\tplanstart,\n\t\t\t\t\tplanduration;\n\t\tBufferUsage bufusage_start,\n\t\t\t\t\tbufusage;", "title": "Core call context: src/backend/commands/explain.c:385\u2013399", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "17": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=17", "label": "EXPLAIN"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/commands/explain.h#L75", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "ac0a90763187efbe0eba8f228724994d58ac02fa0e2a81613a73236c8104c728"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/commands/explain.c#L46", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "741251b1a3b6d269a52a673d42eb63b02e13a5872db7b359b137086ab21b63c8"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/commands/explain.c#L443", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "741251b1a3b6d269a52a673d42eb63b02e13a5872db7b359b137086ab21b63c8"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:443"]}, {"code": "\t\t\t\t\t\t  queryEnv);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params, queryEnv);\n\telse\n\t\tstandard_ExplainOneQuery(query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t queryString, params, queryEnv);\n}\n\n/*\n * standard_ExplainOneQuery -", "title": "Core call context: src/backend/commands/explain.c:437\u2013451", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "18": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=18", "label": "EXPLAIN"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/commands/explain.h#L22", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "a8ef9548bccebb3c8f5255e8295d1d53dd0e4ea54b6be8b17dfe163ef2918b7f"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L50", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L306", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:306"]}, {"code": "\t\tExplainOneUtility(query->utilityStmt, into, es, pstate, params);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t pstate->p_sourcetext, params, pstate->p_queryEnv);\n\telse\n\t\tstandard_ExplainOneQuery(query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t pstate->p_sourcetext, params, pstate->p_queryEnv);\n}\n\n/*\n * standard_ExplainOneQuery -", "title": "Core call context: src/backend/commands/explain.c:300\u2013314", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, struct ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "19": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=19", "label": "EXPLAIN"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/commands/explain.h#L23", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "469d0dad433271caace897340b6bd44dd89b27c255687cfbf89e5050926f9c82"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L52", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L312", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:312"]}, {"code": "\t\tExplainOneUtility(query->utilityStmt, into, es, pstate, params);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t pstate->p_sourcetext, params, pstate->p_queryEnv);\n\telse\n\t\tstandard_ExplainOneQuery(query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t pstate->p_sourcetext, params, pstate->p_queryEnv);\n}\n\n/*\n * standard_ExplainOneQuery -", "title": "Core call context: src/backend/commands/explain.c:306\u2013320", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}, "20": {"facts": [{"label": "Interface type", "value": "ExplainOneQuery_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=20", "label": "EXPLAIN"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/commands/explain.h#L23", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "469d0dad433271caace897340b6bd44dd89b27c255687cfbf89e5050926f9c82"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L52", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L312", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}], "sections": [{"title": "Core source comments", "paragraphs": ["if an advisor plugin is present, let it manage things"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:312"]}, {"code": "\t\tExplainOneUtility(query->utilityStmt, into, es, pstate, params);\n\t\treturn;\n\t}\n\n\t/* if an advisor plugin is present, let it manage things */\n\tif (ExplainOneQuery_hook)\n\t\t(*ExplainOneQuery_hook) (query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t pstate->p_sourcetext, params, pstate->p_queryEnv);\n\telse\n\t\tstandard_ExplainOneQuery(query, cursorOptions, into, es,\n\t\t\t\t\t\t\t\t pstate->p_sourcetext, params, pstate->p_queryEnv);\n}\n\n/*\n * standard_ExplainOneQuery -", "title": "Core call context: src/backend/commands/explain.c:306\u2013320", "paragraphs": []}], "signature": "typedef void (*ExplainOneQuery_hook_type) (Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;", "description": ["Hook for plugins to get control in ExplainOneQuery()"]}}, "content_hash": "654a7e541abf8e769308e19f25cffe0b3c766181147e927a018686c4bd62a4f9", "imported_at": "2026-09-27T09:57:58.839", "url": "/wiki/hook/explainonequery_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/explainonequery_hook/?v=10"}, {"major": "11", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 11 \u00b7 Interface or attribute change", "url": "/wiki/hook/explainonequery_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/explainonequery_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/explainonequery_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/explainonequery_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/explainonequery_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/explainonequery_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/explainonequery_hook/?v=17"}, {"major": "18", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 18 \u00b7 Interface or attribute change", "url": "/wiki/hook/explainonequery_hook/?v=18"}, {"major": "19", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 19 Beta 4 \u00b7 Interface or attribute change", "url": "/wiki/hook/explainonequery_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/explainonequery_hook/?v=20"}], "present": true}, {"slug": "explain_get_index_name_hook", "name": "explain_get_index_name_hook", "name_zh": "explain_get_index_name_hook", "category": "EXPLAIN", "summary": "Hook for plugins to get control in explain_get_index_name()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=10", "label": "EXPLAIN"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/commands/explain.h#L60", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "83095ec641f8dd8a8aff61104f476a5c7879fac321ecb46bcf2d230a26e8ae14"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/commands/explain.c#L47", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "a785298532047cfeda969e78c3597a343dc1c56d61ba85830b0f16a02a14b5a1"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/commands/explain.c#L2462", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "a785298532047cfeda969e78c3597a343dc1c56d61ba85830b0f16a02a14b5a1"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:2462"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:2456\u20132470", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "11": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=11", "label": "EXPLAIN"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/commands/explain.h#L61", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "0db925e1fcbada78bb7ef4fb90e3e33caf64ab9640c93bbe2920dfabf222e721"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/commands/explain.c#L48", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "9df8400c1a4377179572ceb916d6020fca4e2760f74bf416d77ed97476523bbd"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/commands/explain.c#L2781", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "9df8400c1a4377179572ceb916d6020fca4e2760f74bf416d77ed97476523bbd"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:2781"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:2775\u20132789", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "12": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=12", "label": "EXPLAIN"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/commands/explain.h#L62", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "ffc72104e557e06d69bd79eaed2ebb0268f584d1ce6348cbc3b838548cffc1f9"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/commands/explain.c#L47", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "d02ea84fdaa201de5d9360645a9f24bfbd2c31f7d45a639e09560ac0e6b6471d"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/commands/explain.c#L2854", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "d02ea84fdaa201de5d9360645a9f24bfbd2c31f7d45a639e09560ac0e6b6471d"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:2854"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:2848\u20132862", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "13": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=13", "label": "EXPLAIN"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/commands/explain.h#L75", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "d63f9c12b4732512f365a634b4effbc15f4192eef9bd4c573b313aff09c9887d"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/commands/explain.c#L47", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "541713e0e7f1c9cc352c2b6028964d440c19d2678a4463000094c24a88c1e730"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/commands/explain.c#L3275", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "541713e0e7f1c9cc352c2b6028964d440c19d2678a4463000094c24a88c1e730"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:3275"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:3269\u20133283", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "14": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=14", "label": "EXPLAIN"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/commands/explain.h#L75", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "3981f2b6dc0e07b4a9895a90760f3d6b3c9b2e652520cded32a55cbad2bf7f12"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/commands/explain.c#L48", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "e091be4e2a083b8dea39ccd09beedede22c1716ef974da66c214a44f48be8c41"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/commands/explain.c#L3480", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "e091be4e2a083b8dea39ccd09beedede22c1716ef974da66c214a44f48be8c41"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:3480"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:3474\u20133488", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "15": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=15", "label": "EXPLAIN"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/commands/explain.h#L75", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "463daa126ef5dac0fb4aaff0a8c34f717536f815c117908be1c35c7e8997ed85"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/commands/explain.c#L48", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "bb3b442d0f1b098aa8707335250102f027a596cd94117308bd16d1d36b258f5c"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/commands/explain.c#L3491", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "bb3b442d0f1b098aa8707335250102f027a596cd94117308bd16d1d36b258f5c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:3491"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:3485\u20133499", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "16": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=16", "label": "EXPLAIN"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/commands/explain.h#L76", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "eecdb37c84d097a4b6d5d4fa915c141aec640c01110ca0eedd60cf0dea9aaacf"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/commands/explain.c#L48", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "8e017f0116dbea471339b40c37a667cc9f95039e7e0329c783e5e8ce194de7e1"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/commands/explain.c#L3526", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "8e017f0116dbea471339b40c37a667cc9f95039e7e0329c783e5e8ce194de7e1"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:3526"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:3520\u20133534", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "17": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=17", "label": "EXPLAIN"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/commands/explain.h#L85", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "ac0a90763187efbe0eba8f228724994d58ac02fa0e2a81613a73236c8104c728"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/commands/explain.c#L49", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "741251b1a3b6d269a52a673d42eb63b02e13a5872db7b359b137086ab21b63c8"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/commands/explain.c#L3684", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "741251b1a3b6d269a52a673d42eb63b02e13a5872db7b359b137086ab21b63c8"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:3684"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:3678\u20133692", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "18": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=18", "label": "EXPLAIN"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/commands/explain.h#L49", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "a8ef9548bccebb3c8f5255e8295d1d53dd0e4ea54b6be8b17dfe163ef2918b7f"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L53", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L4027", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:4027"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:4021\u20134035", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "19": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=19", "label": "EXPLAIN"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/commands/explain.h#L50", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "469d0dad433271caace897340b6bd44dd89b27c255687cfbf89e5050926f9c82"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L55", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L4233", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:4233"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:4227\u20134241", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}, "20": {"facts": [{"label": "Interface type", "value": "explain_get_index_name_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=20", "label": "EXPLAIN"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/commands/explain.h#L50", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "469d0dad433271caace897340b6bd44dd89b27c255687cfbf89e5050926f9c82"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L55", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L4241", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:4241"]}, {"code": "static const char *\nexplain_get_index_name(Oid indexId)\n{\n\tconst char *result;\n\n\tif (explain_get_index_name_hook)\n\t\tresult = (*explain_get_index_name_hook) (indexId);\n\telse\n\t\tresult = NULL;\n\tif (result == NULL)\n\t{\n\t\t/* default behavior: look it up in the catalogs */\n\t\tresult = get_rel_name(indexId);\n\t\tif (result == NULL)\n\t\t\telog(ERROR, \"cache lookup failed for index %u\", indexId);", "title": "Core call context: src/backend/commands/explain.c:4235\u20134249", "paragraphs": []}], "signature": "typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);\nextern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;", "description": ["Hook for plugins to get control in explain_get_index_name()"]}}, "content_hash": "2330cad19d0edc19cf72404d0a6667decebee99e7d908732ecb28cac9c95781d", "imported_at": "2026-09-27T09:57:58.832", "url": "/wiki/hook/explain_get_index_name_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/explain_get_index_name_hook/?v=20"}], "present": true}, {"slug": "explain_per_node_hook", "name": "explain_per_node_hook", "name_zh": "explain_per_node_hook", "category": "EXPLAIN", "summary": "Hook for EXPLAIN plugins to print extra fields on individual plan nodes", "aliases": [], "versions": {"18": {"facts": [{"label": "Interface type", "value": "explain_per_node_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=18", "label": "EXPLAIN"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/commands/explain.h#L41", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "a8ef9548bccebb3c8f5255e8295d1d53dd0e4ea54b6be8b17dfe163ef2918b7f"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L57", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L2319", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow plugins to print additional information"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:2319"]}, {"code": "\tif (es->workers_state)\n\t\tExplainFlushWorkersState(es);\n\tes->workers_state = save_workers_state;\n\n\t/* Allow plugins to print additional information */\n\tif (explain_per_node_hook)\n\t\t(*explain_per_node_hook) (planstate, ancestors, relationship,\n\t\t\t\t\t\t\t\t  plan_name, es);\n\n\t/*\n\t * If partition pruning was done during executor initialization, the\n\t * number of child plans we'll display below will be less than the number\n\t * of subplans that was specified in the plan.  To make this a bit less\n\t * mysterious, emit an indication that this happened.  Note that this\n\t * field is emitted now because we want it to be a property of the parent", "title": "Core call context: src/backend/commands/explain.c:2313\u20132327", "paragraphs": []}], "signature": "typedef void (*explain_per_node_hook_type) (PlanState *planstate, List *ancestors, const char *relationship, const char *plan_name, struct ExplainState *es);\nextern PGDLLIMPORT explain_per_node_hook_type explain_per_node_hook;", "description": ["Hook for EXPLAIN plugins to print extra fields on individual plan nodes"]}, "19": {"facts": [{"label": "Interface type", "value": "explain_per_node_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=19", "label": "EXPLAIN"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/commands/explain.h#L42", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "469d0dad433271caace897340b6bd44dd89b27c255687cfbf89e5050926f9c82"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L59", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L2336", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow plugins to print additional information"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:2336"]}, {"code": "\tif (es->workers_state)\n\t\tExplainFlushWorkersState(es);\n\tes->workers_state = save_workers_state;\n\n\t/* Allow plugins to print additional information */\n\tif (explain_per_node_hook)\n\t\t(*explain_per_node_hook) (planstate, ancestors, relationship,\n\t\t\t\t\t\t\t\t  plan_name, es);\n\n\t/*\n\t * If partition pruning was done during executor initialization, the\n\t * number of child plans we'll display below will be less than the number\n\t * of subplans that was specified in the plan.  To make this a bit less\n\t * mysterious, emit an indication that this happened.  Note that this\n\t * field is emitted now because we want it to be a property of the parent", "title": "Core call context: src/backend/commands/explain.c:2330\u20132344", "paragraphs": []}], "signature": "typedef void (*explain_per_node_hook_type) (PlanState *planstate, List *ancestors, const char *relationship, const char *plan_name, ExplainState *es);\nextern PGDLLIMPORT explain_per_node_hook_type explain_per_node_hook;", "description": ["Hook for EXPLAIN plugins to print extra fields on individual plan nodes"]}, "20": {"facts": [{"label": "Interface type", "value": "explain_per_node_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=20", "label": "EXPLAIN"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/commands/explain.h#L42", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "469d0dad433271caace897340b6bd44dd89b27c255687cfbf89e5050926f9c82"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L59", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L2333", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow plugins to print additional information"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:2333"]}, {"code": "\tif (es->workers_state)\n\t\tExplainFlushWorkersState(es);\n\tes->workers_state = save_workers_state;\n\n\t/* Allow plugins to print additional information */\n\tif (explain_per_node_hook)\n\t\t(*explain_per_node_hook) (planstate, ancestors, relationship,\n\t\t\t\t\t\t\t\t  plan_name, es);\n\n\t/*\n\t * If partition pruning was done during executor initialization, the\n\t * number of child plans we'll display below will be less than the number\n\t * of subplans that was specified in the plan.  To make this a bit less\n\t * mysterious, emit an indication that this happened.  Note that this\n\t * field is emitted now because we want it to be a property of the parent", "title": "Core call context: src/backend/commands/explain.c:2327\u20132341", "paragraphs": []}], "signature": "typedef void (*explain_per_node_hook_type) (PlanState *planstate, List *ancestors, const char *relationship, const char *plan_name, ExplainState *es);\nextern PGDLLIMPORT explain_per_node_hook_type explain_per_node_hook;", "description": ["Hook for EXPLAIN plugins to print extra fields on individual plan nodes"]}}, "content_hash": "0d43c00ca717eea9832f82c014e0cbc32e48fd75c4649482b06d6c4affd32bd6", "imported_at": "2026-09-27T09:57:58.834", "url": "/wiki/hook/explain_per_node_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_node_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_node_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_node_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_node_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_node_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_node_hook/?v=15"}, {"major": "16", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 16 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_node_hook/?v=16"}, {"major": "17", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 17 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_node_hook/?v=17"}, {"major": "18", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 18 \u00b7 First recorded in this sample", "url": "/wiki/hook/explain_per_node_hook/?v=18"}, {"major": "19", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 19 Beta 4 \u00b7 Interface or attribute change", "url": "/wiki/hook/explain_per_node_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/explain_per_node_hook/?v=20"}], "present": true}, {"slug": "explain_per_plan_hook", "name": "explain_per_plan_hook", "name_zh": "explain_per_plan_hook", "category": "EXPLAIN", "summary": "Hook for EXPLAIN plugins to print extra information for each plan", "aliases": [], "versions": {"18": {"facts": [{"label": "Interface type", "value": "explain_per_plan_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=18", "label": "EXPLAIN"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/commands/explain.h#L32", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "a8ef9548bccebb3c8f5255e8295d1d53dd0e4ea54b6be8b17dfe163ef2918b7f"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L56", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L650", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}], "sections": [{"title": "Core source comments", "paragraphs": ["per-plan and per-node hooks for plugins to print additional info", "Allow plugins to print additional information"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:650"]}, {"code": "\t/* Print info about serialization of output */\n\tif (es->serialize != EXPLAIN_SERIALIZE_NONE)\n\t\tExplainPrintSerialize(es, &serializeMetrics);\n\n\t/* Allow plugins to print additional information */\n\tif (explain_per_plan_hook)\n\t\t(*explain_per_plan_hook) (plannedstmt, into, es, queryString,\n\t\t\t\t\t\t\t\t  params, queryEnv);\n\n\t/*\n\t * Close down the query and free resources.  Include time for this in the\n\t * total execution time (although it should be pretty minimal).\n\t */\n\tINSTR_TIME_SET_CURRENT(starttime);\n", "title": "Core call context: src/backend/commands/explain.c:644\u2013658", "paragraphs": []}], "signature": "typedef void (*explain_per_plan_hook_type) (PlannedStmt *plannedstmt, IntoClause *into, struct ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT explain_per_plan_hook_type explain_per_plan_hook;", "description": ["Hook for EXPLAIN plugins to print extra information for each plan"]}, "19": {"facts": [{"label": "Interface type", "value": "explain_per_plan_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=19", "label": "EXPLAIN"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/commands/explain.h#L33", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "469d0dad433271caace897340b6bd44dd89b27c255687cfbf89e5050926f9c82"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L58", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L658", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}], "sections": [{"title": "Core source comments", "paragraphs": ["per-plan and per-node hooks for plugins to print additional info", "Allow plugins to print additional information"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:658"]}, {"code": "\t/* Print info about serialization of output */\n\tif (es->serialize != EXPLAIN_SERIALIZE_NONE)\n\t\tExplainPrintSerialize(es, &serializeMetrics);\n\n\t/* Allow plugins to print additional information */\n\tif (explain_per_plan_hook)\n\t\t(*explain_per_plan_hook) (plannedstmt, into, es, queryString,\n\t\t\t\t\t\t\t\t  params, queryEnv);\n\n\t/*\n\t * Close down the query and free resources.  Include time for this in the\n\t * total execution time (although it should be pretty minimal).\n\t */\n\tINSTR_TIME_SET_CURRENT(starttime);\n", "title": "Core call context: src/backend/commands/explain.c:652\u2013666", "paragraphs": []}], "signature": "typedef void (*explain_per_plan_hook_type) (PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT explain_per_plan_hook_type explain_per_plan_hook;", "description": ["Hook for EXPLAIN plugins to print extra information for each plan"]}, "20": {"facts": [{"label": "Interface type", "value": "explain_per_plan_hook_type"}, {"label": "Header", "value": "src/include/commands/explain.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=20", "label": "EXPLAIN"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/commands/explain.h#L33", "path": "src/include/commands/explain.h", "label": "Interface declaration", "sha256": "469d0dad433271caace897340b6bd44dd89b27c255687cfbf89e5050926f9c82"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L58", "path": "src/backend/commands/explain.c", "label": "Core definition", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L658", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}], "sections": [{"title": "Core source comments", "paragraphs": ["per-plan and per-node hooks for plugins to print additional info", "Allow plugins to print additional information"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:658"]}, {"code": "\t/* Print info about serialization of output */\n\tif (es->serialize != EXPLAIN_SERIALIZE_NONE)\n\t\tExplainPrintSerialize(es, &serializeMetrics);\n\n\t/* Allow plugins to print additional information */\n\tif (explain_per_plan_hook)\n\t\t(*explain_per_plan_hook) (plannedstmt, into, es, queryString,\n\t\t\t\t\t\t\t\t  params, queryEnv);\n\n\t/*\n\t * Close down the query and free resources.  Include time for this in the\n\t * total execution time (although it should be pretty minimal).\n\t */\n\tINSTR_TIME_SET_CURRENT(starttime);\n", "title": "Core call context: src/backend/commands/explain.c:652\u2013666", "paragraphs": []}], "signature": "typedef void (*explain_per_plan_hook_type) (PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv);\nextern PGDLLIMPORT explain_per_plan_hook_type explain_per_plan_hook;", "description": ["Hook for EXPLAIN plugins to print extra information for each plan"]}}, "content_hash": "d91df21bc1613e4e9a061b0524953e60edcb50e861940e821d3726c5df8cf138", "imported_at": "2026-09-27T09:57:58.836", "url": "/wiki/hook/explain_per_plan_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_plan_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_plan_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_plan_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_plan_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_plan_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_plan_hook/?v=15"}, {"major": "16", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 16 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_plan_hook/?v=16"}, {"major": "17", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 17 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_per_plan_hook/?v=17"}, {"major": "18", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 18 \u00b7 First recorded in this sample", "url": "/wiki/hook/explain_per_plan_hook/?v=18"}, {"major": "19", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 19 Beta 4 \u00b7 Interface or attribute change", "url": "/wiki/hook/explain_per_plan_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/explain_per_plan_hook/?v=20"}], "present": true}, {"slug": "explain_validate_options_hook", "name": "explain_validate_options_hook", "name_zh": "explain_validate_options_hook", "category": "EXPLAIN", "summary": "Hook to perform additional EXPLAIN options validation", "aliases": [], "versions": {"18": {"facts": [{"label": "Interface type", "value": "explain_validate_options_hook_type"}, {"label": "Header", "value": "src/include/commands/explain_state.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=18", "label": "EXPLAIN"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/commands/explain_state.h#L82", "path": "src/include/commands/explain_state.h", "label": "Interface declaration", "sha256": "88894e050e956d07561de6cf6d57bb0d5de915cc2fb35565e3e7e68c4c59973d"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain_state.c#L41", "path": "src/backend/commands/explain_state.c", "label": "Core definition", "sha256": "408c1ec6cd8757c31914fb9015e8f01d3b5a9f8f59173fda7b65e76147447bb1"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain_state.c#L206", "path": "src/backend/commands/explain_state.c", "label": "Call sites", "sha256": "408c1ec6cd8757c31914fb9015e8f01d3b5a9f8f59173fda7b65e76147447bb1"}], "sections": [{"title": "Core source comments", "paragraphs": ["plugin specific option validation"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain_state.c:206"]}, {"code": "\n\t/* if the summary was not set explicitly, set default value */\n\tes->summary = (summary_set) ? es->summary : es->analyze;\n\n\t/* plugin specific option validation */\n\tif (explain_validate_options_hook)\n\t\t(*explain_validate_options_hook) (es, options, pstate);\n}\n\n/*\n * Map the name of an EXPLAIN extension to an integer ID.\n *\n * Within the lifetime of a particular backend, the same name will be mapped\n * to the same ID every time. IDs are not stable across backends. Use the ID\n * that you get from this function to call GetExplainExtensionState and", "title": "Core call context: src/backend/commands/explain_state.c:200\u2013214", "paragraphs": []}], "signature": "typedef void (*explain_validate_options_hook_type) (struct ExplainState *es, List *options, ParseState *pstate);\nextern PGDLLIMPORT explain_validate_options_hook_type explain_validate_options_hook;", "description": ["Hook to perform additional EXPLAIN options validation"]}, "19": {"facts": [{"label": "Interface type", "value": "explain_validate_options_hook_type"}, {"label": "Header", "value": "src/include/commands/explain_state.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=19", "label": "EXPLAIN"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/commands/explain_state.h#L87", "path": "src/include/commands/explain_state.h", "label": "Interface declaration", "sha256": "f79de29b15d6b80799404d801781f93f09afe5b00a930a8ea5e4144f14820d39"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain_state.c#L43", "path": "src/backend/commands/explain_state.c", "label": "Core definition", "sha256": "eb730914803e0db82773e9d4435a87b794fb9758c842b43daebc38c3f6712061"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain_state.c#L217", "path": "src/backend/commands/explain_state.c", "label": "Call sites", "sha256": "eb730914803e0db82773e9d4435a87b794fb9758c842b43daebc38c3f6712061"}], "sections": [{"title": "Core source comments", "paragraphs": ["plugin specific option validation"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain_state.c:217"]}, {"code": "\n\t/* if the summary was not set explicitly, set default value */\n\tes->summary = (summary_set) ? es->summary : es->analyze;\n\n\t/* plugin specific option validation */\n\tif (explain_validate_options_hook)\n\t\t(*explain_validate_options_hook) (es, options, pstate);\n}\n\n/*\n * Map the name of an EXPLAIN extension to an integer ID.\n *\n * Within the lifetime of a particular backend, the same name will be mapped\n * to the same ID every time. IDs are not stable across backends. Use the ID\n * that you get from this function to call GetExplainExtensionState and", "title": "Core call context: src/backend/commands/explain_state.c:211\u2013225", "paragraphs": []}], "signature": "typedef void (*explain_validate_options_hook_type) (ExplainState *es, List *options, ParseState *pstate);\nextern PGDLLIMPORT explain_validate_options_hook_type explain_validate_options_hook;", "description": ["Hook to perform additional EXPLAIN options validation"]}, "20": {"facts": [{"label": "Interface type", "value": "explain_validate_options_hook_type"}, {"label": "Header", "value": "src/include/commands/explain_state.h"}, {"label": "Subsystem", "value": "EXPLAIN"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/sql/explain/?v=20", "label": "EXPLAIN"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/commands/explain_state.h#L87", "path": "src/include/commands/explain_state.h", "label": "Interface declaration", "sha256": "f79de29b15d6b80799404d801781f93f09afe5b00a930a8ea5e4144f14820d39"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain_state.c#L43", "path": "src/backend/commands/explain_state.c", "label": "Core definition", "sha256": "7fec496c67a1105d208e59988fd227f4258ee76635f3080e8f0e3fe082b269e0"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain_state.c#L217", "path": "src/backend/commands/explain_state.c", "label": "Call sites", "sha256": "7fec496c67a1105d208e59988fd227f4258ee76635f3080e8f0e3fe082b269e0"}], "sections": [{"title": "Core source comments", "paragraphs": ["plugin specific option validation"]}, {"title": "Call sites", "paragraphs": ["src/backend/commands/explain_state.c:217"]}, {"code": "\n\t/* if the summary was not set explicitly, set default value */\n\tes->summary = (summary_set) ? es->summary : es->analyze;\n\n\t/* plugin specific option validation */\n\tif (explain_validate_options_hook)\n\t\t(*explain_validate_options_hook) (es, options, pstate);\n}\n\n/*\n * Map the name of an EXPLAIN extension to an integer ID.\n *\n * Within the lifetime of a particular backend, the same name will be mapped\n * to the same ID every time. IDs are not stable across backends. Use the ID\n * that you get from this function to call GetExplainExtensionState and", "title": "Core call context: src/backend/commands/explain_state.c:211\u2013225", "paragraphs": []}], "signature": "typedef void (*explain_validate_options_hook_type) (ExplainState *es, List *options, ParseState *pstate);\nextern PGDLLIMPORT explain_validate_options_hook_type explain_validate_options_hook;", "description": ["Hook to perform additional EXPLAIN options validation"]}}, "content_hash": "60ad7fe6896ebed7275c2bca495e65ba1f8e0f20d225a66e79e5eab2f776e8c5", "imported_at": "2026-09-27T09:57:58.837", "url": "/wiki/hook/explain_validate_options_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_validate_options_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_validate_options_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_validate_options_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_validate_options_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_validate_options_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_validate_options_hook/?v=15"}, {"major": "16", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 16 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_validate_options_hook/?v=16"}, {"major": "17", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 17 \u00b7 Not recorded in this version", "url": "/wiki/hook/explain_validate_options_hook/?v=17"}, {"major": "18", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 18 \u00b7 First recorded in this sample", "url": "/wiki/hook/explain_validate_options_hook/?v=18"}, {"major": "19", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 19 Beta 4 \u00b7 Interface or attribute change", "url": "/wiki/hook/explain_validate_options_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/explain_validate_options_hook/?v=20"}], "present": true}, {"slug": "emit_log_hook", "name": "emit_log_hook", "name_zh": "emit_log_hook", "category": "Logging and function calls", "summary": "Hook for intercepting messages before they are sent to the server log", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/utils/elog.h#L374", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "812f5b725f9664cde3d869ae36f1ac0b4b1a4cd7648e0fe1891b3f5c70dea2f2"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/error/elog.c#L101", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "70a59e866373c1b22b75abecd66de9836a720ed17381eefee858e84de761960b"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/error/elog.c#L1473", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "70a59e866373c1b22b75abecd66de9836a720ed17381eefee858e84de761960b"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1473"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1467\u20131481", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "11": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/utils/elog.h#L374", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "42deafdecd3c90576784453762296af9ef16f80d37c7c910dc914fe54f77d71e"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/error/elog.c#L101", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "01526398e3cfb222b549a5b7a336b61bd44c0f33c99c497d4a5b4ea6dcd78c97"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/error/elog.c#L1473", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "01526398e3cfb222b549a5b7a336b61bd44c0f33c99c497d4a5b4ea6dcd78c97"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1473"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1467\u20131481", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "12": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/utils/elog.h#L394", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "e5e1ee22bdedc0b6ea57de39f813b7a72cf0ed3d95006cd585f924c267d21b2e"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/error/elog.c#L101", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "36b0f718ebc488eb193ddebcab95d39ce8a8c4183b78edaf9b4999acbb77a33f"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/error/elog.c#L1456", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "36b0f718ebc488eb193ddebcab95d39ce8a8c4183b78edaf9b4999acbb77a33f"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1456"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1450\u20131464", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "13": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/utils/elog.h#L397", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "bd0a614c4318b05ece86927b071de3a001e0253a6320213b440fbe51d5f44432"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/error/elog.c#L105", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "a11eb5c215276513c5994aed94df679d766283aeebcce48a11f372f1d670ada2"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/error/elog.c#L1456", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "a11eb5c215276513c5994aed94df679d766283aeebcce48a11f372f1d670ada2"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1456"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1450\u20131464", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "14": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/utils/elog.h#L414", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "8f99ab04dfd66e72149edd66f8905fb82e7901cb460b37a3d05a697d7cced9ba"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/error/elog.c#L106", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "440be55bc10cd402b4c5048030568f715023b394bbcf301e2363a218d989a119"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/error/elog.c#L1542", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "440be55bc10cd402b4c5048030568f715023b394bbcf301e2363a218d989a119"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1542"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1536\u20131550", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "15": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/utils/elog.h#L414", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "f7be8967dbbcc5b7902a267809f049651cc318ca37cc23e71c9d255d893feaad"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/error/elog.c#L106", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "a5dc1346bd392167f7d06dd48498ccdc4fb8665724b0296fe6439e9224bf0d8a"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/error/elog.c#L1537", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "a5dc1346bd392167f7d06dd48498ccdc4fb8665724b0296fe6439e9224bf0d8a"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1537"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1531\u20131545", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "16": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/utils/elog.h#L486", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "4c95e20f76f4fef6b28721731754370b90668b8a90a4d858575a9bbd2e787908"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/error/elog.c#L108", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "d4f8c83b483302515d3079ecca8817d6c0c69b26b35ff126970098841891aef8"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/error/elog.c#L1719", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "d4f8c83b483302515d3079ecca8817d6c0c69b26b35ff126970098841891aef8"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1719"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1713\u20131727", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "17": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/utils/elog.h#L486", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "e6b0864bf3fae574d5f6676ca3797dd7bccd70b69b5ebf1a0cdb86f635853e0d"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/error/elog.c#L107", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "c0fa4ad0198a13bd121080688b81d1faf8a352fb0852b01675b090f50c4db55c"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/error/elog.c#L1724", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "c0fa4ad0198a13bd121080688b81d1faf8a352fb0852b01675b090f50c4db55c"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1724"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1718\u20131732", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "18": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/utils/elog.h#L477", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "3485d4a046bd4fcc5f5887f7ea9badc3f430f1bd67c4b103d3e3a6fa54b38bc0"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/error/elog.c#L106", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "766d30a426ba1d9597657bd46fb890da3e37e4ae53a83d1245bf082ed9433c33"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/error/elog.c#L1729", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "766d30a426ba1d9597657bd46fb890da3e37e4ae53a83d1245bf082ed9433c33"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1729"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1723\u20131737", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "19": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/utils/elog.h#L480", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "36914fc647492beb991733b46f9bef72f21aaf138343d109919416ed36b6bc80"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/error/elog.c#L111", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "ed152ca45e2be564006d9b415415ae025724062b36dea97699bd78f8a611063b"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/error/elog.c#L1920", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "ed152ca45e2be564006d9b415415ae025724062b36dea97699bd78f8a611063b"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1920"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1914\u20131928", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}, "20": {"facts": [{"label": "Interface type", "value": "emit_log_hook_type"}, {"label": "Header", "value": "src/include/utils/elog.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/utils/elog.h#L480", "path": "src/include/utils/elog.h", "label": "Interface declaration", "sha256": "36914fc647492beb991733b46f9bef72f21aaf138343d109919416ed36b6bc80"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/error/elog.c#L111", "path": "src/backend/utils/error/elog.c", "label": "Core definition", "sha256": "247cfc468d376dcdd5557d303cea0f1e950830ccb7bd0443c637e95ac8c1067f"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/error/elog.c#L1920", "path": "src/backend/utils/error/elog.c", "label": "Call sites", "sha256": "247cfc468d376dcdd5557d303cea0f1e950830ccb7bd0443c637e95ac8c1067f"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for intercepting messages before they are sent to the server log. Note that the hook will not get called for messages that are suppressed by log_min_messages. Also note that logging hooks implemented in preload libraries will miss any log messages that are generated before the library is loaded."]}, {"title": "Call sites", "paragraphs": ["src/backend/utils/error/elog.c:1920"]}, {"code": "\t * The log hook has access to both the translated and original English\n\t * error message text, which is passed through to allow it to be used as a\n\t * message identifier. Note that the original text is not available for\n\t * detail, detail_log, hint and context text elements.\n\t */\n\tif (edata->output_to_server && emit_log_hook)\n\t\t(*emit_log_hook) (edata);\n\n\t/* Send to server log, if enabled */\n\tif (edata->output_to_server)\n\t\tsend_message_to_server_log(edata);\n\n\t/* Send to client, if enabled */\n\tif (edata->output_to_client)\n\t\tsend_message_to_frontend(edata);", "title": "Core call context: src/backend/utils/error/elog.c:1914\u20131928", "paragraphs": []}], "signature": "typedef void (*emit_log_hook_type) (ErrorData *edata);\nextern PGDLLIMPORT emit_log_hook_type emit_log_hook;", "description": ["Hook for intercepting messages before they are sent to the server log"]}}, "content_hash": "d7872f897b49960c2b5cee5826b987e2dabda39df3d919b29cf6551aa2a3b9ee", "imported_at": "2026-09-27T09:57:58.841", "url": "/wiki/hook/emit_log_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/emit_log_hook/?v=20"}], "present": true}, {"slug": "fmgr_hook", "name": "fmgr_hook", "name_zh": "fmgr_hook", "category": "Logging and function calls", "summary": "function manager hook", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/fmgr.h#L727", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "df17c150409e6e8722ca759fe4180a8749cf780229068e62361b1175b58999ea"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/fmgr/fmgr.c#L37", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "a5788568f1147d2aad197271942da0ea489f52d03b8b753555a21dee8fef562e"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/fmgr/fmgr.c#L646", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "a5788568f1147d2aad197271942da0ea489f52d03b8b753555a21dee8fef562e"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:646", "src/backend/utils/fmgr/fmgr.c:677", "src/backend/utils/fmgr/fmgr.c:689"]}, {"code": "\t\t\t\t\t\tPGC_S_SESSION,\n\t\t\t\t\t\tGUC_ACTION_SAVE);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:640\u2013654", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:671\u2013685", "paragraphs": []}, {"code": "\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:683\u2013697", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "11": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/fmgr.h#L734", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "c190e4895547ea11f1a94bf88627378adb93b964dbe6cbde649813befaca7892"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/fmgr/fmgr.c#L37", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "6d1dd1f91eeece4053ff17f40f5df44e4cf08d0a7dd87d03a36cf8e2afcbf455"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/fmgr/fmgr.c#L732", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "6d1dd1f91eeece4053ff17f40f5df44e4cf08d0a7dd87d03a36cf8e2afcbf455"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:732", "src/backend/utils/fmgr/fmgr.c:763", "src/backend/utils/fmgr/fmgr.c:775"]}, {"code": "\t\t\t\t\t\tPGC_S_SESSION,\n\t\t\t\t\t\tGUC_ACTION_SAVE);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:726\u2013740", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:757\u2013771", "paragraphs": []}, {"code": "\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:769\u2013783", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "12": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/fmgr.h#L760", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "6de795177b2711bfbb68a2658f2b479a18948f5678309c922ceaee3df4c1814b"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/fmgr/fmgr.c#L37", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "00f4202032df1dbace13d8d98b79938cd2c6f544104d13522f8bc30d180e1d68"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/fmgr/fmgr.c#L732", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "00f4202032df1dbace13d8d98b79938cd2c6f544104d13522f8bc30d180e1d68"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:732", "src/backend/utils/fmgr/fmgr.c:763", "src/backend/utils/fmgr/fmgr.c:775"]}, {"code": "\t\t\t\t\t\tPGC_S_SESSION,\n\t\t\t\t\t\tGUC_ACTION_SAVE);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:726\u2013740", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:757\u2013771", "paragraphs": []}, {"code": "\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:769\u2013783", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "13": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/fmgr.h#L766", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "caf6e9e4fd92e46ee76ef614bd2898b2dae868d078e20ba9f4dec2e26ada9601"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/fmgr/fmgr.c#L39", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "0ac71fc4f7f23b8ce489c2e56fd2f5a65bf55375da29c46ada7ad47a693504ea"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/fmgr/fmgr.c#L734", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "0ac71fc4f7f23b8ce489c2e56fd2f5a65bf55375da29c46ada7ad47a693504ea"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:734", "src/backend/utils/fmgr/fmgr.c:765", "src/backend/utils/fmgr/fmgr.c:777"]}, {"code": "\t\t\t\t\t\tPGC_S_SESSION,\n\t\t\t\t\t\tGUC_ACTION_SAVE);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:728\u2013742", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:759\u2013773", "paragraphs": []}, {"code": "\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:771\u2013785", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "14": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/fmgr.h#L768", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "4f5e2b234597a61d39718dbaa8adc29399275ff192ddf3263482eb941dfc44b4"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/fmgr/fmgr.c#L39", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "5606683a0658941ad4de9d56cc80f19873fd1260830d9955118002dffee38759"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/fmgr/fmgr.c#L730", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "5606683a0658941ad4de9d56cc80f19873fd1260830d9955118002dffee38759"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:730", "src/backend/utils/fmgr/fmgr.c:761", "src/backend/utils/fmgr/fmgr.c:773"]}, {"code": "\t\t\t\t\t\tPGC_S_SESSION,\n\t\t\t\t\t\tGUC_ACTION_SAVE);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:724\u2013738", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:755\u2013769", "paragraphs": []}, {"code": "\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:767\u2013781", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "15": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/fmgr.h#L772", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "b56a1b91b4076f32336da5eb5d33591d22718be5559c40badc565620bc2feb4e"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/fmgr/fmgr.c#L39", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "f457cfce513c0ef2a5aefa69e29607f997039fb09dcbf8b26a36866bfdd9f2c4"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/fmgr/fmgr.c#L716", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "f457cfce513c0ef2a5aefa69e29607f997039fb09dcbf8b26a36866bfdd9f2c4"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:716", "src/backend/utils/fmgr/fmgr.c:747", "src/backend/utils/fmgr/fmgr.c:759"]}, {"code": "\t\t\t\t\t\tPGC_S_SESSION,\n\t\t\t\t\t\tGUC_ACTION_SAVE);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:710\u2013724", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:741\u2013755", "paragraphs": []}, {"code": "\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:753\u2013767", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "16": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/fmgr.h#L791", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "fd781147ec3f936a4628b97c5df595b60cb06ea1756ac9966f5f3fc118827135"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/fmgr/fmgr.c#L40", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "bbd18adf8af5806d03cc5cbbf1e7ec211dac6da0bc2f10dc03c0dc091efc831b"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/fmgr/fmgr.c#L702", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "bbd18adf8af5806d03cc5cbbf1e7ec211dac6da0bc2f10dc03c0dc091efc831b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:702", "src/backend/utils/fmgr/fmgr.c:733", "src/backend/utils/fmgr/fmgr.c:745"]}, {"code": "\t\t\t\t\t\tPGC_S_SESSION,\n\t\t\t\t\t\tGUC_ACTION_SAVE);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:696\u2013710", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:727\u2013741", "paragraphs": []}, {"code": "\n\tif (fcache->proconfig)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:739\u2013753", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "17": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/fmgr.h#L791", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "30fbfb8334403e5a33e9415def77c0c72e77b9765e04e0931d717578768338fc"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/fmgr/fmgr.c#L40", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "faddb12f2f442ba4e932bc1991ca1bce96413e0b80f95b9a147fa46f5a704376"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/fmgr/fmgr.c#L731", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "faddb12f2f442ba4e932bc1991ca1bce96413e0b80f95b9a147fa46f5a704376"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:731", "src/backend/utils/fmgr/fmgr.c:762", "src/backend/utils/fmgr/fmgr.c:774"]}, {"code": "\t\t\t\t\t\t\t\t\t  context, source, GetUserId(),\n\t\t\t\t\t\t\t\t\t  action, true, 0, false);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:725\u2013739", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->configNames != NIL)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:756\u2013770", "paragraphs": []}, {"code": "\n\tif (fcache->configNames != NIL)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:768\u2013782", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "18": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/fmgr.h#L842", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "9ae7c92915f702ee93be2b6aed3574edfeb7fb2effae8beb256665f307db961b"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/fmgr/fmgr.c#L40", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "6cec6e3c08f69e71bfaa67294ac6889c9278a7963e2c676de709782c0c594e75"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/fmgr/fmgr.c#L731", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "6cec6e3c08f69e71bfaa67294ac6889c9278a7963e2c676de709782c0c594e75"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:731", "src/backend/utils/fmgr/fmgr.c:762", "src/backend/utils/fmgr/fmgr.c:774"]}, {"code": "\t\t\t\t\t\t\t\t\t  context, source, GetUserId(),\n\t\t\t\t\t\t\t\t\t  action, true, 0, false);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:725\u2013739", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->configNames != NIL)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:756\u2013770", "paragraphs": []}, {"code": "\n\tif (fcache->configNames != NIL)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:768\u2013782", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "19": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/fmgr.h#L848", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "463896e0eff1b6376a90e00797cff2713a3afe093876efc8023ec11aa7021150"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/fmgr/fmgr.c#L42", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "f4fa54b31f33083c137aac63f84702aa008fe8cea88d6bf51e90fff4d1cef28a"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/fmgr/fmgr.c#L733", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "f4fa54b31f33083c137aac63f84702aa008fe8cea88d6bf51e90fff4d1cef28a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:733", "src/backend/utils/fmgr/fmgr.c:764", "src/backend/utils/fmgr/fmgr.c:776"]}, {"code": "\t\t\t\t\t\t\t\t\t  context, source, GetUserId(),\n\t\t\t\t\t\t\t\t\t  action, true, 0, false);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:727\u2013741", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->configNames != NIL)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:758\u2013772", "paragraphs": []}, {"code": "\n\tif (fcache->configNames != NIL)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:770\u2013784", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}, "20": {"facts": [{"label": "Interface type", "value": "fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/fmgr.h#L848", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "0cf665ac5d9971af06c92d1227d08b9b720ed9d650062f7d826164d72d4dc9aa"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/fmgr/fmgr.c#L42", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "98da7c443110c5d71726341881ff36e42ee5d14feb4161a93ebece60af3b677f"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/fmgr/fmgr.c#L733", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Call sites", "sha256": "98da7c443110c5d71726341881ff36e42ee5d14feb4161a93ebece60af3b677f"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/fmgr/fmgr.c:733", "src/backend/utils/fmgr/fmgr.c:764", "src/backend/utils/fmgr/fmgr.c:776"]}, {"code": "\t\t\t\t\t\t\t\t\t  context, source, GetUserId(),\n\t\t\t\t\t\t\t\t\t  action, true, 0, false);\n\t}\n\n\t/* function manager hook */\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_START, &fcache->flinfo, &fcache->arg);\n\n\t/*\n\t * We don't need to restore GUC or userid settings on error, because the\n\t * ensuing xact or subxact abort will do that.  The PG_TRY block is only\n\t * needed to clean up the flinfo link.\n\t */\n\tsave_flinfo = fcinfo->flinfo;\n", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:727\u2013741", "paragraphs": []}, {"code": "\t\t\t\t\t\t\t\t   ((ReturnSetInfo *) fcinfo->resultinfo)->isDone != ExprMultipleResult));\n\t}\n\tPG_CATCH();\n\t{\n\t\tfcinfo->flinfo = save_flinfo;\n\t\tif (fmgr_hook)\n\t\t\t(*fmgr_hook) (FHET_ABORT, &fcache->flinfo, &fcache->arg);\n\t\tPG_RE_THROW();\n\t}\n\tPG_END_TRY();\n\n\tfcinfo->flinfo = save_flinfo;\n\n\tif (fcache->configNames != NIL)\n\t\tAtEOXact_GUC(true, save_nestlevel);", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:758\u2013772", "paragraphs": []}, {"code": "\n\tif (fcache->configNames != NIL)\n\t\tAtEOXact_GUC(true, save_nestlevel);\n\tif (OidIsValid(fcache->userid))\n\t\tSetUserIdAndSecContext(save_userid, save_sec_context);\n\tif (fmgr_hook)\n\t\t(*fmgr_hook) (FHET_END, &fcache->flinfo, &fcache->arg);\n\n\treturn result;\n}\n\n\n/*-------------------------------------------------------------------------\n *\t\tSupport routines for callers of fmgr-compatible functions\n *-------------------------------------------------------------------------", "title": "Core call context: src/backend/utils/fmgr/fmgr.c:770\u2013784", "paragraphs": []}], "signature": "typedef void (*fmgr_hook_type) (FmgrHookEventType event, FmgrInfo *flinfo, Datum *arg);\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;", "description": ["function manager hook"]}}, "content_hash": "4a575546e6f51fba9d5c8867a180462172240e1ba692cebdba7656cd970a59bb", "imported_at": "2026-09-27T09:57:58.842", "url": "/wiki/hook/fmgr_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/fmgr_hook/?v=20"}], "present": true}, {"slug": "needs_fmgr_hook", "name": "needs_fmgr_hook", "name_zh": "needs_fmgr_hook", "category": "Logging and function calls", "summary": "Hooks for function calls", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/fmgr.h#L725", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "df17c150409e6e8722ca759fe4180a8749cf780229068e62361b1175b58999ea"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/fmgr/fmgr.c#L36", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "a5788568f1147d2aad197271942da0ea489f52d03b8b753555a21dee8fef562e"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/fmgr.h#L734", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "df17c150409e6e8722ca759fe4180a8749cf780229068e62361b1175b58999ea"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:734"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n/*\n * !!! OLD INTERFACE !!!\n *\n * fmgr() is the only remaining vestige of the old-style caller support\n * functions.  It's no longer used anywhere in the Postgres distribution,\n * but we should leave it around for a release or two to ease the transition\n * for user-supplied C functions.  OidFunctionCallN() replaces it for new", "title": "Core call context: src/include/fmgr.h:728\u2013742", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "11": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/fmgr.h#L732", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "c190e4895547ea11f1a94bf88627378adb93b964dbe6cbde649813befaca7892"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/fmgr/fmgr.c#L36", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "6d1dd1f91eeece4053ff17f40f5df44e4cf08d0a7dd87d03a36cf8e2afcbf455"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/fmgr.h#L741", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "c190e4895547ea11f1a94bf88627378adb93b964dbe6cbde649813befaca7892"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:741"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:735\u2013743", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "12": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/fmgr.h#L758", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "6de795177b2711bfbb68a2658f2b479a18948f5678309c922ceaee3df4c1814b"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/fmgr/fmgr.c#L36", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "00f4202032df1dbace13d8d98b79938cd2c6f544104d13522f8bc30d180e1d68"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/fmgr.h#L767", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "6de795177b2711bfbb68a2658f2b479a18948f5678309c922ceaee3df4c1814b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:767"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:761\u2013769", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "13": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/fmgr.h#L764", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "caf6e9e4fd92e46ee76ef614bd2898b2dae868d078e20ba9f4dec2e26ada9601"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/fmgr/fmgr.c#L38", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "0ac71fc4f7f23b8ce489c2e56fd2f5a65bf55375da29c46ada7ad47a693504ea"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/fmgr.h#L773", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "caf6e9e4fd92e46ee76ef614bd2898b2dae868d078e20ba9f4dec2e26ada9601"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:773"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:767\u2013775", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "14": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/fmgr.h#L766", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "4f5e2b234597a61d39718dbaa8adc29399275ff192ddf3263482eb941dfc44b4"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/fmgr/fmgr.c#L38", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "5606683a0658941ad4de9d56cc80f19873fd1260830d9955118002dffee38759"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/fmgr.h#L775", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "4f5e2b234597a61d39718dbaa8adc29399275ff192ddf3263482eb941dfc44b4"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:775"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:769\u2013777", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "15": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/fmgr.h#L770", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "b56a1b91b4076f32336da5eb5d33591d22718be5559c40badc565620bc2feb4e"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/fmgr/fmgr.c#L38", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "f457cfce513c0ef2a5aefa69e29607f997039fb09dcbf8b26a36866bfdd9f2c4"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/fmgr.h#L779", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "b56a1b91b4076f32336da5eb5d33591d22718be5559c40badc565620bc2feb4e"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:779"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:773\u2013781", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "16": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/fmgr.h#L789", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "fd781147ec3f936a4628b97c5df595b60cb06ea1756ac9966f5f3fc118827135"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/fmgr/fmgr.c#L39", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "bbd18adf8af5806d03cc5cbbf1e7ec211dac6da0bc2f10dc03c0dc091efc831b"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/fmgr.h#L798", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "fd781147ec3f936a4628b97c5df595b60cb06ea1756ac9966f5f3fc118827135"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:798"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:792\u2013800", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "17": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/fmgr.h#L789", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "30fbfb8334403e5a33e9415def77c0c72e77b9765e04e0931d717578768338fc"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/fmgr/fmgr.c#L39", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "faddb12f2f442ba4e932bc1991ca1bce96413e0b80f95b9a147fa46f5a704376"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/fmgr.h#L798", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "30fbfb8334403e5a33e9415def77c0c72e77b9765e04e0931d717578768338fc"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:798"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:792\u2013800", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "18": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/fmgr.h#L840", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "9ae7c92915f702ee93be2b6aed3574edfeb7fb2effae8beb256665f307db961b"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/fmgr/fmgr.c#L39", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "6cec6e3c08f69e71bfaa67294ac6889c9278a7963e2c676de709782c0c594e75"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/fmgr.h#L849", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "9ae7c92915f702ee93be2b6aed3574edfeb7fb2effae8beb256665f307db961b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:849"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:843\u2013851", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "19": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/fmgr.h#L846", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "463896e0eff1b6376a90e00797cff2713a3afe093876efc8023ec11aa7021150"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/fmgr/fmgr.c#L41", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "f4fa54b31f33083c137aac63f84702aa008fe8cea88d6bf51e90fff4d1cef28a"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/fmgr.h#L855", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "463896e0eff1b6376a90e00797cff2713a3afe093876efc8023ec11aa7021150"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:855"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:849\u2013857", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}, "20": {"facts": [{"label": "Interface type", "value": "needs_fmgr_hook_type"}, {"label": "Header", "value": "src/include/fmgr.h"}, {"label": "Subsystem", "value": "Logging and function calls"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/fmgr.h#L846", "path": "src/include/fmgr.h", "label": "Interface declaration", "sha256": "0cf665ac5d9971af06c92d1227d08b9b720ed9d650062f7d826164d72d4dc9aa"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/fmgr/fmgr.c#L41", "path": "src/backend/utils/fmgr/fmgr.c", "label": "Core definition", "sha256": "98da7c443110c5d71726341881ff36e42ee5d14feb4161a93ebece60af3b677f"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/fmgr.h#L855", "path": "src/include/fmgr.h", "label": "Call sites", "sha256": "0cf665ac5d9971af06c92d1227d08b9b720ed9d650062f7d826164d72d4dc9aa"}], "sections": [{"title": "Call sites", "paragraphs": ["src/include/fmgr.h:855"]}, {"code": "\t\t\t\t\t\t\t\tFmgrInfo *flinfo, Datum *arg);\n\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;\nextern PGDLLIMPORT fmgr_hook_type fmgr_hook;\n\n#define FmgrHookIsNeeded(fn_oid)\t\t\t\t\t\t\t\\\n\t(!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))\n\n#endif\t\t\t\t\t\t\t/* FMGR_H */", "title": "Core call context: src/include/fmgr.h:849\u2013857", "paragraphs": []}], "signature": "typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);\nextern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;", "description": ["Hooks for function calls"]}}, "content_hash": "fe22e614f97783a981576de3cc32d98791fbe2759a6703742574d9279c711da5", "imported_at": "2026-09-27T09:57:58.845", "url": "/wiki/hook/needs_fmgr_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/needs_fmgr_hook/?v=20"}], "present": true}, {"slug": "processutility_hook", "name": "ProcessUtility_hook", "name_zh": "ProcessUtility_hook", "category": "Parsing and utility commands", "summary": "Hook for plugins to get control in ProcessUtility()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/tcop/utility.h#L27", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "3e4aace62535c74c0d5895f7bcc9ef6697fb2b61f7e6beeeae2dd1f83922bc69"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/tcop/utility.c#L73", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "6e85342c474fc91df57ce1971ec9193d05bdeb24bee034a4f9e6c96dffb88435"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/tcop/utility.c#L353", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "6e85342c474fc91df57ce1971ec9193d05bdeb24bee034a4f9e6c96dffb88435"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:353"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, completionTag);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, completionTag);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:347\u2013361", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, char *completionTag);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "11": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/tcop/utility.h#L29", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "a675f5a8ae6e278afde37c1c3fa54f82e2656f36056194086285b46257e2eeb6"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/tcop/utility.c#L76", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "9d08b645bd71f9afeea6af4a4cef20ff13a6816815f81ef39779625cfa8ccf9a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/tcop/utility.c#L356", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "9d08b645bd71f9afeea6af4a4cef20ff13a6816815f81ef39779625cfa8ccf9a"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:356"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, completionTag);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, completionTag);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:350\u2013364", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, char *completionTag);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "12": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/tcop/utility.h#L29", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "dacc31a4a8660632e7af65dd04d639280682920590e5e0545716c9d2e1a08576"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/tcop/utility.c#L76", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "41b0763680b8d69ef66c04b62f16939a64521c8a628237c7dc855c6ff9692f86"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/tcop/utility.c#L356", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "41b0763680b8d69ef66c04b62f16939a64521c8a628237c7dc855c6ff9692f86"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:356"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, completionTag);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, completionTag);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:350\u2013364", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, char *completionTag);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "13": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/tcop/utility.h#L71", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "e865c99eb37f022222b4f675dcfab8da8b7095df47d369085edd558f28e32153"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/tcop/utility.c#L75", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "eb04489e4b5f574263c3c6d7eabbafcb76a47b967cb7ed090d25077642e15ae1"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/tcop/utility.c#L520", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "eb04489e4b5f574263c3c6d7eabbafcb76a47b967cb7ed090d25077642e15ae1"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:520"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:514\u2013528", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "14": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/tcop/utility.h#L71", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "a30f2d1c64358a8b888376b7e597425f29dde8f4cb34cd0edf52c3491ab0e21a"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/tcop/utility.c#L76", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "b90aa634890e89bfb704ee60c0a3fe9722023f8f33a2c24a732acc00ca7b6785"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/tcop/utility.c#L523", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "b90aa634890e89bfb704ee60c0a3fe9722023f8f33a2c24a732acc00ca7b6785"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:523"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:517\u2013531", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "15": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/tcop/utility.h#L71", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "2217f54b0ef55840213fb3e414e33950cecdceee5dd9e315686a5fdd2eb517ac"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/tcop/utility.c#L77", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "db00d0af4ca3fd62ac4fd567e6b6ce5048020957db3afed087a8e1357ccf8ec9"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/tcop/utility.c#L526", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "db00d0af4ca3fd62ac4fd567e6b6ce5048020957db3afed087a8e1357ccf8ec9"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:526"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:520\u2013534", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "16": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/tcop/utility.h#L71", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "06b1fecb402ce6690c752059fb52b5ce6b5e9a267caa57d266f46079a0539f46"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/tcop/utility.c#L77", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "28742c9b0053cb588212f6bbc02b2712a5142d5dead1c108262cf382f3684d9a"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/tcop/utility.c#L526", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "28742c9b0053cb588212f6bbc02b2712a5142d5dead1c108262cf382f3684d9a"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:526"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:520\u2013534", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "17": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/tcop/utility.h#L71", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "c4ff0b264e321d5656110211b9e058ddca3207405a124de8e538487750adcc94"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/tcop/utility.c#L70", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "3768e954517dd79ea36420c8e0009ffe07ab2dcc0ff41ba2b756afaed77ca2e3"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/tcop/utility.c#L519", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "3768e954517dd79ea36420c8e0009ffe07ab2dcc0ff41ba2b756afaed77ca2e3"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:519"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:513\u2013527", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "18": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/tcop/utility.h#L71", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "726bfca02c8e0186b1b57f19c3319d11756d6b70a1b6f1cba7750c07aabdbbc3"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/tcop/utility.c#L70", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "7aae5d07628b6debf8456d1d4ea96f28912232192e56ea25773b4c4b61235a00"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/tcop/utility.c#L519", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "7aae5d07628b6debf8456d1d4ea96f28912232192e56ea25773b4c4b61235a00"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:519"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:513\u2013527", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "19": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/tcop/utility.h#L71", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "b051c4f13cd13745c78274661a199706ea6f3a987109b639de1a5591795421cc"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/tcop/utility.c#L71", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "dcb009e3d4dcfebf53b7a636d8815a0259fb8d793ecec36ee90613a8d9f9ebb1"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/tcop/utility.c#L521", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "dcb009e3d4dcfebf53b7a636d8815a0259fb8d793ecec36ee90613a8d9f9ebb1"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:521"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:515\u2013529", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}, "20": {"facts": [{"label": "Interface type", "value": "ProcessUtility_hook_type"}, {"label": "Header", "value": "src/include/tcop/utility.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/tcop/utility.h#L71", "path": "src/include/tcop/utility.h", "label": "Interface declaration", "sha256": "b051c4f13cd13745c78274661a199706ea6f3a987109b639de1a5591795421cc"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/tcop/utility.c#L71", "path": "src/backend/tcop/utility.c", "label": "Core definition", "sha256": "dcb009e3d4dcfebf53b7a636d8815a0259fb8d793ecec36ee90613a8d9f9ebb1"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/tcop/utility.c#L521", "path": "src/backend/tcop/utility.c", "label": "Call sites", "sha256": "dcb009e3d4dcfebf53b7a636d8815a0259fb8d793ecec36ee90613a8d9f9ebb1"}], "sections": [{"title": "Core source comments", "paragraphs": ["We provide a function hook variable that lets loadable plugins get control when ProcessUtility is called. Such a plugin would normally call standard_ProcessUtility()."]}, {"title": "Call sites", "paragraphs": ["src/backend/tcop/utility.c:521"]}, {"code": "\t/*\n\t * We provide a function hook variable that lets loadable plugins get\n\t * control when ProcessUtility is called.  Such a plugin would normally\n\t * call standard_ProcessUtility().\n\t */\n\tif (ProcessUtility_hook)\n\t\t(*ProcessUtility_hook) (pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n\telse\n\t\tstandard_ProcessUtility(pstmt, queryString, readOnlyTree,\n\t\t\t\t\t\t\t\tcontext, params, queryEnv,\n\t\t\t\t\t\t\t\tdest, qc);\n}\n", "title": "Core call context: src/backend/tcop/utility.c:515\u2013529", "paragraphs": []}], "signature": "typedef void (*ProcessUtility_hook_type) (PlannedStmt *pstmt, const char *queryString, bool readOnlyTree, ProcessUtilityContext context, ParamListInfo params, QueryEnvironment *queryEnv, DestReceiver *dest, QueryCompletion *qc);\nextern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;", "description": ["Hook for plugins to get control in ProcessUtility()"]}}, "content_hash": "fad7b2deaaf5285ba21b2da5819afd853f016c08943a874fe9c86f0b88cc9d80", "imported_at": "2026-09-27T09:57:58.849", "url": "/wiki/hook/processutility_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=12"}, {"major": "13", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 13 \u00b7 Interface or attribute change", "url": "/wiki/hook/processutility_hook/?v=13"}, {"major": "14", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 14 \u00b7 Interface or attribute change", "url": "/wiki/hook/processutility_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/processutility_hook/?v=20"}], "present": true}, {"slug": "post_parse_analyze_hook", "name": "post_parse_analyze_hook", "name_zh": "post_parse_analyze_hook", "category": "Parsing and utility commands", "summary": "Hook for plugins to get control at end of parse analysis", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/parser/analyze.h#L20", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "da2617bbf55ec1a32ccc580be69f83e583b4aceefd8085288b08f7fb460f621b"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/parser/analyze.c#L49", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "bcc8afbc9d60d63cf84b993c546dbc2c7913bd52936df26636a3e2cf9619779b"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/parser/analyze.c#L115", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "bcc8afbc9d60d63cf84b993c546dbc2c7913bd52936df26636a3e2cf9619779b"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/tcop/postgres.c#L726", "path": "src/backend/tcop/postgres.c", "label": "Call sites", "sha256": "badfe30749794afa80a799dcdbd142fd4e4732ac1c913002d365549ae5313497"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/parser/analyze.c:115", "src/backend/parser/analyze.c:148", "src/backend/tcop/postgres.c:726"]}, {"code": "\n\tpstate->p_queryEnv = queryEnv;\n\n\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\treturn query;\n}\n\n/*\n * parse_analyze_varparams", "title": "Core call context: src/backend/parser/analyze.c:109\u2013123", "paragraphs": []}, {"code": "\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\t/* make sure all is well with parameter types */\n\tcheck_variable_parameters(pstate, query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\treturn query;\n}\n\n/*\n * parse_sub_analyze", "title": "Core call context: src/backend/parser/analyze.c:142\u2013156", "paragraphs": []}, {"code": "\tpstate->p_queryEnv = queryEnv;\n\t(*parserSetup) (pstate, parserSetupArg);\n\n\tquery = transformTopLevelStmt(pstate, parsetree);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\tif (log_parser_stats)\n\t\tShowUsage(\"PARSE ANALYSIS STATISTICS\");\n\n\t/*\n\t * (2) Rewrite the queries, as necessary", "title": "Core call context: src/backend/tcop/postgres.c:720\u2013734", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "11": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/parser/analyze.h#L20", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "50b9d5eead81badcf732c091f3eae765af24206c8a45d9d27c092167b5072101"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/parser/analyze.c#L51", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "bdebe7767bc61487dc6f84e058e9507c0f5c8eed176057fd78f43dc962230200"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/parser/analyze.c#L119", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "bdebe7767bc61487dc6f84e058e9507c0f5c8eed176057fd78f43dc962230200"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/tcop/postgres.c#L738", "path": "src/backend/tcop/postgres.c", "label": "Call sites", "sha256": "f9c1faab582c948406049bc4dad1790e6f18113844d912b82490289e7030a88a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/parser/analyze.c:119", "src/backend/parser/analyze.c:152", "src/backend/tcop/postgres.c:738"]}, {"code": "\n\tpstate->p_queryEnv = queryEnv;\n\n\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\treturn query;\n}\n\n/*\n * parse_analyze_varparams", "title": "Core call context: src/backend/parser/analyze.c:113\u2013127", "paragraphs": []}, {"code": "\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\t/* make sure all is well with parameter types */\n\tcheck_variable_parameters(pstate, query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\treturn query;\n}\n\n/*\n * parse_sub_analyze", "title": "Core call context: src/backend/parser/analyze.c:146\u2013160", "paragraphs": []}, {"code": "\tpstate->p_queryEnv = queryEnv;\n\t(*parserSetup) (pstate, parserSetupArg);\n\n\tquery = transformTopLevelStmt(pstate, parsetree);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\tif (log_parser_stats)\n\t\tShowUsage(\"PARSE ANALYSIS STATISTICS\");\n\n\t/*\n\t * (2) Rewrite the queries, as necessary", "title": "Core call context: src/backend/tcop/postgres.c:732\u2013746", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "12": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/parser/analyze.h#L20", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "e435ace2e4c7cf5c154a484ec4fa6e9a8d5121f02b67850fc640a00402f8464a"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/parser/analyze.c#L51", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "563e674d24784f6628070df5ad8a22506e6c953c1bdcb5b03a41551209a95756"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/parser/analyze.c#L119", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "563e674d24784f6628070df5ad8a22506e6c953c1bdcb5b03a41551209a95756"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/tcop/postgres.c#L747", "path": "src/backend/tcop/postgres.c", "label": "Call sites", "sha256": "f367b9603dfc88e1d411acd92b80ae0b81e51c213e65a0dedc123399527edccd"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/parser/analyze.c:119", "src/backend/parser/analyze.c:152", "src/backend/tcop/postgres.c:747"]}, {"code": "\n\tpstate->p_queryEnv = queryEnv;\n\n\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\treturn query;\n}\n\n/*\n * parse_analyze_varparams", "title": "Core call context: src/backend/parser/analyze.c:113\u2013127", "paragraphs": []}, {"code": "\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\t/* make sure all is well with parameter types */\n\tcheck_variable_parameters(pstate, query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\treturn query;\n}\n\n/*\n * parse_sub_analyze", "title": "Core call context: src/backend/parser/analyze.c:146\u2013160", "paragraphs": []}, {"code": "\tpstate->p_queryEnv = queryEnv;\n\t(*parserSetup) (pstate, parserSetupArg);\n\n\tquery = transformTopLevelStmt(pstate, parsetree);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\tif (log_parser_stats)\n\t\tShowUsage(\"PARSE ANALYSIS STATISTICS\");\n\n\t/*\n\t * (2) Rewrite the queries, as necessary", "title": "Core call context: src/backend/tcop/postgres.c:741\u2013755", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "13": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/parser/analyze.h#L20", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "4a999be0b33a6b62d614711b2df358d308f4bad36f8987fa85634e7e55448bce"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/parser/analyze.c#L51", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "7ec5c2b001face7d570462e7eea8198c809bbfd11505aed0ad0c65be994ef106"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/parser/analyze.c#L119", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "7ec5c2b001face7d570462e7eea8198c809bbfd11505aed0ad0c65be994ef106"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/tcop/postgres.c#L743", "path": "src/backend/tcop/postgres.c", "label": "Call sites", "sha256": "9072571ab5d5706e0045284406282947f3b5beb6aaf2c99dd2971030954a23c9"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/parser/analyze.c:119", "src/backend/parser/analyze.c:152", "src/backend/tcop/postgres.c:743"]}, {"code": "\n\tpstate->p_queryEnv = queryEnv;\n\n\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\treturn query;\n}\n\n/*\n * parse_analyze_varparams", "title": "Core call context: src/backend/parser/analyze.c:113\u2013127", "paragraphs": []}, {"code": "\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\t/* make sure all is well with parameter types */\n\tcheck_variable_parameters(pstate, query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\treturn query;\n}\n\n/*\n * parse_sub_analyze", "title": "Core call context: src/backend/parser/analyze.c:146\u2013160", "paragraphs": []}, {"code": "\tpstate->p_queryEnv = queryEnv;\n\t(*parserSetup) (pstate, parserSetupArg);\n\n\tquery = transformTopLevelStmt(pstate, parsetree);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query);\n\n\tfree_parsestate(pstate);\n\n\tif (log_parser_stats)\n\t\tShowUsage(\"PARSE ANALYSIS STATISTICS\");\n\n\t/*\n\t * (2) Rewrite the queries, as necessary", "title": "Core call context: src/backend/tcop/postgres.c:737\u2013751", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "14": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/parser/analyze.h#L21", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "f1234ad2214ce25ccb2b0bff2b05e22fe80163621dc63f272a5ebb2cce4687b1"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/parser/analyze.c#L58", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "05f6265a48f22c8f8b6024dcb64f2b9169b0fc7d168d7a707aee443bfdf670c2"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/commands/explain.c#L252", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "e091be4e2a083b8dea39ccd09beedede22c1716ef974da66c214a44f48be8c41"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/parser/analyze.c#L133", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "05f6265a48f22c8f8b6024dcb64f2b9169b0fc7d168d7a707aee443bfdf670c2"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/tcop/postgres.c#L714", "path": "src/backend/tcop/postgres.c", "label": "Call sites", "sha256": "a44a2eeed79705dec231ac4a033598aa99faf3670e99a7775bfe1758aef02300"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:252", "src/backend/parser/analyze.c:133", "src/backend/parser/analyze.c:172", "src/backend/tcop/postgres.c:714"]}, {"code": "\n\tquery = castNode(Query, stmt->query);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query, pstate->p_sourcetext);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt->query));", "title": "Core call context: src/backend/commands/explain.c:246\u2013260", "paragraphs": []}, {"code": "\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query, sourceText);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\tfree_parsestate(pstate);\n\n\tpgstat_report_query_id(query->queryId, false);\n\n\treturn query;\n}\n", "title": "Core call context: src/backend/parser/analyze.c:127\u2013141", "paragraphs": []}, {"code": "\tcheck_variable_parameters(pstate, query);\n\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query, sourceText);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\tfree_parsestate(pstate);\n\n\tpgstat_report_query_id(query->queryId, false);\n\n\treturn query;\n}\n", "title": "Core call context: src/backend/parser/analyze.c:166\u2013180", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "15": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/parser/analyze.h#L22", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "b299176d588c6804195dfe18369f8f6f772aecb922c1010d99bdf0d2e806da34"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/parser/analyze.c#L59", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "2841ba1138b5f6f42f99c42e95d12e418bf91774a66b64cea82678dac8e17ddd"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/commands/explain.c#L252", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "bb3b442d0f1b098aa8707335250102f027a596cd94117308bd16d1d36b258f5c"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/parser/analyze.c#L129", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "2841ba1138b5f6f42f99c42e95d12e418bf91774a66b64cea82678dac8e17ddd"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:252", "src/backend/parser/analyze.c:129", "src/backend/parser/analyze.c:171", "src/backend/parser/analyze.c:208"]}, {"code": "\n\tquery = castNode(Query, stmt->query);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query, pstate->p_sourcetext);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt->query));", "title": "Core call context: src/backend/commands/explain.c:246\u2013260", "paragraphs": []}, {"code": "\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query, sourceText);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\tfree_parsestate(pstate);\n\n\tpgstat_report_query_id(query->queryId, false);\n\n\treturn query;\n}\n", "title": "Core call context: src/backend/parser/analyze.c:123\u2013137", "paragraphs": []}, {"code": "\tcheck_variable_parameters(pstate, query);\n\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query, sourceText);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\tfree_parsestate(pstate);\n\n\tpgstat_report_query_id(query->queryId, false);\n\n\treturn query;\n}\n", "title": "Core call context: src/backend/parser/analyze.c:165\u2013179", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "16": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/parser/analyze.h#L22", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "4bf4ba1988c90afb63a762214c242e8a173654bf290b6771e72ec1c5b657f794"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/parser/analyze.c#L60", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "b65fdc84eed1b3601db3102881d084caa1bb9c741f42923cda119d434a001674"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/commands/explain.c#L261", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "8e017f0116dbea471339b40c37a667cc9f95039e7e0329c783e5e8ce194de7e1"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/parser/analyze.c#L130", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "b65fdc84eed1b3601db3102881d084caa1bb9c741f42923cda119d434a001674"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:261", "src/backend/parser/analyze.c:130", "src/backend/parser/analyze.c:172", "src/backend/parser/analyze.c:209"]}, {"code": "\n\tquery = castNode(Query, stmt->query);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt->query));", "title": "Core call context: src/backend/commands/explain.c:255\u2013269", "paragraphs": []}, {"code": "\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\tfree_parsestate(pstate);\n\n\tpgstat_report_query_id(query->queryId, false);\n\n\treturn query;\n}\n", "title": "Core call context: src/backend/parser/analyze.c:124\u2013138", "paragraphs": []}, {"code": "\tcheck_variable_parameters(pstate, query);\n\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\tfree_parsestate(pstate);\n\n\tpgstat_report_query_id(query->queryId, false);\n\n\treturn query;\n}\n", "title": "Core call context: src/backend/parser/analyze.c:166\u2013180", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "17": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/parser/analyze.h#L22", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "0a59b4253c0c47f41234611e2797c82d4928f91967ded4f2ca585aeb125ec518"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/parser/analyze.c#L58", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "810c4a9abacf70cf2064e8249a20813fed3f7f6d6041f9f50622c5c32ca93d94"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/commands/explain.c#L313", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "741251b1a3b6d269a52a673d42eb63b02e13a5872db7b359b137086ab21b63c8"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/parser/analyze.c#L127", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "810c4a9abacf70cf2064e8249a20813fed3f7f6d6041f9f50622c5c32ca93d94"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:313", "src/backend/parser/analyze.c:127", "src/backend/parser/analyze.c:169", "src/backend/parser/analyze.c:206"]}, {"code": "\n\tquery = castNode(Query, stmt->query);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt->query));", "title": "Core call context: src/backend/commands/explain.c:307\u2013321", "paragraphs": []}, {"code": "\tquery = transformTopLevelStmt(pstate, parseTree);\n\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\tfree_parsestate(pstate);\n\n\tpgstat_report_query_id(query->queryId, false);\n\n\treturn query;\n}\n", "title": "Core call context: src/backend/parser/analyze.c:121\u2013135", "paragraphs": []}, {"code": "\tcheck_variable_parameters(pstate, query);\n\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\tfree_parsestate(pstate);\n\n\tpgstat_report_query_id(query->queryId, false);\n\n\treturn query;\n}\n", "title": "Core call context: src/backend/parser/analyze.c:163\u2013177", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "18": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/parser/analyze.h#L22", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "0d4ae51fc424c9d5e6d1d257e673e33066df4dcd1a31fb2ac875bfe6674b3cd2"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/parser/analyze.c#L59", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "98a23a176bbf95155d780b6512118999bc9fa68be8d88f0d013daf2a7512466a"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/commands/explain.c#L194", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "34c86d6070224a0e981efef51f79101d6d505e5874f1684ace183034bab14bb4"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/parser/analyze.c#L128", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "98a23a176bbf95155d780b6512118999bc9fa68be8d88f0d013daf2a7512466a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:194", "src/backend/commands/explain.c:427", "src/backend/commands/explain.c:453", "src/backend/parser/analyze.c:128", "src/backend/parser/analyze.c:170", "src/backend/parser/analyze.c:207"]}, {"code": "\t/* Extract the query and, if enabled, jumble it */\n\tquery = castNode(Query, stmt->query);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt->query));", "title": "Core call context: src/backend/commands/explain.c:188\u2013202", "paragraphs": []}, {"code": "\t\t}\n\n\t\tctas_query = castNode(Query, copyObject(ctas->query));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(ctas_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, ctas_query, jstate);\n\t\trewritten = QueryRewrite(ctas_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tCURSOR_OPT_PARALLEL_OK, ctas->into, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, DeclareCursorStmt))\n\t{", "title": "Core call context: src/backend/commands/explain.c:421\u2013435", "paragraphs": []}, {"code": "\t\tJumbleState *jstate = NULL;\n\n\t\tdcs_query = castNode(Query, copyObject(dcs->query));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(dcs_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, dcs_query, jstate);\n\n\t\trewritten = QueryRewrite(dcs_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tdcs->options, NULL, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, ExecuteStmt))", "title": "Core call context: src/backend/commands/explain.c:447\u2013461", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "19": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/parser/analyze.h#L22", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "5c8229cc0689b53a1986d4c320f6278a8d9ec5b351b33b0f7a879d5d399b0c50"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/parser/analyze.c#L68", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "3208d52f6c768cb6a4c52a05701b83189c208db91a411f932cd419874a79ee9c"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/commands/explain.c#L199", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "8b115b1c194a4b54ae630209a741e293b1df49a9052f10b2de9ca092a48998e3"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/parser/analyze.c#L143", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "3208d52f6c768cb6a4c52a05701b83189c208db91a411f932cd419874a79ee9c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/explain.c:199", "src/backend/commands/explain.c:433", "src/backend/commands/explain.c:459", "src/backend/parser/analyze.c:143", "src/backend/parser/analyze.c:185", "src/backend/parser/analyze.c:222"]}, {"code": "\t/* Extract the query and, if enabled, jumble it */\n\tquery = castNode(Query, stmt->query);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt->query));", "title": "Core call context: src/backend/commands/explain.c:193\u2013207", "paragraphs": []}, {"code": "\t\t}\n\n\t\tctas_query = castNode(Query, copyObject(ctas->query));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(ctas_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, ctas_query, jstate);\n\t\trewritten = QueryRewrite(ctas_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tCURSOR_OPT_PARALLEL_OK, ctas->into, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, DeclareCursorStmt))\n\t{", "title": "Core call context: src/backend/commands/explain.c:427\u2013441", "paragraphs": []}, {"code": "\t\tJumbleState *jstate = NULL;\n\n\t\tdcs_query = castNode(Query, copyObject(dcs->query));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(dcs_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, dcs_query, jstate);\n\n\t\trewritten = QueryRewrite(dcs_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tdcs->options, NULL, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, ExecuteStmt))", "title": "Core call context: src/backend/commands/explain.c:453\u2013467", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, const JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}, "20": {"facts": [{"label": "Interface type", "value": "post_parse_analyze_hook_type"}, {"label": "Header", "value": "src/include/parser/analyze.h"}, {"label": "Subsystem", "value": "Parsing and utility commands"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/parser/analyze.h#L22", "path": "src/include/parser/analyze.h", "label": "Interface declaration", "sha256": "5c8229cc0689b53a1986d4c320f6278a8d9ec5b351b33b0f7a879d5d399b0c50"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/parser/analyze.c#L68", "path": "src/backend/parser/analyze.c", "label": "Core definition", "sha256": "3ed3ffd693fa4abb259c34bfb32d3486871595b98d9a765037b9c8d87cd24e87"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/createas.c#L249", "path": "src/backend/commands/createas.c", "label": "Call sites", "sha256": "b0edb9c9309c3304630778d5f8ac6e707c75079dadfa0e44b487d71c8293c30c"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/explain.c#L199", "path": "src/backend/commands/explain.c", "label": "Call sites", "sha256": "13402758013520451539427b5993db06d463ca11c4e2d4cc5444e82367688077"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/commands/portalcmds.c#L82", "path": "src/backend/commands/portalcmds.c", "label": "Call sites", "sha256": "637b099a321482523a1c0120f308efab45221f14cc515bda8d9ea426a6fe2a2d"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/parser/analyze.c#L143", "path": "src/backend/parser/analyze.c", "label": "Call sites", "sha256": "3ed3ffd693fa4abb259c34bfb32d3486871595b98d9a765037b9c8d87cd24e87"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/commands/createas.c:249", "src/backend/commands/explain.c:199", "src/backend/commands/explain.c:433", "src/backend/commands/explain.c:459", "src/backend/commands/portalcmds.c:82", "src/backend/parser/analyze.c:143", "src/backend/parser/analyze.c:185", "src/backend/parser/analyze.c:222"]}, {"code": "\n\t/* Query contained by CTAS needs to be jumbled if requested */\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * The contained Query could be a SELECT, or an EXECUTE utility command.\n\t * If the latter, we just pass it off to ExecuteQuery.\n\t */\n\tif (query->commandType == CMD_UTILITY &&\n\t\tIsA(query->utilityStmt, ExecuteStmt))\n\t{", "title": "Core call context: src/backend/commands/createas.c:243\u2013257", "paragraphs": []}, {"code": "\t/* Extract the query and, if enabled, jumble it */\n\tquery = castNode(Query, stmt->query);\n\tif (IsQueryIdEnabled())\n\t\tjstate = JumbleQuery(query);\n\n\tif (post_parse_analyze_hook)\n\t\t(*post_parse_analyze_hook) (pstate, query, jstate);\n\n\t/*\n\t * Parse analysis was done already, but we still have to run the rule\n\t * rewriter.  We do not do AcquireRewriteLocks: we assume the query either\n\t * came straight from the parser, or suitable locks were acquired by\n\t * plancache.c.\n\t */\n\trewritten = QueryRewrite(castNode(Query, stmt->query));", "title": "Core call context: src/backend/commands/explain.c:193\u2013207", "paragraphs": []}, {"code": "\t\t}\n\n\t\tctas_query = castNode(Query, copyObject(ctas->query));\n\t\tif (IsQueryIdEnabled())\n\t\t\tjstate = JumbleQuery(ctas_query);\n\t\tif (post_parse_analyze_hook)\n\t\t\t(*post_parse_analyze_hook) (pstate, ctas_query, jstate);\n\t\trewritten = QueryRewrite(ctas_query);\n\t\tAssert(list_length(rewritten) == 1);\n\t\tExplainOneQuery(linitial_node(Query, rewritten),\n\t\t\t\t\t\tCURSOR_OPT_PARALLEL_OK, ctas->into, es,\n\t\t\t\t\t\tpstate, params);\n\t}\n\telse if (IsA(utilityStmt, DeclareCursorStmt))\n\t{", "title": "Core call context: src/backend/commands/explain.c:427\u2013441", "paragraphs": []}], "signature": "typedef void (*post_parse_analyze_hook_type) (ParseState *pstate, Query *query, const JumbleState *jstate);\nextern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;", "description": ["Hook for plugins to get control at end of parse analysis"]}}, "content_hash": "c01640f35c773cc5a9ab5e31d37b64256b6be422994da2db8913fa4985dfd6cd", "imported_at": "2026-09-27T09:57:58.846", "url": "/wiki/hook/post_parse_analyze_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=13"}, {"major": "14", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 14 \u00b7 Interface or attribute change", "url": "/wiki/hook/post_parse_analyze_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=18"}, {"major": "19", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 19 Beta 4 \u00b7 Interface or attribute change", "url": "/wiki/hook/post_parse_analyze_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/post_parse_analyze_hook/?v=20"}], "present": true}, {"slug": "executorcheckperms_hook", "name": "ExecutorCheckPerms_hook", "name_zh": "ExecutorCheckPerms_hook", "category": "Permissions and object access", "summary": "Hook for plugins to get control in ExecCheckPermissions()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/executor/executor.h#L88", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4a55453e497d81e8862f118c14ea412222b64b425a6328b3557221e2506e6415"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L77", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L592", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckRTPerms()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:592"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(rte->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckRTEPerms\n *\t\tCheck access permissions for a single RTE.\n */", "title": "Core call context: src/backend/executor/execMain.c:586\u2013600", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckRTPerms()"]}, "11": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/executor/executor.h#L89", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4ca3e44da367fa36fff5e9ebe2875857fed948af35dc3c97d5f49e0367c5c54a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L77", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L581", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckRTPerms()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:581"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(rte->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckRTEPerms\n *\t\tCheck access permissions for a single RTE.\n */", "title": "Core call context: src/backend/executor/execMain.c:575\u2013589", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckRTPerms()"]}, "12": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/executor/executor.h#L83", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7097ada6b8e6f070734a242da928e51d50bfceae9d1eda37b99b94bf38cd29c0"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L76", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L578", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckRTPerms()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:578"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(rte->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckRTEPerms\n *\t\tCheck access permissions for a single RTE.\n */", "title": "Core call context: src/backend/executor/execMain.c:572\u2013586", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckRTPerms()"]}, "13": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/executor/executor.h#L84", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7dc8f6dd29d6b4749f2b6c4bd89a037f44a192f36002018a9c44067a4e65feb8"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L76", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L569", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckRTPerms()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:569"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(rte->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckRTEPerms\n *\t\tCheck access permissions for a single RTE.\n */", "title": "Core call context: src/backend/executor/execMain.c:563\u2013577", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckRTPerms()"]}, "14": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/executor/executor.h#L84", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4b513bbfa6428b55611c3a2603d46f1f074dc37962dec8b4b36377bcb28ad577"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L78", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L583", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckRTPerms()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:583"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(rte->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckRTEPerms\n *\t\tCheck access permissions for a single RTE.\n */", "title": "Core call context: src/backend/executor/execMain.c:577\u2013591", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckRTPerms()"]}, "15": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/executor/executor.h#L84", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "846a309bea2c181be918afc888d3aad9b9227a20ed7ac402eb6336cea8fbf22b"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L79", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L585", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckRTPerms()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:585"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(rte->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckRTEPerms\n *\t\tCheck access permissions for a single RTE.\n */", "title": "Core call context: src/backend/executor/execMain.c:579\u2013593", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckRTPerms()"]}, "16": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/executor/executor.h#L94", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "e0338e112ca4c1b9368cdf84a1613be0dc6339cd518bf28b707a175e23d6867f"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L79", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L628", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckPermissions()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:628"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(perminfo->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable, rteperminfos,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckOneRelPerms\n *\t\tCheck access permissions for a single relation.\n */", "title": "Core call context: src/backend/executor/execMain.c:622\u2013636", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *rangeTable, List *rtePermInfos, bool ereport_on_violation);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckPermissions()"]}, "17": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/executor/executor.h#L94", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "b30a5ee022ac1ae8cb3cfd93a2c3152ec40a7b60dc85b46f95aef2e3f8791ebe"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L71", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L626", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckPermissions()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:626"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(perminfo->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable, rteperminfos,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckOneRelPerms\n *\t\tCheck access permissions for a single relation.\n */", "title": "Core call context: src/backend/executor/execMain.c:620\u2013634", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *rangeTable, List *rtePermInfos, bool ereport_on_violation);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckPermissions()"]}, "18": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/executor/executor.h#L93", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "65710b17bb91a8fe6367654bb27b67ef7a7c238f79ba46248f92a3b8302cd4bb"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L74", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L636", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckPermissions()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:636"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(perminfo->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable, rteperminfos,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckOneRelPerms\n *\t\tCheck access permissions for a single relation.\n */", "title": "Core call context: src/backend/executor/execMain.c:630\u2013644", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *rangeTable, List *rtePermInfos, bool ereport_on_violation);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckPermissions()"]}, "19": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/executor/executor.h#L95", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L76", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L647", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckPermissions()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:647"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(perminfo->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable, rteperminfos,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckOneRelPerms\n *\t\tCheck access permissions for a single relation.\n */", "title": "Core call context: src/backend/executor/execMain.c:641\u2013655", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *rangeTable, List *rtePermInfos, bool ereport_on_violation);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckPermissions()"]}, "20": {"facts": [{"label": "Interface type", "value": "ExecutorCheckPerms_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/executor/executor.h#L95", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L76", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L647", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook for plugin to get control in ExecCheckPermissions()"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:647"]}, {"code": "\t\t\t\t\t\t\t   get_rel_name(perminfo->relid));\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif (ExecutorCheckPerms_hook)\n\t\tresult = (*ExecutorCheckPerms_hook) (rangeTable, rteperminfos,\n\t\t\t\t\t\t\t\t\t\t\t ereport_on_violation);\n\treturn result;\n}\n\n/*\n * ExecCheckOneRelPerms\n *\t\tCheck access permissions for a single relation.\n */", "title": "Core call context: src/backend/executor/execMain.c:641\u2013655", "paragraphs": []}], "signature": "typedef bool (*ExecutorCheckPerms_hook_type) (List *rangeTable, List *rtePermInfos, bool ereport_on_violation);\nextern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;", "description": ["Hook for plugins to get control in ExecCheckPermissions()"]}}, "content_hash": "0777188db0fa95d49ba8cd74a37f33b7eb8ae6c5a8c8546b4c0d6239518374d5", "imported_at": "2026-09-27T09:57:58.851", "url": "/wiki/hook/executorcheckperms_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=15"}, {"major": "16", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 16 \u00b7 Interface or attribute change", "url": "/wiki/hook/executorcheckperms_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/executorcheckperms_hook/?v=20"}], "present": true}, {"slug": "object_access_hook", "name": "object_access_hook", "name_zh": "object_access_hook", "category": "Permissions and object access", "summary": "Plugin provides a hook function matching one or both of these signatures.", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/catalog/objectaccess.h#L120", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "e30bfd65348d387b238c5e86b76aad5ec508ca42a22879056d376f4cebedaea1"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/catalog/objectaccess.c#L21", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "f8c812a5e01b2a3ffc55c0ae6a8df7b596980da4f051567bafe5aebad684f8c1"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/catalog/objectaccess.c#L40", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "f8c812a5e01b2a3ffc55c0ae6a8df7b596980da4f051567bafe5aebad684f8c1"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:40", "src/backend/catalog/objectaccess.c:62", "src/backend/catalog/objectaccess.c:85", "src/backend/catalog/objectaccess.c:107", "src/backend/catalog/objectaccess.c:125"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * It is entrypoint of OAT_DROP event", "title": "Core call context: src/backend/catalog/objectaccess.c:34\u201348", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * It is entrypoint of OAT_POST_ALTER event", "title": "Core call context: src/backend/catalog/objectaccess.c:56\u201370", "paragraphs": []}, {"code": "\tAssert(object_access_hook != NULL);\n\n\tmemset(&pa_arg, 0, sizeof(ObjectAccessPostAlter));\n\tpa_arg.auxiliary_id = auxiliaryId;\n\tpa_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_ALTER,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pa_arg);\n}\n\n/*\n * RunNamespaceSearchHook\n *\n * It is entrypoint of OAT_NAMESPACE_SEARCH event", "title": "Core call context: src/backend/catalog/objectaccess.c:79\u201393", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching this signature."]}, "11": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/catalog/objectaccess.h#L120", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "f04f07f697df75f4c1afbdfc456672f2251b3d0a182a6a1cd8ec0cfc05652131"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/catalog/objectaccess.c#L21", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "1a4daaa8248ea36d5a9de23e0f054008d9b79cdb3644252b279c00a0436d9a9f"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/catalog/objectaccess.c#L40", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "1a4daaa8248ea36d5a9de23e0f054008d9b79cdb3644252b279c00a0436d9a9f"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:40", "src/backend/catalog/objectaccess.c:62", "src/backend/catalog/objectaccess.c:85", "src/backend/catalog/objectaccess.c:107", "src/backend/catalog/objectaccess.c:125"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * It is entrypoint of OAT_DROP event", "title": "Core call context: src/backend/catalog/objectaccess.c:34\u201348", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * It is entrypoint of OAT_POST_ALTER event", "title": "Core call context: src/backend/catalog/objectaccess.c:56\u201370", "paragraphs": []}, {"code": "\tAssert(object_access_hook != NULL);\n\n\tmemset(&pa_arg, 0, sizeof(ObjectAccessPostAlter));\n\tpa_arg.auxiliary_id = auxiliaryId;\n\tpa_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_ALTER,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pa_arg);\n}\n\n/*\n * RunNamespaceSearchHook\n *\n * It is entrypoint of OAT_NAMESPACE_SEARCH event", "title": "Core call context: src/backend/catalog/objectaccess.c:79\u201393", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching this signature."]}, "12": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/catalog/objectaccess.h#L120", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "d4aed5db7a94fccf12344b86752d17bbf08fc1b85ecf6e8f3e8ed58f49366f15"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/catalog/objectaccess.c#L21", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "d5c529cd17913daf8563aff169d162a5481d8b83cf1e26f86644a1766edfbb77"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/catalog/objectaccess.c#L40", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "d5c529cd17913daf8563aff169d162a5481d8b83cf1e26f86644a1766edfbb77"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:40", "src/backend/catalog/objectaccess.c:62", "src/backend/catalog/objectaccess.c:85", "src/backend/catalog/objectaccess.c:107", "src/backend/catalog/objectaccess.c:125"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * It is entrypoint of OAT_DROP event", "title": "Core call context: src/backend/catalog/objectaccess.c:34\u201348", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * It is entrypoint of OAT_POST_ALTER event", "title": "Core call context: src/backend/catalog/objectaccess.c:56\u201370", "paragraphs": []}, {"code": "\tAssert(object_access_hook != NULL);\n\n\tmemset(&pa_arg, 0, sizeof(ObjectAccessPostAlter));\n\tpa_arg.auxiliary_id = auxiliaryId;\n\tpa_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_ALTER,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pa_arg);\n}\n\n/*\n * RunNamespaceSearchHook\n *\n * It is entrypoint of OAT_NAMESPACE_SEARCH event", "title": "Core call context: src/backend/catalog/objectaccess.c:79\u201393", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching this signature."]}, "13": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/catalog/objectaccess.h#L125", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "a17dca9f250e80aa64ffbcf1d4b3cf0c0223a08c36c654384770cab6284cc856"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/catalog/objectaccess.c#L22", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "24bb183df00689fb682b294bfb201b97a677f5f9519e6281fa80097ba36c1f0f"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/catalog/objectaccess.c#L41", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "24bb183df00689fb682b294bfb201b97a677f5f9519e6281fa80097ba36c1f0f"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:41", "src/backend/catalog/objectaccess.c:63", "src/backend/catalog/objectaccess.c:79", "src/backend/catalog/objectaccess.c:102", "src/backend/catalog/objectaccess.c:124", "src/backend/catalog/objectaccess.c:142"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * It is entrypoint of OAT_DROP event", "title": "Core call context: src/backend/catalog/objectaccess.c:35\u201349", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectTruncateHook\n *\n * It is the entrypoint of OAT_TRUNCATE event", "title": "Core call context: src/backend/catalog/objectaccess.c:57\u201371", "paragraphs": []}, {"code": "void\nRunObjectTruncateHook(Oid objectId)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\t(*object_access_hook) (OAT_TRUNCATE,\n\t\t\t\t\t\t   RelationRelationId, objectId, 0,\n\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * It is entrypoint of OAT_POST_ALTER event", "title": "Core call context: src/backend/catalog/objectaccess.c:73\u201387", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching this signature."]}, "14": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/catalog/objectaccess.h#L125", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "72e3768ff719fe428ad5fb3d6eab6b2301978d058dfa9301ba4b82b31bbb91da"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/catalog/objectaccess.c#L22", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "ebd0e800bba6e1a7b79b319e2993b8db446fea7bc6bc587883d67cd3885aece5"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/catalog/objectaccess.c#L41", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "ebd0e800bba6e1a7b79b319e2993b8db446fea7bc6bc587883d67cd3885aece5"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:41", "src/backend/catalog/objectaccess.c:63", "src/backend/catalog/objectaccess.c:79", "src/backend/catalog/objectaccess.c:102", "src/backend/catalog/objectaccess.c:124", "src/backend/catalog/objectaccess.c:142"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * It is entrypoint of OAT_DROP event", "title": "Core call context: src/backend/catalog/objectaccess.c:35\u201349", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectTruncateHook\n *\n * It is the entrypoint of OAT_TRUNCATE event", "title": "Core call context: src/backend/catalog/objectaccess.c:57\u201371", "paragraphs": []}, {"code": "void\nRunObjectTruncateHook(Oid objectId)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\t(*object_access_hook) (OAT_TRUNCATE,\n\t\t\t\t\t\t   RelationRelationId, objectId, 0,\n\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * It is entrypoint of OAT_POST_ALTER event", "title": "Core call context: src/backend/catalog/objectaccess.c:73\u201387", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching this signature."]}, "15": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/catalog/objectaccess.h#L125", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "ba3dee1a62779eb477851f4f83104b3da763e321244283724468be06ef4be73e"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/catalog/objectaccess.c#L22", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "9b6a2dcdc12c4ce7cf00e8430a07f79a9840a964586fdfa02e3eab64fdb53780"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/catalog/objectaccess.c#L43", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "9b6a2dcdc12c4ce7cf00e8430a07f79a9840a964586fdfa02e3eab64fdb53780"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:43", "src/backend/catalog/objectaccess.c:65", "src/backend/catalog/objectaccess.c:81", "src/backend/catalog/objectaccess.c:104", "src/backend/catalog/objectaccess.c:126", "src/backend/catalog/objectaccess.c:144"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * OAT_DROP object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:37\u201351", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectTruncateHook\n *\n * OAT_TRUNCATE object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:59\u201373", "paragraphs": []}, {"code": "void\nRunObjectTruncateHook(Oid objectId)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\t(*object_access_hook) (OAT_TRUNCATE,\n\t\t\t\t\t\t   RelationRelationId, objectId, 0,\n\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * OAT_POST_ALTER object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:75\u201389", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching one or both of these signatures."]}, "16": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/catalog/objectaccess.h#L127", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "9f45778794866f6869e635a0ea6098120ddb15c80018e891e40e1aeee90d5216"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/catalog/objectaccess.c#L22", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "fc48d03f23ec66885d0154595be8ff27a1db4c67f132f0a8ef309e1efe56308a"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/catalog/objectaccess.c#L43", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "fc48d03f23ec66885d0154595be8ff27a1db4c67f132f0a8ef309e1efe56308a"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:43", "src/backend/catalog/objectaccess.c:65", "src/backend/catalog/objectaccess.c:81", "src/backend/catalog/objectaccess.c:104", "src/backend/catalog/objectaccess.c:126", "src/backend/catalog/objectaccess.c:144"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * OAT_DROP object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:37\u201351", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectTruncateHook\n *\n * OAT_TRUNCATE object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:59\u201373", "paragraphs": []}, {"code": "void\nRunObjectTruncateHook(Oid objectId)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\t(*object_access_hook) (OAT_TRUNCATE,\n\t\t\t\t\t\t   RelationRelationId, objectId, 0,\n\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * OAT_POST_ALTER object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:75\u201389", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching one or both of these signatures."]}, "17": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/catalog/objectaccess.h#L127", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "5543550c9a6ac36fbde11cbf81a4f784b48745c78687092f2ba20e6b87e8a9c7"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/catalog/objectaccess.c#L22", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "60ddde03a6c19eaf5189727359fefb8f4ce86d0b59e1765fd87482759ef4faa3"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/catalog/objectaccess.c#L43", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "60ddde03a6c19eaf5189727359fefb8f4ce86d0b59e1765fd87482759ef4faa3"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:43", "src/backend/catalog/objectaccess.c:65", "src/backend/catalog/objectaccess.c:81", "src/backend/catalog/objectaccess.c:104", "src/backend/catalog/objectaccess.c:126", "src/backend/catalog/objectaccess.c:144"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * OAT_DROP object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:37\u201351", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectTruncateHook\n *\n * OAT_TRUNCATE object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:59\u201373", "paragraphs": []}, {"code": "void\nRunObjectTruncateHook(Oid objectId)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\t(*object_access_hook) (OAT_TRUNCATE,\n\t\t\t\t\t\t   RelationRelationId, objectId, 0,\n\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * OAT_POST_ALTER object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:75\u201389", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching one or both of these signatures."]}, "18": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/catalog/objectaccess.h#L127", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "600e3cf42fb4c9bd8cdfa7f048dd1b7677bad5c558c9b65ecb976145d14c7781"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/catalog/objectaccess.c#L22", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "37c09c923b0b0f07bcff22462814d4282fae75355b2e9058d63c68de2be76c91"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/catalog/objectaccess.c#L43", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "37c09c923b0b0f07bcff22462814d4282fae75355b2e9058d63c68de2be76c91"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:43", "src/backend/catalog/objectaccess.c:65", "src/backend/catalog/objectaccess.c:81", "src/backend/catalog/objectaccess.c:104", "src/backend/catalog/objectaccess.c:126", "src/backend/catalog/objectaccess.c:144"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * OAT_DROP object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:37\u201351", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   &drop_arg);\n}\n\n/*\n * RunObjectTruncateHook\n *\n * OAT_TRUNCATE object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:59\u201373", "paragraphs": []}, {"code": "void\nRunObjectTruncateHook(Oid objectId)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\t(*object_access_hook) (OAT_TRUNCATE,\n\t\t\t\t\t\t   RelationRelationId, objectId, 0,\n\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * OAT_POST_ALTER object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:75\u201389", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching one or both of these signatures."]}, "19": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/catalog/objectaccess.h#L127", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "88dd617183bc0d0bfe74c9a591549c6b82cb5a65a96c2624f87f826249f59f6a"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/catalog/objectaccess.c#L22", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "458f41ace06b23e7aa5807ec8f620176749701b421b1b96bab87b7c86fe832b2"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/catalog/objectaccess.c#L43", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "458f41ace06b23e7aa5807ec8f620176749701b421b1b96bab87b7c86fe832b2"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:43", "src/backend/catalog/objectaccess.c:65", "src/backend/catalog/objectaccess.c:81", "src/backend/catalog/objectaccess.c:104", "src/backend/catalog/objectaccess.c:126", "src/backend/catalog/objectaccess.c:144"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * OAT_DROP object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:37\u201351", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   &drop_arg);\n}\n\n/*\n * RunObjectTruncateHook\n *\n * OAT_TRUNCATE object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:59\u201373", "paragraphs": []}, {"code": "void\nRunObjectTruncateHook(Oid objectId)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\t(*object_access_hook) (OAT_TRUNCATE,\n\t\t\t\t\t\t   RelationRelationId, objectId, 0,\n\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * OAT_POST_ALTER object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:75\u201389", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching one or both of these signatures."]}, "20": {"facts": [{"label": "Interface type", "value": "object_access_hook_type"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/catalog/objectaccess.h#L127", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "88dd617183bc0d0bfe74c9a591549c6b82cb5a65a96c2624f87f826249f59f6a"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/catalog/objectaccess.c#L22", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "458f41ace06b23e7aa5807ec8f620176749701b421b1b96bab87b7c86fe832b2"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/catalog/objectaccess.c#L43", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "458f41ace06b23e7aa5807ec8f620176749701b421b1b96bab87b7c86fe832b2"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hook on object accesses. This is intended as infrastructure for security and logging plugins."]}, {"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:43", "src/backend/catalog/objectaccess.c:65", "src/backend/catalog/objectaccess.c:81", "src/backend/catalog/objectaccess.c:104", "src/backend/catalog/objectaccess.c:126", "src/backend/catalog/objectaccess.c:144"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook) (OAT_POST_CREATE,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   &pc_arg);\n}\n\n/*\n * RunObjectDropHook\n *\n * OAT_DROP object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:37\u201351", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook) (OAT_DROP,\n\t\t\t\t\t\t   classId, objectId, subId,\n\t\t\t\t\t\t   &drop_arg);\n}\n\n/*\n * RunObjectTruncateHook\n *\n * OAT_TRUNCATE object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:59\u201373", "paragraphs": []}, {"code": "void\nRunObjectTruncateHook(Oid objectId)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook != NULL);\n\n\t(*object_access_hook) (OAT_TRUNCATE,\n\t\t\t\t\t\t   RelationRelationId, objectId, 0,\n\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHook\n *\n * OAT_POST_ALTER object ID based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:75\u201389", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type) (ObjectAccessType access, Oid classId, Oid objectId, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type object_access_hook;", "description": ["Plugin provides a hook function matching one or both of these signatures."]}}, "content_hash": "8b52090e31aef806ad8077906062e2ae1a510df069fb79b3653067bb3acc7c62", "imported_at": "2026-09-27T09:57:58.853", "url": "/wiki/hook/object_access_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/object_access_hook/?v=20"}], "present": true}, {"slug": "object_access_hook_str", "name": "object_access_hook_str", "name_zh": "object_access_hook_str", "category": "Permissions and object access", "summary": "object_access_hook_str: core extension hook declared in src/include/catalog/objectaccess.h. The exact interface and call sites are recorded below.", "aliases": [], "versions": {"15": {"facts": [{"label": "Interface type", "value": "object_access_hook_type_str"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/catalog/objectaccess.h#L131", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "ba3dee1a62779eb477851f4f83104b3da763e321244283724468be06ef4be73e"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/catalog/objectaccess.c#L23", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "9b6a2dcdc12c4ce7cf00e8430a07f79a9840a964586fdfa02e3eab64fdb53780"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/catalog/objectaccess.c#L169", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "9b6a2dcdc12c4ce7cf00e8430a07f79a9840a964586fdfa02e3eab64fdb53780"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:169", "src/backend/catalog/objectaccess.c:191", "src/backend/catalog/objectaccess.c:207", "src/backend/catalog/objectaccess.c:230", "src/backend/catalog/objectaccess.c:252", "src/backend/catalog/objectaccess.c:270"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook_str) (OAT_POST_CREATE,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHookStr\n *\n * OAT_DROP object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:163\u2013177", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook_str) (OAT_DROP,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectTruncateHookStr\n *\n * OAT_TRUNCATE object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:185\u2013199", "paragraphs": []}, {"code": "void\nRunObjectTruncateHookStr(const char *objectName)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\t(*object_access_hook_str) (OAT_TRUNCATE,\n\t\t\t\t\t\t\t   RelationRelationId, objectName, 0,\n\t\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHookStr\n *\n * OAT_POST_ALTER object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:201\u2013215", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type_str) (ObjectAccessType access, Oid classId, const char *objectStr, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type_str object_access_hook_str;", "description": ["object_access_hook_str: core extension hook declared in src/include/catalog/objectaccess.h. The exact interface and call sites are recorded below."]}, "16": {"facts": [{"label": "Interface type", "value": "object_access_hook_type_str"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/catalog/objectaccess.h#L133", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "9f45778794866f6869e635a0ea6098120ddb15c80018e891e40e1aeee90d5216"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/catalog/objectaccess.c#L23", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "fc48d03f23ec66885d0154595be8ff27a1db4c67f132f0a8ef309e1efe56308a"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/catalog/objectaccess.c#L169", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "fc48d03f23ec66885d0154595be8ff27a1db4c67f132f0a8ef309e1efe56308a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:169", "src/backend/catalog/objectaccess.c:191", "src/backend/catalog/objectaccess.c:207", "src/backend/catalog/objectaccess.c:230", "src/backend/catalog/objectaccess.c:252", "src/backend/catalog/objectaccess.c:270"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook_str) (OAT_POST_CREATE,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHookStr\n *\n * OAT_DROP object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:163\u2013177", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook_str) (OAT_DROP,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectTruncateHookStr\n *\n * OAT_TRUNCATE object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:185\u2013199", "paragraphs": []}, {"code": "void\nRunObjectTruncateHookStr(const char *objectName)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\t(*object_access_hook_str) (OAT_TRUNCATE,\n\t\t\t\t\t\t\t   RelationRelationId, objectName, 0,\n\t\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHookStr\n *\n * OAT_POST_ALTER object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:201\u2013215", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type_str) (ObjectAccessType access, Oid classId, const char *objectStr, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type_str object_access_hook_str;", "description": ["object_access_hook_str: core extension hook declared in src/include/catalog/objectaccess.h. The exact interface and call sites are recorded below."]}, "17": {"facts": [{"label": "Interface type", "value": "object_access_hook_type_str"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/catalog/objectaccess.h#L133", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "5543550c9a6ac36fbde11cbf81a4f784b48745c78687092f2ba20e6b87e8a9c7"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/catalog/objectaccess.c#L23", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "60ddde03a6c19eaf5189727359fefb8f4ce86d0b59e1765fd87482759ef4faa3"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/catalog/objectaccess.c#L169", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "60ddde03a6c19eaf5189727359fefb8f4ce86d0b59e1765fd87482759ef4faa3"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:169", "src/backend/catalog/objectaccess.c:191", "src/backend/catalog/objectaccess.c:207", "src/backend/catalog/objectaccess.c:230", "src/backend/catalog/objectaccess.c:252", "src/backend/catalog/objectaccess.c:270"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook_str) (OAT_POST_CREATE,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   (void *) &pc_arg);\n}\n\n/*\n * RunObjectDropHookStr\n *\n * OAT_DROP object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:163\u2013177", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook_str) (OAT_DROP,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   (void *) &drop_arg);\n}\n\n/*\n * RunObjectTruncateHookStr\n *\n * OAT_TRUNCATE object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:185\u2013199", "paragraphs": []}, {"code": "void\nRunObjectTruncateHookStr(const char *objectName)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\t(*object_access_hook_str) (OAT_TRUNCATE,\n\t\t\t\t\t\t\t   RelationRelationId, objectName, 0,\n\t\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHookStr\n *\n * OAT_POST_ALTER object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:201\u2013215", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type_str) (ObjectAccessType access, Oid classId, const char *objectStr, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type_str object_access_hook_str;", "description": ["object_access_hook_str: core extension hook declared in src/include/catalog/objectaccess.h. The exact interface and call sites are recorded below."]}, "18": {"facts": [{"label": "Interface type", "value": "object_access_hook_type_str"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/catalog/objectaccess.h#L133", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "600e3cf42fb4c9bd8cdfa7f048dd1b7677bad5c558c9b65ecb976145d14c7781"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/catalog/objectaccess.c#L23", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "37c09c923b0b0f07bcff22462814d4282fae75355b2e9058d63c68de2be76c91"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/catalog/objectaccess.c#L169", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "37c09c923b0b0f07bcff22462814d4282fae75355b2e9058d63c68de2be76c91"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:169", "src/backend/catalog/objectaccess.c:191", "src/backend/catalog/objectaccess.c:207", "src/backend/catalog/objectaccess.c:230", "src/backend/catalog/objectaccess.c:252", "src/backend/catalog/objectaccess.c:270"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook_str) (OAT_POST_CREATE,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   &pc_arg);\n}\n\n/*\n * RunObjectDropHookStr\n *\n * OAT_DROP object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:163\u2013177", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook_str) (OAT_DROP,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   &drop_arg);\n}\n\n/*\n * RunObjectTruncateHookStr\n *\n * OAT_TRUNCATE object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:185\u2013199", "paragraphs": []}, {"code": "void\nRunObjectTruncateHookStr(const char *objectName)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\t(*object_access_hook_str) (OAT_TRUNCATE,\n\t\t\t\t\t\t\t   RelationRelationId, objectName, 0,\n\t\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHookStr\n *\n * OAT_POST_ALTER object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:201\u2013215", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type_str) (ObjectAccessType access, Oid classId, const char *objectStr, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type_str object_access_hook_str;", "description": ["object_access_hook_str: core extension hook declared in src/include/catalog/objectaccess.h. The exact interface and call sites are recorded below."]}, "19": {"facts": [{"label": "Interface type", "value": "object_access_hook_type_str"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/catalog/objectaccess.h#L133", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "88dd617183bc0d0bfe74c9a591549c6b82cb5a65a96c2624f87f826249f59f6a"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/catalog/objectaccess.c#L23", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "458f41ace06b23e7aa5807ec8f620176749701b421b1b96bab87b7c86fe832b2"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/catalog/objectaccess.c#L169", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "458f41ace06b23e7aa5807ec8f620176749701b421b1b96bab87b7c86fe832b2"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:169", "src/backend/catalog/objectaccess.c:191", "src/backend/catalog/objectaccess.c:207", "src/backend/catalog/objectaccess.c:230", "src/backend/catalog/objectaccess.c:252", "src/backend/catalog/objectaccess.c:270"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook_str) (OAT_POST_CREATE,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   &pc_arg);\n}\n\n/*\n * RunObjectDropHookStr\n *\n * OAT_DROP object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:163\u2013177", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook_str) (OAT_DROP,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   &drop_arg);\n}\n\n/*\n * RunObjectTruncateHookStr\n *\n * OAT_TRUNCATE object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:185\u2013199", "paragraphs": []}, {"code": "void\nRunObjectTruncateHookStr(const char *objectName)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\t(*object_access_hook_str) (OAT_TRUNCATE,\n\t\t\t\t\t\t\t   RelationRelationId, objectName, 0,\n\t\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHookStr\n *\n * OAT_POST_ALTER object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:201\u2013215", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type_str) (ObjectAccessType access, Oid classId, const char *objectStr, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type_str object_access_hook_str;", "description": ["object_access_hook_str: core extension hook declared in src/include/catalog/objectaccess.h. The exact interface and call sites are recorded below."]}, "20": {"facts": [{"label": "Interface type", "value": "object_access_hook_type_str"}, {"label": "Header", "value": "src/include/catalog/objectaccess.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/catalog/objectaccess.h#L133", "path": "src/include/catalog/objectaccess.h", "label": "Interface declaration", "sha256": "88dd617183bc0d0bfe74c9a591549c6b82cb5a65a96c2624f87f826249f59f6a"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/catalog/objectaccess.c#L23", "path": "src/backend/catalog/objectaccess.c", "label": "Core definition", "sha256": "458f41ace06b23e7aa5807ec8f620176749701b421b1b96bab87b7c86fe832b2"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/catalog/objectaccess.c#L169", "path": "src/backend/catalog/objectaccess.c", "label": "Call sites", "sha256": "458f41ace06b23e7aa5807ec8f620176749701b421b1b96bab87b7c86fe832b2"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/catalog/objectaccess.c:169", "src/backend/catalog/objectaccess.c:191", "src/backend/catalog/objectaccess.c:207", "src/backend/catalog/objectaccess.c:230", "src/backend/catalog/objectaccess.c:252", "src/backend/catalog/objectaccess.c:270"]}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&pc_arg, 0, sizeof(ObjectAccessPostCreate));\n\tpc_arg.is_internal = is_internal;\n\n\t(*object_access_hook_str) (OAT_POST_CREATE,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   &pc_arg);\n}\n\n/*\n * RunObjectDropHookStr\n *\n * OAT_DROP object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:163\u2013177", "paragraphs": []}, {"code": "\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\tmemset(&drop_arg, 0, sizeof(ObjectAccessDrop));\n\tdrop_arg.dropflags = dropflags;\n\n\t(*object_access_hook_str) (OAT_DROP,\n\t\t\t\t\t\t\t   classId, objectName, subId,\n\t\t\t\t\t\t\t   &drop_arg);\n}\n\n/*\n * RunObjectTruncateHookStr\n *\n * OAT_TRUNCATE object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:185\u2013199", "paragraphs": []}, {"code": "void\nRunObjectTruncateHookStr(const char *objectName)\n{\n\t/* caller should check, but just in case... */\n\tAssert(object_access_hook_str != NULL);\n\n\t(*object_access_hook_str) (OAT_TRUNCATE,\n\t\t\t\t\t\t\t   RelationRelationId, objectName, 0,\n\t\t\t\t\t\t\t   NULL);\n}\n\n/*\n * RunObjectPostAlterHookStr\n *\n * OAT_POST_ALTER object name based event hook entrypoint", "title": "Core call context: src/backend/catalog/objectaccess.c:201\u2013215", "paragraphs": []}], "signature": "typedef void (*object_access_hook_type_str) (ObjectAccessType access, Oid classId, const char *objectStr, int subId, void *arg);\nextern PGDLLIMPORT object_access_hook_type_str object_access_hook_str;", "description": ["object_access_hook_str: core extension hook declared in src/include/catalog/objectaccess.h. The exact interface and call sites are recorded below."]}}, "content_hash": "2c57d97b48bd69f9c34287f2d2c2c88fc3e682fdc67bb1c434df3c04c0953817", "imported_at": "2026-09-27T09:57:58.855", "url": "/wiki/hook/object_access_hook_str/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/object_access_hook_str/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/object_access_hook_str/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/object_access_hook_str/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/object_access_hook_str/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/object_access_hook_str/?v=14"}, {"major": "15", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 15 \u00b7 First recorded in this sample", "url": "/wiki/hook/object_access_hook_str/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook_str/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook_str/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook_str/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/object_access_hook_str/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/object_access_hook_str/?v=20"}], "present": true}, {"slug": "row_security_policy_hook_permissive", "name": "row_security_policy_hook_permissive", "name_zh": "row_security_policy_hook_permissive", "category": "Permissions and object access", "summary": "hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND).", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "07a72720388c27543f5b7565cf0eefabcc90a337ec2af3a07cdb4473220dd47d"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/rewrite/rowsecurity.c#L96", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "c406a44b5a0a36191ea6bcf77bef1c2b4d2a9bc7f94e371e5e33795a737bda9f"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/rewrite/rowsecurity.c#L505", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "c406a44b5a0a36191ea6bcf77bef1c2b4d2a9bc7f94e371e5e33795a737bda9f"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:505"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:499\u2013513", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "11": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "d929037d638b90ed6d219b880ce7a2ca34b1fbbe751e6ab01f51cd4a09d8aac5"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/rewrite/rowsecurity.c#L96", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "2deefb312cce0c9ce009f9f606abd469df574507faccf6bb5ab789d67f4bb000"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/rewrite/rowsecurity.c#L505", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "2deefb312cce0c9ce009f9f606abd469df574507faccf6bb5ab789d67f4bb000"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:505"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:499\u2013513", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "12": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "4136a6bc4fcea2811d6bd8052a1aed59259c4877f0b3615821298a3bb8fc6197"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/rewrite/rowsecurity.c#L96", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "c9ee16a059158502196f5669fb153872388f382a3275dc4cbaa4a90e34111859"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/rewrite/rowsecurity.c#L505", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "c9ee16a059158502196f5669fb153872388f382a3275dc4cbaa4a90e34111859"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:505"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:499\u2013513", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "13": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "331920cc72b344ccea3831b37290d2551ed0d5039793816572f8c66ce9c47faa"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/rewrite/rowsecurity.c#L96", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "023954d3c9f688fe4b483032be19bd4c6717403008f7d0d6ec1d3860877622ff"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/rewrite/rowsecurity.c#L503", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "023954d3c9f688fe4b483032be19bd4c6717403008f7d0d6ec1d3860877622ff"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:503"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:497\u2013511", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "14": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "6a0b1ec1b63872cdfcfcda260354c5969bd38966ff35ff0374bf424c08e6aa25"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/rewrite/rowsecurity.c#L96", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "5aaccb6b64360bf3d9d791203205cddec0c3b0ff5ec6b2fcee485ae85d45cd6c"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/rewrite/rowsecurity.c#L503", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "5aaccb6b64360bf3d9d791203205cddec0c3b0ff5ec6b2fcee485ae85d45cd6c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:503"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:497\u2013511", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "15": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "829c9cf50f3e72b38885b310c27ef2e03d44675832de9e3ae3feec8373d89f05"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/rewrite/rowsecurity.c#L96", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "0ad74d267cfddab7fdd8fc5763fa30667f9ce58eef12f9d1e5a79c8f3fe80a3b"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/rewrite/rowsecurity.c#L634", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "0ad74d267cfddab7fdd8fc5763fa30667f9ce58eef12f9d1e5a79c8f3fe80a3b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:634"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:628\u2013642", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "16": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "0b21b9f1884d1c0417f1d27502d91a9116ea8ab14aec2aa2daf7b1ae77fc38b9"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/rewrite/rowsecurity.c#L97", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "ebb45f5b2794ba860e6738824dc4a74ce9888edec109f0f9cdbea70ee0799169"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/rewrite/rowsecurity.c#L641", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "ebb45f5b2794ba860e6738824dc4a74ce9888edec109f0f9cdbea70ee0799169"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:641"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:635\u2013649", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "17": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "e5aa6f98457bb7cb765182cf6e08ec03b3655bea20789292ff8d4682c8adc4b4"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/rewrite/rowsecurity.c#L86", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "cc73950f43f4c4c6b26d98e9d184babd5f1d5d3a177336d75f5a19c9abd49851"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/rewrite/rowsecurity.c#L644", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "cc73950f43f4c4c6b26d98e9d184babd5f1d5d3a177336d75f5a19c9abd49851"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:644"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:638\u2013652", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "18": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "3b195aed12c4378146a3e74d7873676f6e7e80f18f4fe9ef6bc125ef2f9cea24"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/rewrite/rowsecurity.c#L86", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "dca1d39120cb8f5cca60caf1264de7c3b5ce6f30c1a17ce1d5a42da0be6cf75c"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/rewrite/rowsecurity.c#L644", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "dca1d39120cb8f5cca60caf1264de7c3b5ce6f30c1a17ce1d5a42da0be6cf75c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:644"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:638\u2013652", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "19": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "30a091cdb4b8fe9166dd7c824c3f491d9d0433995667cdb1950cc023e5878e19"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/rewrite/rowsecurity.c#L86", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "e635229a5bd8af566e8122e76c6636027897442614f62b49696af2f5464139a0"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/rewrite/rowsecurity.c#L659", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "e635229a5bd8af566e8122e76c6636027897442614f62b49696af2f5464139a0"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:659"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:653\u2013667", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}, "20": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "30a091cdb4b8fe9166dd7c824c3f491d9d0433995667cdb1950cc023e5878e19"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/rewrite/rowsecurity.c#L86", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "e635229a5bd8af566e8122e76c6636027897442614f62b49696af2f5464139a0"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/rewrite/rowsecurity.c#L659", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "e635229a5bd8af566e8122e76c6636027897442614f62b49696af2f5464139a0"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:659"]}, {"code": "\t\t}\n\t}\n\n\tif (row_security_policy_hook_permissive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_permissive) (cmd, relation);\n\n\t\tforeach(item, hook_policies)\n\t\t{\n\t\t\tRowSecurityPolicy *policy = (RowSecurityPolicy *) lfirst(item);\n\n\t\t\tif (check_role_for_policy(policy->roles, user_id))\n\t\t\t\t*permissive_policies = lappend(*permissive_policies, policy);\n\t\t}", "title": "Core call context: src/backend/rewrite/rowsecurity.c:653\u2013667", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_permissive;", "description": ["hooks to allow extensions to add their own security policies row_security_policy_hook_permissive can be used to add policies which are combined with the other permissive policies, using OR. row_security_policy_hook_restrictive can be used to add policies which are enforced, regardless of other policies (they are combined using AND)."]}}, "content_hash": "ef26807d10f253e7fc7572a7ab90ae1298136995c999cb90c00169759f9ecb55", "imported_at": "2026-09-27T09:57:58.857", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_permissive/?v=20"}], "present": true}, {"slug": "row_security_policy_hook_restrictive", "name": "row_security_policy_hook_restrictive", "name_zh": "row_security_policy_hook_restrictive", "category": "Permissions and object access", "summary": "row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below.", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "07a72720388c27543f5b7565cf0eefabcc90a337ec2af3a07cdb4473220dd47d"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/rewrite/rowsecurity.c#L97", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "c406a44b5a0a36191ea6bcf77bef1c2b4d2a9bc7f94e371e5e33795a737bda9f"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/rewrite/rowsecurity.c#L483", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "c406a44b5a0a36191ea6bcf77bef1c2b4d2a9bc7f94e371e5e33795a737bda9f"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:483"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\thook_policies = sort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:477\u2013491", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "11": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "d929037d638b90ed6d219b880ce7a2ca34b1fbbe751e6ab01f51cd4a09d8aac5"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/rewrite/rowsecurity.c#L97", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "2deefb312cce0c9ce009f9f606abd469df574507faccf6bb5ab789d67f4bb000"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/rewrite/rowsecurity.c#L483", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "2deefb312cce0c9ce009f9f606abd469df574507faccf6bb5ab789d67f4bb000"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:483"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\thook_policies = sort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:477\u2013491", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "12": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "4136a6bc4fcea2811d6bd8052a1aed59259c4877f0b3615821298a3bb8fc6197"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/rewrite/rowsecurity.c#L97", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "c9ee16a059158502196f5669fb153872388f382a3275dc4cbaa4a90e34111859"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/rewrite/rowsecurity.c#L483", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "c9ee16a059158502196f5669fb153872388f382a3275dc4cbaa4a90e34111859"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:483"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\thook_policies = sort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:477\u2013491", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "13": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "331920cc72b344ccea3831b37290d2551ed0d5039793816572f8c66ce9c47faa"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/rewrite/rowsecurity.c#L97", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "023954d3c9f688fe4b483032be19bd4c6717403008f7d0d6ec1d3860877622ff"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/rewrite/rowsecurity.c#L481", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "023954d3c9f688fe4b483032be19bd4c6717403008f7d0d6ec1d3860877622ff"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:481"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\tsort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:475\u2013489", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "14": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "6a0b1ec1b63872cdfcfcda260354c5969bd38966ff35ff0374bf424c08e6aa25"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/rewrite/rowsecurity.c#L97", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "5aaccb6b64360bf3d9d791203205cddec0c3b0ff5ec6b2fcee485ae85d45cd6c"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/rewrite/rowsecurity.c#L481", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "5aaccb6b64360bf3d9d791203205cddec0c3b0ff5ec6b2fcee485ae85d45cd6c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:481"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\tsort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:475\u2013489", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "15": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "829c9cf50f3e72b38885b310c27ef2e03d44675832de9e3ae3feec8373d89f05"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/rewrite/rowsecurity.c#L97", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "0ad74d267cfddab7fdd8fc5763fa30667f9ce58eef12f9d1e5a79c8f3fe80a3b"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/rewrite/rowsecurity.c#L612", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "0ad74d267cfddab7fdd8fc5763fa30667f9ce58eef12f9d1e5a79c8f3fe80a3b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:612"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\tsort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:606\u2013620", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "16": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "0b21b9f1884d1c0417f1d27502d91a9116ea8ab14aec2aa2daf7b1ae77fc38b9"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/rewrite/rowsecurity.c#L98", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "ebb45f5b2794ba860e6738824dc4a74ce9888edec109f0f9cdbea70ee0799169"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/rewrite/rowsecurity.c#L619", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "ebb45f5b2794ba860e6738824dc4a74ce9888edec109f0f9cdbea70ee0799169"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:619"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\tsort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:613\u2013627", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "17": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "e5aa6f98457bb7cb765182cf6e08ec03b3655bea20789292ff8d4682c8adc4b4"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/rewrite/rowsecurity.c#L87", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "cc73950f43f4c4c6b26d98e9d184babd5f1d5d3a177336d75f5a19c9abd49851"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/rewrite/rowsecurity.c#L622", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "cc73950f43f4c4c6b26d98e9d184babd5f1d5d3a177336d75f5a19c9abd49851"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:622"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\tsort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:616\u2013630", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "18": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "3b195aed12c4378146a3e74d7873676f6e7e80f18f4fe9ef6bc125ef2f9cea24"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/rewrite/rowsecurity.c#L87", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "dca1d39120cb8f5cca60caf1264de7c3b5ce6f30c1a17ce1d5a42da0be6cf75c"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/rewrite/rowsecurity.c#L622", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "dca1d39120cb8f5cca60caf1264de7c3b5ce6f30c1a17ce1d5a42da0be6cf75c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:622"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\tsort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:616\u2013630", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "19": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "30a091cdb4b8fe9166dd7c824c3f491d9d0433995667cdb1950cc023e5878e19"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/rewrite/rowsecurity.c#L87", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "e635229a5bd8af566e8122e76c6636027897442614f62b49696af2f5464139a0"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/rewrite/rowsecurity.c#L637", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "e635229a5bd8af566e8122e76c6636027897442614f62b49696af2f5464139a0"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:637"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\tsort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:631\u2013645", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}, "20": {"facts": [{"label": "Interface type", "value": "row_security_policy_hook_type"}, {"label": "Header", "value": "src/include/rewrite/rowsecurity.h"}, {"label": "Subsystem", "value": "Permissions and object access"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/ddl-rowsecurity.html", "label": "Row Security Policies"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/rewrite/rowsecurity.h#L37", "path": "src/include/rewrite/rowsecurity.h", "label": "Interface declaration", "sha256": "30a091cdb4b8fe9166dd7c824c3f491d9d0433995667cdb1950cc023e5878e19"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/rewrite/rowsecurity.c#L87", "path": "src/backend/rewrite/rowsecurity.c", "label": "Core definition", "sha256": "e635229a5bd8af566e8122e76c6636027897442614f62b49696af2f5464139a0"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/rewrite/rowsecurity.c#L637", "path": "src/backend/rewrite/rowsecurity.c", "label": "Call sites", "sha256": "e635229a5bd8af566e8122e76c6636027897442614f62b49696af2f5464139a0"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/rewrite/rowsecurity.c:637"]}, {"code": "\t * These are simply appended to the lists of internal policies, if they\n\t * apply to the specified role.\n\t */\n\tif (row_security_policy_hook_restrictive)\n\t{\n\t\tList\t   *hook_policies =\n\t\t\t(*row_security_policy_hook_restrictive) (cmd, relation);\n\n\t\t/*\n\t\t * As with built-in restrictive policies, we sort any hook-provided\n\t\t * restrictive policies by name also.  Note that we also intentionally\n\t\t * always check all built-in restrictive policies, in name order,\n\t\t * before checking restrictive policies added by hooks, in name order.\n\t\t */\n\t\tsort_policies_by_name(hook_policies);", "title": "Core call context: src/backend/rewrite/rowsecurity.c:631\u2013645", "paragraphs": []}], "signature": "typedef List *(*row_security_policy_hook_type) (CmdType cmdtype, Relation relation);\nextern PGDLLIMPORT row_security_policy_hook_type row_security_policy_hook_restrictive;", "description": ["row_security_policy_hook_restrictive: core extension hook declared in src/include/rewrite/rowsecurity.h. The exact interface and call sites are recorded below."]}}, "content_hash": "424f5f135da3a4fcdcf6fbe6cad4fbb1020ef6ffe30bbaa0d32de98ac4e054c1", "imported_at": "2026-09-27T09:57:58.859", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/row_security_policy_hook_restrictive/?v=20"}], "present": true}, {"slug": "executorend_hook", "name": "ExecutorEnd_hook", "name_zh": "ExecutorEnd_hook", "category": "Query execution", "summary": "Hook for plugins to get control in ExecutorEnd()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/executor.html", "label": "The Executor"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/executor/executor.h#L84", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4a55453e497d81e8862f118c14ea412222b64b425a6328b3557221e2506e6415"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L74", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L465", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:465"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:459\u2013473", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "11": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/executor.html", "label": "The Executor"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/executor/executor.h#L85", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4ca3e44da367fa36fff5e9ebe2875857fed948af35dc3c97d5f49e0367c5c54a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L74", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L454", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:454"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:448\u2013462", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "12": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/executor.html", "label": "The Executor"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/executor/executor.h#L79", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7097ada6b8e6f070734a242da928e51d50bfceae9d1eda37b99b94bf38cd29c0"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L451", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:451"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:445\u2013459", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "13": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/executor.html", "label": "The Executor"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/executor/executor.h#L80", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7dc8f6dd29d6b4749f2b6c4bd89a037f44a192f36002018a9c44067a4e65feb8"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L442", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:442"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:436\u2013450", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "14": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/executor.html", "label": "The Executor"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/executor/executor.h#L80", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4b513bbfa6428b55611c3a2603d46f1f074dc37962dec8b4b36377bcb28ad577"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L75", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L456", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:456"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:450\u2013464", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "15": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/executor.html", "label": "The Executor"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/executor/executor.h#L80", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "846a309bea2c181be918afc888d3aad9b9227a20ed7ac402eb6336cea8fbf22b"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L76", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L458", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:458"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:452\u2013466", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "16": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/executor.html", "label": "The Executor"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/executor/executor.h#L90", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "e0338e112ca4c1b9368cdf84a1613be0dc6339cd518bf28b707a175e23d6867f"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L76", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L465", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:465"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:459\u2013473", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "17": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/executor.html", "label": "The Executor"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/executor/executor.h#L90", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "b30a5ee022ac1ae8cb3cfd93a2c3152ec40a7b60dc85b46f95aef2e3f8791ebe"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L68", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L463", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:463"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:457\u2013471", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "18": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/executor.html", "label": "The Executor"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/executor/executor.h#L89", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "65710b17bb91a8fe6367654bb27b67ef7a7c238f79ba46248f92a3b8302cd4bb"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L71", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L469", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:469"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:463\u2013477", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "19": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/executor.html", "label": "The Executor"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/executor/executor.h#L91", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L480", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:480"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:474\u2013488", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}, "20": {"facts": [{"label": "Interface type", "value": "ExecutorEnd_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/executor.html", "label": "The Executor"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/executor/executor.h#L91", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L480", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:480"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorEnd(QueryDesc *queryDesc)\n{\n\tif (ExecutorEnd_hook)\n\t\t(*ExecutorEnd_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorEnd(queryDesc);\n}\n\nvoid\nstandard_ExecutorEnd(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:474\u2013488", "paragraphs": []}], "signature": "typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;", "description": ["Hook for plugins to get control in ExecutorEnd()"]}}, "content_hash": "c000cd9b1abd39e15ed8fb272cb4a8e81040e2eacfb4abb73c5d25396506c482", "imported_at": "2026-09-27T09:57:58.860", "url": "/wiki/hook/executorend_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/executorend_hook/?v=20"}], "present": true}, {"slug": "executorfinish_hook", "name": "ExecutorFinish_hook", "name_zh": "ExecutorFinish_hook", "category": "Query execution", "summary": "Hook for plugins to get control in ExecutorFinish()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/executor.html", "label": "The Executor"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/executor/executor.h#L80", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4a55453e497d81e8862f118c14ea412222b64b425a6328b3557221e2506e6415"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L405", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:405"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:399\u2013413", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "11": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/executor.html", "label": "The Executor"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/executor/executor.h#L81", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4ca3e44da367fa36fff5e9ebe2875857fed948af35dc3c97d5f49e0367c5c54a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L394", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:394"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:388\u2013402", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "12": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/executor.html", "label": "The Executor"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/executor/executor.h#L75", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7097ada6b8e6f070734a242da928e51d50bfceae9d1eda37b99b94bf38cd29c0"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L72", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L391", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:391"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:385\u2013399", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "13": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/executor.html", "label": "The Executor"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/executor/executor.h#L76", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7dc8f6dd29d6b4749f2b6c4bd89a037f44a192f36002018a9c44067a4e65feb8"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L72", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L382", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:382"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:376\u2013390", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "14": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/executor.html", "label": "The Executor"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/executor/executor.h#L76", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4b513bbfa6428b55611c3a2603d46f1f074dc37962dec8b4b36377bcb28ad577"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L74", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L396", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:396"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:390\u2013404", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "15": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/executor.html", "label": "The Executor"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/executor/executor.h#L76", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "846a309bea2c181be918afc888d3aad9b9227a20ed7ac402eb6336cea8fbf22b"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L75", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L398", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:398"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:392\u2013406", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "16": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/executor.html", "label": "The Executor"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/executor/executor.h#L86", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "e0338e112ca4c1b9368cdf84a1613be0dc6339cd518bf28b707a175e23d6867f"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L75", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L405", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:405"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:399\u2013413", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "17": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/executor.html", "label": "The Executor"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/executor/executor.h#L86", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "b30a5ee022ac1ae8cb3cfd93a2c3152ec40a7b60dc85b46f95aef2e3f8791ebe"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L67", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L403", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:403"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:397\u2013411", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "18": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/executor.html", "label": "The Executor"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/executor/executor.h#L85", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "65710b17bb91a8fe6367654bb27b67ef7a7c238f79ba46248f92a3b8302cd4bb"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L70", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L409", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:409"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:403\u2013417", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "19": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/executor.html", "label": "The Executor"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/executor/executor.h#L87", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L72", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L420", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:420"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:414\u2013428", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}, "20": {"facts": [{"label": "Interface type", "value": "ExecutorFinish_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/executor.html", "label": "The Executor"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/executor/executor.h#L87", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L72", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L420", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:420"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorFinish(QueryDesc *queryDesc)\n{\n\tif (ExecutorFinish_hook)\n\t\t(*ExecutorFinish_hook) (queryDesc);\n\telse\n\t\tstandard_ExecutorFinish(queryDesc);\n}\n\nvoid\nstandard_ExecutorFinish(QueryDesc *queryDesc)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:414\u2013428", "paragraphs": []}], "signature": "typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);\nextern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;", "description": ["Hook for plugins to get control in ExecutorFinish()"]}}, "content_hash": "e2485adfa5b4da24a2597e618a3ee9f81bb2a655f3d37f8d42704381138d3b24", "imported_at": "2026-09-27T09:57:58.862", "url": "/wiki/hook/executorfinish_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/executorfinish_hook/?v=20"}], "present": true}, {"slug": "executorrun_hook", "name": "ExecutorRun_hook", "name_zh": "ExecutorRun_hook", "category": "Query execution", "summary": "Hook for plugins to get control in ExecutorRun()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/executor.html", "label": "The Executor"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/executor/executor.h#L73", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4a55453e497d81e8862f118c14ea412222b64b425a6328b3557221e2506e6415"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L72", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L305", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:305"]}, {"code": "void\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count,\n\t\t\tbool execute_once)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count, execute_once);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count, bool execute_once)\n{", "title": "Core call context: src/backend/executor/execMain.c:299\u2013313", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "11": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/executor.html", "label": "The Executor"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/executor/executor.h#L74", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4ca3e44da367fa36fff5e9ebe2875857fed948af35dc3c97d5f49e0367c5c54a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L72", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L294", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:294"]}, {"code": "void\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count,\n\t\t\tbool execute_once)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count, execute_once);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count, bool execute_once)\n{", "title": "Core call context: src/backend/executor/execMain.c:288\u2013302", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "12": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/executor.html", "label": "The Executor"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/executor/executor.h#L68", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7097ada6b8e6f070734a242da928e51d50bfceae9d1eda37b99b94bf38cd29c0"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L71", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L292", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:292"]}, {"code": "void\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count,\n\t\t\tbool execute_once)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count, execute_once);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count, bool execute_once)\n{", "title": "Core call context: src/backend/executor/execMain.c:286\u2013300", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "13": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/executor.html", "label": "The Executor"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/executor/executor.h#L69", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7dc8f6dd29d6b4749f2b6c4bd89a037f44a192f36002018a9c44067a4e65feb8"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L71", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L292", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:292"]}, {"code": "void\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count,\n\t\t\tbool execute_once)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count, execute_once);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count, bool execute_once)\n{", "title": "Core call context: src/backend/executor/execMain.c:286\u2013300", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "14": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/executor.html", "label": "The Executor"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/executor/executor.h#L69", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4b513bbfa6428b55611c3a2603d46f1f074dc37962dec8b4b36377bcb28ad577"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L306", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:306"]}, {"code": "void\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count,\n\t\t\tbool execute_once)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count, execute_once);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count, bool execute_once)\n{", "title": "Core call context: src/backend/executor/execMain.c:300\u2013314", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "15": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/executor.html", "label": "The Executor"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/executor/executor.h#L69", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "846a309bea2c181be918afc888d3aad9b9227a20ed7ac402eb6336cea8fbf22b"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L74", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L308", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:308"]}, {"code": "void\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count,\n\t\t\tbool execute_once)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count, execute_once);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count, bool execute_once)\n{", "title": "Core call context: src/backend/executor/execMain.c:302\u2013316", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "16": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/executor.html", "label": "The Executor"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/executor/executor.h#L79", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "e0338e112ca4c1b9368cdf84a1613be0dc6339cd518bf28b707a175e23d6867f"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L74", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L309", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:309"]}, {"code": "void\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count,\n\t\t\tbool execute_once)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count, execute_once);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count, bool execute_once)\n{", "title": "Core call context: src/backend/executor/execMain.c:303\u2013317", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "17": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/executor.html", "label": "The Executor"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/executor/executor.h#L79", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "b30a5ee022ac1ae8cb3cfd93a2c3152ec40a7b60dc85b46f95aef2e3f8791ebe"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L66", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L304", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:304"]}, {"code": "void\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count,\n\t\t\tbool execute_once)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count, execute_once);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count, execute_once);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count, bool execute_once)\n{", "title": "Core call context: src/backend/executor/execMain.c:298\u2013312", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "18": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/executor.html", "label": "The Executor"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/executor/executor.h#L79", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "65710b17bb91a8fe6367654bb27b67ef7a7c238f79ba46248f92a3b8302cd4bb"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L69", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L301", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:301"]}, {"code": " */\nvoid\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count)\n{", "title": "Core call context: src/backend/executor/execMain.c:295\u2013309", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "19": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/executor.html", "label": "The Executor"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/executor/executor.h#L81", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L71", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L312", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:312"]}, {"code": " */\nvoid\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count)\n{", "title": "Core call context: src/backend/executor/execMain.c:306\u2013320", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}, "20": {"facts": [{"label": "Interface type", "value": "ExecutorRun_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/executor.html", "label": "The Executor"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/executor/executor.h#L81", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L71", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L312", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:312"]}, {"code": " */\nvoid\nExecutorRun(QueryDesc *queryDesc,\n\t\t\tScanDirection direction, uint64 count)\n{\n\tif (ExecutorRun_hook)\n\t\t(*ExecutorRun_hook) (queryDesc, direction, count);\n\telse\n\t\tstandard_ExecutorRun(queryDesc, direction, count);\n}\n\nvoid\nstandard_ExecutorRun(QueryDesc *queryDesc,\n\t\t\t\t\t ScanDirection direction, uint64 count)\n{", "title": "Core call context: src/backend/executor/execMain.c:306\u2013320", "paragraphs": []}], "signature": "typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc, ScanDirection direction, uint64 count);\nextern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;", "description": ["Hook for plugins to get control in ExecutorRun()"]}}, "content_hash": "b4cc0ee8f080247f2e84e0cc626f9384644b2bdaa51051408165ddf5d5a713c2", "imported_at": "2026-09-27T09:57:58.864", "url": "/wiki/hook/executorrun_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=17"}, {"major": "18", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 18 \u00b7 Interface or attribute change", "url": "/wiki/hook/executorrun_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/executorrun_hook/?v=20"}], "present": true}, {"slug": "executorstart_hook", "name": "ExecutorStart_hook", "name_zh": "ExecutorStart_hook", "category": "Query execution", "summary": "Hook for plugins to get control in ExecutorStart()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/executor.html", "label": "The Executor"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/executor/executor.h#L69", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4a55453e497d81e8862f118c14ea412222b64b425a6328b3557221e2506e6415"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L71", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/executor/execMain.c#L151", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "386d09f7e964ebc426a554cf51ac7cb505c67cc95b971ee7acad1a6e0a9d0c1a"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:151"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:145\u2013159", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "11": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/executor.html", "label": "The Executor"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/executor/executor.h#L70", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4ca3e44da367fa36fff5e9ebe2875857fed948af35dc3c97d5f49e0367c5c54a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L71", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/executor/execMain.c#L134", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "c78345058528afae9549e518fc5b1a4b540d2fae4d6920e038c03b2b8e30adb3"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:134"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:128\u2013142", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "12": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/executor.html", "label": "The Executor"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/executor/executor.h#L64", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7097ada6b8e6f070734a242da928e51d50bfceae9d1eda37b99b94bf38cd29c0"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L70", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/executor/execMain.c#L132", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "909de012ba3007d08c7a7d5b45b2d144cd46b46874b3e91c0fc099cf79a097c7"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:132"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:126\u2013140", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "13": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/executor.html", "label": "The Executor"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/executor/executor.h#L65", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "7dc8f6dd29d6b4749f2b6c4bd89a037f44a192f36002018a9c44067a4e65feb8"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L70", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/executor/execMain.c#L129", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "88dc62d891dc842fc12f5bcf3c88e227b65695112bc343a5efa37dd2eba26687"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:129"]}, {"code": " * ----------------------------------------------------------------\n */\nvoid\nExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:123\u2013137", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "14": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/executor.html", "label": "The Executor"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/executor/executor.h#L65", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "4b513bbfa6428b55611c3a2603d46f1f074dc37962dec8b4b36377bcb28ad577"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L72", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/executor/execMain.c#L141", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "dcee56d21f586bade493b51e702d18b405ae6576a46bb9fda21a863ac4388965"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:141"]}, {"code": "\t * call will be ignored if the top level query_id has already been\n\t * reported.\n\t */\n\tpgstat_report_query_id(queryDesc->plannedstmt->queryId, false);\n\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:135\u2013149", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "15": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/executor.html", "label": "The Executor"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/executor/executor.h#L65", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "846a309bea2c181be918afc888d3aad9b9227a20ed7ac402eb6336cea8fbf22b"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/executor/execMain.c#L142", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "1fc0d48c323f47499bba41d6132c991305491e1dae7b4f359f2092e7e36c8e84"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:142"]}, {"code": "\t * call will be ignored if the top level query_id has already been\n\t * reported.\n\t */\n\tpgstat_report_query_id(queryDesc->plannedstmt->queryId, false);\n\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:136\u2013150", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "16": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/executor.html", "label": "The Executor"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/executor/executor.h#L75", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "e0338e112ca4c1b9368cdf84a1613be0dc6339cd518bf28b707a175e23d6867f"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L73", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/executor/execMain.c#L142", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "14f86a289bbb3c997a0efcbb35f6dfc1678a5c28b79912cd20aa89341ac8d3c7"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:142"]}, {"code": "\t * call will be ignored if the top level query_id has already been\n\t * reported.\n\t */\n\tpgstat_report_query_id(queryDesc->plannedstmt->queryId, false);\n\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:136\u2013150", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "17": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/executor.html", "label": "The Executor"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/executor/executor.h#L75", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "b30a5ee022ac1ae8cb3cfd93a2c3152ec40a7b60dc85b46f95aef2e3f8791ebe"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L65", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/executor/execMain.c#L134", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "9fd3d47ee4216550826a0707303f3dea6a65b23f36dd18f50f1bffa51b461163"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:134"]}, {"code": "\t * call will be ignored if the top level query_id has already been\n\t * reported.\n\t */\n\tpgstat_report_query_id(queryDesc->plannedstmt->queryId, false);\n\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:128\u2013142", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "18": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/executor.html", "label": "The Executor"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/executor/executor.h#L75", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "65710b17bb91a8fe6367654bb27b67ef7a7c238f79ba46248f92a3b8302cd4bb"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L68", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/executor/execMain.c#L135", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "a0407447270840acd8a9902c444693d97c765fd8e056dbadc66d36a3327fb0ef"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:135"]}, {"code": "\t * call will be ignored if the top level query_id has already been\n\t * reported.\n\t */\n\tpgstat_report_query_id(queryDesc->plannedstmt->queryId, false);\n\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:129\u2013143", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "19": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/executor.html", "label": "The Executor"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/executor/executor.h#L77", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L70", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/executor/execMain.c#L137", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "20f32fd8f9cc01346154a42773ec38523d684b836942da57fef781c86bc1232e"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:137"]}, {"code": "\t * call will be ignored if the top level query_id has already been\n\t * reported.\n\t */\n\tpgstat_report_query_id(queryDesc->plannedstmt->queryId, false);\n\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:131\u2013145", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}, "20": {"facts": [{"label": "Interface type", "value": "ExecutorStart_hook_type"}, {"label": "Header", "value": "src/include/executor/executor.h"}, {"label": "Subsystem", "value": "Query execution"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/executor.html", "label": "The Executor"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/executor/executor.h#L77", "path": "src/include/executor/executor.h", "label": "Interface declaration", "sha256": "dc8c9089ea8b32a3991a7435f9f2b8c6a0b5d257d49e16afa88b1f2ec946b1b1"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L70", "path": "src/backend/executor/execMain.c", "label": "Core definition", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/executor/execMain.c#L137", "path": "src/backend/executor/execMain.c", "label": "Call sites", "sha256": "6d2659b61f497e2ca8ddbc731b1bfe39792bdde326424c77b224cf8bdea01927"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in ExecutorStart/Run/Finish/End"]}, {"title": "Call sites", "paragraphs": ["src/backend/executor/execMain.c:137"]}, {"code": "\t * call will be ignored if the top level query_id has already been\n\t * reported.\n\t */\n\tpgstat_report_query_id(queryDesc->plannedstmt->queryId, false);\n\n\tif (ExecutorStart_hook)\n\t\t(*ExecutorStart_hook) (queryDesc, eflags);\n\telse\n\t\tstandard_ExecutorStart(queryDesc, eflags);\n}\n\nvoid\nstandard_ExecutorStart(QueryDesc *queryDesc, int eflags)\n{\n\tEState\t   *estate;", "title": "Core call context: src/backend/executor/execMain.c:131\u2013145", "paragraphs": []}], "signature": "typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);\nextern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;", "description": ["Hook for plugins to get control in ExecutorStart()"]}}, "content_hash": "8493211083311c9fcee5c856c2084d9154ee7c6b52b8acccfb629df9a6a09009", "imported_at": "2026-09-27T09:57:58.866", "url": "/wiki/hook/executorstart_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/executorstart_hook/?v=20"}], "present": true}, {"slug": "build_simple_rel_hook", "name": "build_simple_rel_hook", "name_zh": "build_simple_rel_hook", "category": "Query planning", "summary": "Not recorded in the selected version.", "aliases": [], "versions": {"19": {"facts": [{"label": "Interface type", "value": "build_simple_rel_hook_type"}, {"label": "Header", "value": "src/include/optimizer/pathnode.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/pathnode.h#L21", "path": "src/include/optimizer/pathnode.h", "label": "Interface declaration", "sha256": "7f5594bdaa1a3cd656ab9a8174fc3ba3d1b25ddf79773e5f8063b939413d1fd9"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/util/relnode.c#L51", "path": "src/backend/optimizer/util/relnode.c", "label": "Core definition", "sha256": "dfd2d60bc2c491994252e13535d194cae43f43fc15128b5a1207dc3a04b10d8a"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/util/relnode.c#L410", "path": "src/backend/optimizer/util/relnode.c", "label": "Call sites", "sha256": "dfd2d60bc2c491994252e13535d194cae43f43fc15128b5a1207dc3a04b10d8a"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the new RelOptInfo. This could involve editorializing on the information which get_relation_info obtained from the catalogs, such as altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist. An extension can also modify rel->pgs_mask here to control path generation."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/relnode.c:410"]}, {"code": "\t * removing an index, or adding a hypothetical index to the indexlist.\n\t *\n\t * An extension can also modify rel->pgs_mask here to control path\n\t * generation.\n\t */\n\tif (build_simple_rel_hook)\n\t\t(*build_simple_rel_hook) (root, rel, rte);\n\n\t/*\n\t * Apply the parent's quals to the child, with appropriate substitution of\n\t * variables.  If any resulting clause is reduced to constant FALSE or\n\t * NULL, apply_child_basequals returns false to indicate that scanning\n\t * this relation won't yield any rows.  In this case, we mark the child as\n\t * dummy right away.  (We must do this immediately so that pruning works\n\t * correctly when recursing in expand_partitioned_rtentry.)", "title": "Core call context: src/backend/optimizer/util/relnode.c:404\u2013418", "paragraphs": []}], "signature": "typedef void (*build_simple_rel_hook_type) (PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte);\nextern PGDLLIMPORT build_simple_rel_hook_type build_simple_rel_hook;", "description": ["Hook for plugins to get control in build_simple_rel()"]}, "20": {"facts": [{"label": "Interface type", "value": "build_simple_rel_hook_type"}, {"label": "Header", "value": "src/include/optimizer/pathnode.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/pathnode.h#L21", "path": "src/include/optimizer/pathnode.h", "label": "Interface declaration", "sha256": "7f5594bdaa1a3cd656ab9a8174fc3ba3d1b25ddf79773e5f8063b939413d1fd9"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/util/relnode.c#L51", "path": "src/backend/optimizer/util/relnode.c", "label": "Core definition", "sha256": "e4d52530d522808857981ecf0b5943d10844732c06f18a4e4b2323afbd58b67d"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/util/relnode.c#L413", "path": "src/backend/optimizer/util/relnode.c", "label": "Call sites", "sha256": "e4d52530d522808857981ecf0b5943d10844732c06f18a4e4b2323afbd58b67d"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the new RelOptInfo. This could involve editorializing on the information which get_relation_info obtained from the catalogs, such as altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist. An extension can also modify rel->pgs_mask here to control path generation."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/relnode.c:413"]}, {"code": "\t * removing an index, or adding a hypothetical index to the indexlist.\n\t *\n\t * An extension can also modify rel->pgs_mask here to control path\n\t * generation.\n\t */\n\tif (build_simple_rel_hook)\n\t\t(*build_simple_rel_hook) (root, rel, rte);\n\n\t/*\n\t * Apply the parent's quals to the child, with appropriate substitution of\n\t * variables.  If any resulting clause is reduced to constant FALSE or\n\t * NULL, apply_child_basequals returns false to indicate that scanning\n\t * this relation won't yield any rows.  In this case, we mark the child as\n\t * dummy right away.  (We must do this immediately so that pruning works\n\t * correctly when recursing in expand_partitioned_rtentry.)", "title": "Core call context: src/backend/optimizer/util/relnode.c:407\u2013421", "paragraphs": []}], "signature": "typedef void (*build_simple_rel_hook_type) (PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte);\nextern PGDLLIMPORT build_simple_rel_hook_type build_simple_rel_hook;", "description": ["Hook for plugins to get control in build_simple_rel()"]}}, "content_hash": "95bc6a6f6a9539741e7d1de6762f0ba017defc28323247c5fdf46b5cad350be7", "imported_at": "2026-09-27T09:57:58.868", "url": "/wiki/hook/build_simple_rel_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=15"}, {"major": "16", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 16 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=16"}, {"major": "17", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 17 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=17"}, {"major": "18", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 18 \u00b7 Not recorded in this version", "url": "/wiki/hook/build_simple_rel_hook/?v=18"}, {"major": "19", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 19 Beta 4 \u00b7 First recorded in this sample", "url": "/wiki/hook/build_simple_rel_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/build_simple_rel_hook/?v=20"}], "present": false}, {"slug": "create_upper_paths_hook", "name": "create_upper_paths_hook", "name_zh": "create_upper_paths_hook", "category": "Query planning", "summary": "Hook for plugins to get control when grouping_planner() plans upper rels", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/optimizer/planner.h#L28", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "38335a1fe8bdf73232384fc8b5113e17aed43e0902fcf77b8cd41cc01b6d76ee"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/plan/planner.c#L70", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "aee8c494facfb92d69ab66efc6f3a119b8796f488174eb07d2ef08346709dab6"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/plan/planner.c#L2111", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "aee8c494facfb92d69ab66efc6f3a119b8796f488174eb07d2ef08346709dab6"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/prep/prepunion.c#L214", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "1d6e1235c5e811dc7593af3fd123398284ef715ce0fcef072b6ba3bae523e203"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2111", "src/backend/optimizer/plan/planner.c:4172", "src/backend/optimizer/plan/planner.c:4629", "src/backend/optimizer/plan/planner.c:4933", "src/backend/optimizer/plan/planner.c:5075", "src/backend/optimizer/prep/prepunion.c:214"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths)\n\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2105\u20132119", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths)\n\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(grouped_rel);\n\n\t/*\n\t * We've been using the partial pathlist for the grouped relation to hold\n\t * partially aggregated paths, but that's actually a little bit bogus", "title": "Core call context: src/backend/optimizer/plan/planner.c:4166\u20134180", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths)\n\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4623\u20134637", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "11": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/optimizer/planner.h#L28", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "51eeb8cf86be4935e89ed182a0802dcabd69b5f8c6705c23349daf7f35ebdca6"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/plan/planner.c#L72", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "2759e867f1d3350da408571eeafd5a0eb2137d0c02e52579d726140aa31bcab7"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/plan/planner.c#L2288", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "2759e867f1d3350da408571eeafd5a0eb2137d0c02e52579d726140aa31bcab7"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/prep/prepunion.c#L1040", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "58938eaa70baa5b8d83476cae7c83efa97bb677915262e200c72d65bbec58ad3"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2288", "src/backend/optimizer/plan/planner.c:4111", "src/backend/optimizer/plan/planner.c:4550", "src/backend/optimizer/plan/planner.c:4854", "src/backend/optimizer/plan/planner.c:4998", "src/backend/optimizer/prep/prepunion.c:1040"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\tNULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, NULL);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2282\u20132296", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4105\u20134119", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4544\u20134558", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "12": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/optimizer/planner.h#L32", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "8d4820190535b8e59c659c3c237e2018d2bfe5a8b000ffb048fe1eebccb7073c"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "a27e680979f187ec5264f5675cc44a9a5aa67b85c9b69a207f4f7d3a791adedb"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/plan/planner.c#L2412", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "a27e680979f187ec5264f5675cc44a9a5aa67b85c9b69a207f4f7d3a791adedb"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/prep/prepunion.c#L1002", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "bd70bfa97ef5d4ce797c0ce66f8e119517e9ad541f4988f088401e412599d221"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2412", "src/backend/optimizer/plan/planner.c:4171", "src/backend/optimizer/plan/planner.c:4607", "src/backend/optimizer/plan/planner.c:4909", "src/backend/optimizer/plan/planner.c:5053", "src/backend/optimizer/prep/prepunion.c:1002"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2406\u20132420", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4165\u20134179", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4601\u20134615", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "13": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "06cb8f28d3a2810d58006b1a91d01481d8cd05dccb4132d2c7b439fdc2f4e344"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "9f9d4c68be0349980cfefe9109df2415756fd04fa45a6f7176381eba8c32ccef"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/plan/planner.c#L2466", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "9f9d4c68be0349980cfefe9109df2415756fd04fa45a6f7176381eba8c32ccef"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/prep/prepunion.c#L1003", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "38daf59286bda423df34fc76d94acbe88bda0510eada6305495663a71a99e7ab"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2466", "src/backend/optimizer/plan/planner.c:4219", "src/backend/optimizer/plan/planner.c:4656", "src/backend/optimizer/plan/planner.c:4946", "src/backend/optimizer/plan/planner.c:5203", "src/backend/optimizer/prep/prepunion.c:1003"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2460\u20132474", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4213\u20134227", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4650\u20134664", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "14": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "90fa62aaa319c5a7c0990ee37e386e09543bf84e2b615ba82bb36fee401f186e"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "567c6f13b08a1bfd8089c7b02203a43ef0627305b184087ee3296bed0502d680"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/plan/planner.c#L1919", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "567c6f13b08a1bfd8089c7b02203a43ef0627305b184087ee3296bed0502d680"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/prep/prepunion.c#L1004", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "5c7129c920e9d286f781cc9d44b4f3ad22263f8da2438c760c1d9693dd996095"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:1919", "src/backend/optimizer/plan/planner.c:3675", "src/backend/optimizer/plan/planner.c:4118", "src/backend/optimizer/plan/planner.c:4432", "src/backend/optimizer/plan/planner.c:4689", "src/backend/optimizer/prep/prepunion.c:1004"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:1913\u20131927", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:3669\u20133683", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4112\u20134126", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "15": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "d08a1626954ade22b46ed1e5b585c365765cb3f4aeb19b6b6d220a953f9f9f11"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "3312bdb7dc77f49e01a7a4afd110f3414c03ce755e7e5fb00deca3b5c2ebd6ee"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/plan/planner.c#L1991", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "3312bdb7dc77f49e01a7a4afd110f3414c03ce755e7e5fb00deca3b5c2ebd6ee"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/prep/prepunion.c#L1004", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "66f47ad4d3b6f95bfea95843f21b27cbf68eef7fbc905161ef989b91abe09ffb"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:1991", "src/backend/optimizer/plan/planner.c:3748", "src/backend/optimizer/plan/planner.c:4191", "src/backend/optimizer/plan/planner.c:4393", "src/backend/optimizer/plan/planner.c:4508", "src/backend/optimizer/plan/planner.c:4921", "src/backend/optimizer/prep/prepunion.c:1004"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:1985\u20131999", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:3742\u20133756", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4185\u20134199", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "16": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "57fcc2e58b25f30a1bcc75c39b40077df4a27c2c4d6f9f618f99d86921f7e361"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/plan/planner.c#L81", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "07f42ef50710179096fb328be88393d58865a39ca8e6020789718cbc78ce355e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/plan/planner.c#L2106", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "07f42ef50710179096fb328be88393d58865a39ca8e6020789718cbc78ce355e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/prep/prepunion.c#L1011", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "b870ed158a0f745b60446cb47641a0b82ae65625d7885f294804a6c6ecc6d15e"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2106", "src/backend/optimizer/plan/planner.c:4214", "src/backend/optimizer/plan/planner.c:4654", "src/backend/optimizer/plan/planner.c:4856", "src/backend/optimizer/plan/planner.c:5012", "src/backend/optimizer/plan/planner.c:5450", "src/backend/optimizer/prep/prepunion.c:1011"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2100\u20132114", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4208\u20134222", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4648\u20134662", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "17": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "09bba5b6f72173dab2a34129916f97d1f39819d417cba80aa5d73a64bf9e8bbc"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/plan/planner.c#L76", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "d542e814c23cebd3dce7f9c958a376c10c4b1921ba0cb966e67d5ce2c0afb421"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/plan/planner.c#L2152", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "d542e814c23cebd3dce7f9c958a376c10c4b1921ba0cb966e67d5ce2c0afb421"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2152", "src/backend/optimizer/plan/planner.c:4287", "src/backend/optimizer/plan/planner.c:4727", "src/backend/optimizer/plan/planner.c:4970", "src/backend/optimizer/plan/planner.c:5161", "src/backend/optimizer/plan/planner.c:5568"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.  This handles the\n * preliminary steps of expanding the grouping sets, organizing them into lists", "title": "Core call context: src/backend/optimizer/plan/planner.c:2146\u20132160", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4281\u20134295", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4721\u20134735", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "18": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/planner.h#L33", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "2b48e2afeff0e27570bc5bf536f3d5cdaab6111beb0b98bef9e5ce069598d08b"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L77", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L2386", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2386", "src/backend/optimizer/plan/planner.c:4379", "src/backend/optimizer/plan/planner.c:4819", "src/backend/optimizer/plan/planner.c:5062", "src/backend/optimizer/plan/planner.c:5237", "src/backend/optimizer/plan/planner.c:5707"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.\n *", "title": "Core call context: src/backend/optimizer/plan/planner.c:2380\u20132394", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4373\u20134387", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4813\u20134827", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "19": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/planner.h#L50", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L83", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L2467", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2467", "src/backend/optimizer/plan/planner.c:4453", "src/backend/optimizer/plan/planner.c:4893", "src/backend/optimizer/plan/planner.c:5136", "src/backend/optimizer/plan/planner.c:5311", "src/backend/optimizer/plan/planner.c:5784"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.\n *", "title": "Core call context: src/backend/optimizer/plan/planner.c:2461\u20132475", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4447\u20134461", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4887\u20134901", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}, "20": {"facts": [{"label": "Interface type", "value": "create_upper_paths_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/planner.h#L50", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L83", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L2467", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/prep/prepunion.c#L1462", "path": "src/backend/optimizer/prep/prepunion.c", "label": "Call sites", "sha256": "41510a088180f32c660eaa12c2371c6bcd7debc6b6ae90836d4cc7cc2e7a8fc7"}], "sections": [{"title": "Core source comments", "paragraphs": ["Let extensions possibly add some more paths", "Let extensions possibly add some more partial paths", "We don't currently worry about allowing FDWs to contribute paths to this relation, but give extensions a chance."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:2467", "src/backend/optimizer/plan/planner.c:4453", "src/backend/optimizer/plan/planner.c:4893", "src/backend/optimizer/plan/planner.c:5136", "src/backend/optimizer/plan/planner.c:5311", "src/backend/optimizer/plan/planner.c:5784", "src/backend/optimizer/prep/prepunion.c:1462"]}, {"code": "\t\tfinal_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t&extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_FINAL,\n\t\t\t\t\t\t\t\t\tcurrent_rel, final_rel, &extra);\n\n\t/* Note: currently, we leave it to callers to do set_cheapest() */\n}\n\n/*\n * Do preprocessing for groupingSets clause and related data.\n *", "title": "Core call context: src/backend/optimizer/plan/planner.c:2461\u20132475", "paragraphs": []}, {"code": "\t\tgrouped_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  input_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t  extra);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_GROUP_AGG,\n\t\t\t\t\t\t\t\t\tinput_rel, grouped_rel,\n\t\t\t\t\t\t\t\t\textra);\n}\n\n/*\n * For a given input path, consider the possible ways of doing grouping sets on\n * it, by combinations of hashing and sorting.  This can be called multiple\n * times, so it's important that it not scribble on input.  No result is", "title": "Core call context: src/backend/optimizer/plan/planner.c:4447\u20134461", "paragraphs": []}, {"code": "\t\twindow_rel->fdwroutine->GetForeignUpperPaths(root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\t\t\t\t\t input_rel, window_rel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t NULL);\n\n\t/* Let extensions possibly add some more paths */\n\tif (create_upper_paths_hook)\n\t\t(*create_upper_paths_hook) (root, UPPERREL_WINDOW,\n\t\t\t\t\t\t\t\t\tinput_rel, window_rel, NULL);\n\n\t/* Now choose the best path(s) */\n\tset_cheapest(window_rel);\n\n\treturn window_rel;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:4887\u20134901", "paragraphs": []}], "signature": "typedef void (*create_upper_paths_hook_type) (PlannerInfo *root, UpperRelationKind stage, RelOptInfo *input_rel, RelOptInfo *output_rel, void *extra);\nextern PGDLLIMPORT create_upper_paths_hook_type create_upper_paths_hook;", "description": ["Hook for plugins to get control when grouping_planner() plans upper rels"]}}, "content_hash": "1d435494e0bf82c277ed8669b2175e587cb0828724930a64328f85bbef51bfc2", "imported_at": "2026-09-27T09:57:58.870", "url": "/wiki/hook/create_upper_paths_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=10"}, {"major": "11", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 11 \u00b7 Interface or attribute change", "url": "/wiki/hook/create_upper_paths_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/create_upper_paths_hook/?v=20"}], "present": true}, {"slug": "get_relation_info_hook", "name": "get_relation_info_hook", "name_zh": "get_relation_info_hook", "category": "Query planning", "summary": "Hook for plugins to get control in get_relation_info()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "7ce76ad50ed9ef5cc096a92ab1c7ec4647b0bd35f9316652517b0f82631457ef"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/util/plancat.c#L57", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "5720ce4826c62f8706c10fe300946c71e29a2cecf419c7235e5e3197a98da398"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/util/plancat.c#L433", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "5720ce4826c62f8706c10fe300946c71e29a2cecf419c7235e5e3197a98da398"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:433"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:427\u2013441", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}, "11": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "fd4fc55905a11764373cd3a2d7d9716175ef7295c0097c95106c8bd6e971d733"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/util/plancat.c#L59", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "06010999272f067c861ed3a14f086990e48b2ba6554233d86b3856dfe2b0b4bc"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/util/plancat.c#L466", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "06010999272f067c861ed3a14f086990e48b2ba6554233d86b3856dfe2b0b4bc"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:466"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:460\u2013474", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}, "12": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "d47d45f3ef0e416c4e98e3a82a281c19773aad6310a871c8f6d228dcced2857c"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/util/plancat.c#L62", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "a666ffcae2e245ce6d5bb32ba91b1ea62ab62e8701476f7330cce283a721243c"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/util/plancat.c#L492", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "a666ffcae2e245ce6d5bb32ba91b1ea62ab62e8701476f7330cce283a721243c"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:492"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:486\u2013500", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}, "13": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "850415a53c9ce7489fe0f7aa34574cceea9e38dce396b5603fd54a0def1de9bc"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/util/plancat.c#L61", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "b1c3cdd7515de60e8700b90521b75d703788e78b43f9b52addb6b644ceb1cff4"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/util/plancat.c#L505", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "b1c3cdd7515de60e8700b90521b75d703788e78b43f9b52addb6b644ceb1cff4"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:505"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:499\u2013513", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}, "14": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "352f459a510bb786878d3851f007351d16e85f0180cc1ff7a378fa95d314e795"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/util/plancat.c#L61", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "0345445d3f206980111cea0a70b2a98c2520dc076cc3c6da703ee06f9f65b6c1"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/util/plancat.c#L510", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "0345445d3f206980111cea0a70b2a98c2520dc076cc3c6da703ee06f9f65b6c1"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:510"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:504\u2013518", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}, "15": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "039ecd5601d37c3eb1677ad0f0e8183a2743a9ca908311af61d1b20ac8bc795d"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/util/plancat.c#L62", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "8a5d2834a8c8d64add1bdcbc2751f7b03ef7d9f09d097dc72c50f8b4d27dea1a"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/util/plancat.c#L513", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "8a5d2834a8c8d64add1bdcbc2751f7b03ef7d9f09d097dc72c50f8b4d27dea1a"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:513"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:507\u2013521", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}, "16": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "80eba56d8e5a0dbd66c647876b21902d51efd8812b52cb0942605a1ff46d8468"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/util/plancat.c#L62", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "57c42a37254a6c83695b9b1547b964b952977cc77b48e76b51cca40f43e74ba3"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/util/plancat.c#L548", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "57c42a37254a6c83695b9b1547b964b952977cc77b48e76b51cca40f43e74ba3"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:548"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:542\u2013556", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}, "17": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "f0262457b7a67baf4839b07c71407767fb635f16001c03af9163bfa94b883f44"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/util/plancat.c#L60", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "8ad7a4dda71d779d58346e10c0fefed144d1503b546d30e7b13d7f54883e45a9"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/util/plancat.c#L576", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "8ad7a4dda71d779d58346e10c0fefed144d1503b546d30e7b13d7f54883e45a9"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:576"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:570\u2013584", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}, "18": {"facts": [{"label": "Interface type", "value": "get_relation_info_hook_type"}, {"label": "Header", "value": "src/include/optimizer/plancat.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/plancat.h#L21", "path": "src/include/optimizer/plancat.h", "label": "Interface declaration", "sha256": "b5e344f3c4b57ff2f7c3f6827a4778bb781c94f4ff1cb3af516141bff8f2be89"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/util/plancat.c#L61", "path": "src/backend/optimizer/util/plancat.c", "label": "Core definition", "sha256": "b953af14cb2539fbb32e4d1e8eea30f3eaa1b6336091369c03531fb9dcd5a6ff"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/util/plancat.c#L575", "path": "src/backend/optimizer/util/plancat.c", "label": "Call sites", "sha256": "b953af14cb2539fbb32e4d1e8eea30f3eaa1b6336091369c03531fb9dcd5a6ff"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the info we obtained from the catalogs. Actions might include altering the assumed relation size, removing an index, or adding a hypothetical index to the indexlist."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/plancat.c:575"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the info we obtained from the\n\t * catalogs.  Actions might include altering the assumed relation size,\n\t * removing an index, or adding a hypothetical index to the indexlist.\n\t */\n\tif (get_relation_info_hook)\n\t\t(*get_relation_info_hook) (root, relationObjectId, inhparent, rel);\n}\n\n/*\n * get_relation_foreign_keys -\n *\t  Retrieves foreign key information for a given relation.\n *\n * ForeignKeyOptInfos for relevant foreign keys are created and added to\n * root->fkey_list.  We do this now while we have the relcache entry open.", "title": "Core call context: src/backend/optimizer/util/plancat.c:569\u2013583", "paragraphs": []}], "signature": "typedef void (*get_relation_info_hook_type) (PlannerInfo *root, Oid relationObjectId, bool inhparent, RelOptInfo *rel);\nextern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;", "description": ["Hook for plugins to get control in get_relation_info()"]}}, "content_hash": "e08e1ee8e7cc59ef978204e0b128c8a15c24cb44f4ecdd91cf81cdf202539417", "imported_at": "2026-09-27T09:57:58.873", "url": "/wiki/hook/get_relation_info_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/get_relation_info_hook/?v=18"}, {"major": "19", "state": "removed", "label": "No longer recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 No longer recorded", "url": "/wiki/hook/get_relation_info_hook/?v=19"}, {"major": "20", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 20 devel \u00b7 Not recorded in this version", "url": "/wiki/hook/get_relation_info_hook/?v=20"}], "present": true}, {"slug": "join_path_setup_hook", "name": "join_path_setup_hook", "name_zh": "join_path_setup_hook", "category": "Query planning", "summary": "Not recorded in the selected version.", "aliases": [], "versions": {"19": {"facts": [{"label": "Interface type", "value": "join_path_setup_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/paths.h#L32", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "f1ad3b9072e9a7307836c33477dbb472f36bb3a2c135fa50cd1622d3750310cb"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/path/joinpath.c#L32", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "45ca2faac289f61d393e1e60cfe84725da1c233287b9fe550bd00c4452a32078"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/path/joinpath.c#L178", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "45ca2faac289f61d393e1e60cfe84725da1c233287b9fe550bd00c4452a32078"}], "sections": [{"title": "Core source comments", "paragraphs": ["Give extensions a chance to take control. In particular, an extension might want to modify extra.pgs_mask. It's possible to override pgs_mask on a query-wide basis using join_search_hook, or for a particular relation using joinrel_setup_hook, but extensions that want to provide different advice for the same joinrel based on the choice of innerrel and outerrel will need to use this hook. A very simple way for an extension to use this hook is to set extra.pgs_mask &= ~PGS_JOIN_ANY, if it simply doesn't want any of the paths generated by this call to add_paths_to_joinrel() to be selected. An extension could use this technique to constrain the join order, since it could thereby arrange to reject all paths from join orders that it does not like. An extension can also selectively clear bits from extra.pgs_mask to rule out specific techniques for specific joins, or could even set additional bits to re-allow methods disabled at some higher level. NB: Below this point, this function should be careful to reference extra.pgs_mask rather than rel->pgs_mask to avoid disregarding any changes made by the hook we're about to call."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:178"]}, {"code": "\t *\n\t * NB: Below this point, this function should be careful to reference\n\t * extra.pgs_mask rather than rel->pgs_mask to avoid disregarding any\n\t * changes made by the hook we're about to call.\n\t */\n\tif (join_path_setup_hook)\n\t\tjoin_path_setup_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t jointype, &extra);\n\n\t/*\n\t * See if the inner relation is provably unique for this outer rel.\n\t *\n\t * We have some special cases: for JOIN_SEMI, it doesn't matter since the\n\t * executor can make the equivalent optimization anyway.  It also doesn't\n\t * help enable use of Memoize, since a semijoin with a provably unique", "title": "Core call context: src/backend/optimizer/path/joinpath.c:172\u2013186", "paragraphs": []}], "signature": "typedef void (*join_path_setup_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT join_path_setup_hook_type join_path_setup_hook;", "description": ["Hooks for plugins to get control in set_rel_pathlist()"]}, "20": {"facts": [{"label": "Interface type", "value": "join_path_setup_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/paths.h#L32", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "7d4e6d888e06597a145f6e53f235a90dc70f13db5bab820339f63023003b79e3"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/path/joinpath.c#L32", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "acf82e1a85a0ee004b15ab07db9f72a7729dcea096ffd82e509c0dc2b98b9faf"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/path/joinpath.c#L178", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "acf82e1a85a0ee004b15ab07db9f72a7729dcea096ffd82e509c0dc2b98b9faf"}], "sections": [{"title": "Core source comments", "paragraphs": ["Give extensions a chance to take control. In particular, an extension might want to modify extra.pgs_mask. It's possible to override pgs_mask on a query-wide basis using join_search_hook, or for a particular relation using joinrel_setup_hook, but extensions that want to provide different advice for the same joinrel based on the choice of innerrel and outerrel will need to use this hook. A very simple way for an extension to use this hook is to set extra.pgs_mask &= ~PGS_JOIN_ANY, if it simply doesn't want any of the paths generated by this call to add_paths_to_joinrel() to be selected. An extension could use this technique to constrain the join order, since it could thereby arrange to reject all paths from join orders that it does not like. An extension can also selectively clear bits from extra.pgs_mask to rule out specific techniques for specific joins, or could even set additional bits to re-allow methods disabled at some higher level. NB: Below this point, this function should be careful to reference extra.pgs_mask rather than rel->pgs_mask to avoid disregarding any changes made by the hook we're about to call."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:178"]}, {"code": "\t *\n\t * NB: Below this point, this function should be careful to reference\n\t * extra.pgs_mask rather than rel->pgs_mask to avoid disregarding any\n\t * changes made by the hook we're about to call.\n\t */\n\tif (join_path_setup_hook)\n\t\tjoin_path_setup_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t jointype, &extra);\n\n\t/*\n\t * See if the inner relation is provably unique for this outer rel.\n\t *\n\t * We have some special cases: for JOIN_SEMI, it doesn't matter since the\n\t * executor can make the equivalent optimization anyway.  It also doesn't\n\t * help enable use of Memoize, since a semijoin with a provably unique", "title": "Core call context: src/backend/optimizer/path/joinpath.c:172\u2013186", "paragraphs": []}], "signature": "typedef void (*join_path_setup_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT join_path_setup_hook_type join_path_setup_hook;", "description": ["Hooks for plugins to get control in set_rel_pathlist()"]}}, "content_hash": "67746ef6ca4087bc7373ece5524de22e2e792f0025d0020c02e0c00e049aa2a8", "imported_at": "2026-09-27T09:57:58.874", "url": "/wiki/hook/join_path_setup_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=15"}, {"major": "16", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 16 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=16"}, {"major": "17", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 17 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=17"}, {"major": "18", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 18 \u00b7 Not recorded in this version", "url": "/wiki/hook/join_path_setup_hook/?v=18"}, {"major": "19", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 19 Beta 4 \u00b7 First recorded in this sample", "url": "/wiki/hook/join_path_setup_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/join_path_setup_hook/?v=20"}], "present": false}, {"slug": "join_search_hook", "name": "join_search_hook", "name_zh": "join_search_hook", "category": "Query planning", "summary": "Hook for plugins to replace standard_join_search()", "aliases": [], "versions": {"10": {"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": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/optimizer/paths.h#L45", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "e92f974fb44e1de3a6c550466b600af972c299c02d8d06c2a343ba339e224ce0"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/path/allpaths.c#L67", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "b9c72dfc75f4354dad3a64d886b8760197c0cf6496f40228e6341bcaf5389671"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/path/allpaths.c#L2373", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "b9c72dfc75f4354dad3a64d886b8760197c0cf6496f40228e6341bcaf5389671"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:2373"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:2367\u20132381", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "11": {"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": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/optimizer/paths.h#L45", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "0a9804f99187ac049c367452e8f0e3a8bad2924a8ba64b20d3957feda7534ccb"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/path/allpaths.c#L69", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "112b1ef97e3035f335e41f571e5c274144c0abee337a788e265b48ba1ee8a81a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/path/allpaths.c#L2670", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "112b1ef97e3035f335e41f571e5c274144c0abee337a788e265b48ba1ee8a81a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:2670"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:2664\u20132678", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "12": {"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": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/optimizer/paths.h#L45", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "5cd4566bfd92117fc9528f43d1a41e923ea751b3f6a435bfefbacee28f2180ac"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/path/allpaths.c#L71", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "a6ee998b1e9a4c0b834d46dbc404d603e1d3d2d1127f430da1390e47eddae9a8"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/path/allpaths.c#L2812", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "a6ee998b1e9a4c0b834d46dbc404d603e1d3d2d1127f430da1390e47eddae9a8"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:2812"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:2806\u20132820", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "13": {"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": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/optimizer/paths.h#L45", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "9cf3e1a9a86500ab3330f6e6ccefc8d0368fe2ee15b521ed11c613f6f69ee487"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/path/allpaths.c#L71", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "d20c1bdd4a672afda6f6a3b555d2d823f3308435aac41516e0d63e413cdeb5f0"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/path/allpaths.c#L3026", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "d20c1bdd4a672afda6f6a3b555d2d823f3308435aac41516e0d63e413cdeb5f0"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:3026"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:3020\u20133034", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "14": {"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": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/optimizer/paths.h#L45", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "6f4a259bd1b518c6378a75766b2ca2285072894cf7645d102e98f15613dfb1c7"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/path/allpaths.c#L71", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "68b3eb17f9e400ebb4b7da3df2a133361fc5d1b3e6459805585a241c14c80a45"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/path/allpaths.c#L2948", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "68b3eb17f9e400ebb4b7da3df2a133361fc5d1b3e6459805585a241c14c80a45"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:2948"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:2942\u20132956", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "15": {"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": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/optimizer/paths.h#L45", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "26db4ac12a1de0b35a8f64334e4879725ead4060072fe6b105ee8f824c6a6916"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/path/allpaths.c#L90", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "3397ddbbffb459d63d802dd89ef4e30d830a6b0ac910dc50ee996923dd292a5f"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/path/allpaths.c#L3356", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "3397ddbbffb459d63d802dd89ef4e30d830a6b0ac910dc50ee996923dd292a5f"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:3356"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:3350\u20133364", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "16": {"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": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/optimizer/paths.h#L45", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "4c5cfcfe85de1611e544d8b832fe9b4fcf0f059a0e8d7ffb4f0f5b7381fd214e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/path/allpaths.c#L91", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "c80d07eee3c76057b7aab1c27be42c44e26c0a3231e6505d071e032ceefb9228"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/path/allpaths.c#L3381", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "c80d07eee3c76057b7aab1c27be42c44e26c0a3231e6505d071e032ceefb9228"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:3381"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:3375\u20133389", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "17": {"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": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/optimizer/paths.h#L46", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "95ee796a45866c5501ecaef58344017d69d2453da5dde588195c991934d35877"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/path/allpaths.c#L88", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "f3c06a7b804de19360b78d49dd3c31173d120a1186e248422e6dbcbe3a6905f3"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/path/allpaths.c#L3373", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "f3c06a7b804de19360b78d49dd3c31173d120a1186e248422e6dbcbe3a6905f3"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:3373"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:3367\u20133381", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "18": {"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": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/paths.h#L46", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "bf497b2e5501e7c86250147c9cc779785ccec7bb2a806d3c71571313e890208f"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L88", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L3423", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:3423"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:3417\u20133431", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "19": {"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": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/paths.h#L55", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "f1ad3b9072e9a7307836c33477dbb472f36bb3a2c135fa50cd1622d3750310cb"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/path/allpaths.c#L92", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "f1a5425d94371d2395bcc76be126cc75d65a8d96f1f3d87e851f540672e56f62"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/path/allpaths.c#L3904", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "f1a5425d94371d2395bcc76be126cc75d65a8d96f1f3d87e851f540672e56f62"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:3904"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:3898\u20133912", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}, "20": {"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": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/paths.h#L55", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "7d4e6d888e06597a145f6e53f235a90dc70f13db5bab820339f63023003b79e3"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/path/allpaths.c#L92", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "b78b8e5a80c3a6f9886a5a6f3edb1dc89c366f8fcc3c890327e4b979bc7b08cc"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/path/allpaths.c#L3904", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "b78b8e5a80c3a6f9886a5a6f3edb1dc89c366f8fcc3c890327e4b979bc7b08cc"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:3904"]}, {"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->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 && levels_needed >= 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/*", "title": "Core call context: src/backend/optimizer/path/allpaths.c:3898\u20133912", "paragraphs": []}], "signature": "typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root, int levels_needed, List *initial_rels);\nextern PGDLLIMPORT join_search_hook_type join_search_hook;", "description": ["Hook for plugins to replace standard_join_search()"]}}, "content_hash": "66c109a34a7078e0b9221ee20bbe2d1cd435e199dae9b7933817370b93e5159e", "imported_at": "2026-09-27T09:57:58.876", "url": "/wiki/hook/join_search_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/join_search_hook/?v=20"}], "present": true}, {"slug": "joinrel_setup_hook", "name": "joinrel_setup_hook", "name_zh": "joinrel_setup_hook", "category": "Query planning", "summary": "Not recorded in the selected version.", "aliases": [], "versions": {"19": {"facts": [{"label": "Interface type", "value": "joinrel_setup_hook_type"}, {"label": "Header", "value": "src/include/optimizer/pathnode.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/pathnode.h#L42", "path": "src/include/optimizer/pathnode.h", "label": "Interface declaration", "sha256": "7f5594bdaa1a3cd656ab9a8174fc3ba3d1b25ddf79773e5f8063b939413d1fd9"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/util/relnode.c#L54", "path": "src/backend/optimizer/util/relnode.c", "label": "Core definition", "sha256": "dfd2d60bc2c491994252e13535d194cae43f43fc15128b5a1207dc3a04b10d8a"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/util/relnode.c#L984", "path": "src/backend/optimizer/util/relnode.c", "label": "Call sites", "sha256": "dfd2d60bc2c491994252e13535d194cae43f43fc15128b5a1207dc3a04b10d8a"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the new joinrel's properties. Actions might include altering the size estimate, clearing consider_parallel, or adjusting pgs_mask.", "Allow a plugin to editorialize on the new joinrel's properties. Actions might include altering the size estimate, clearing consider_parallel, or adjusting pgs_mask. (However, note that clearing consider_parallel would be better done in the parent joinrel rather than here.)"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/relnode.c:984", "src/backend/optimizer/util/relnode.c:1145"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the new joinrel's properties. Actions\n\t * might include altering the size estimate, clearing consider_parallel,\n\t * or adjusting pgs_mask.\n\t */\n\tif (joinrel_setup_hook)\n\t\t(*joinrel_setup_hook) (root, joinrel, outer_rel, inner_rel, sjinfo,\n\t\t\t\t\t\t\t   restrictlist);\n\n\t/* Store the partition information. */\n\tbuild_joinrel_partition_info(root, joinrel, outer_rel, inner_rel, sjinfo,\n\t\t\t\t\t\t\t\t restrictlist);\n\n\t/* Add the joinrel to the PlannerInfo. */\n\tadd_join_rel(root, joinrel);", "title": "Core call context: src/backend/optimizer/util/relnode.c:978\u2013992", "paragraphs": []}, {"code": "\t * Allow a plugin to editorialize on the new joinrel's properties. Actions\n\t * might include altering the size estimate, clearing consider_parallel,\n\t * or adjusting pgs_mask. (However, note that clearing consider_parallel\n\t * would be better done in the parent joinrel rather than here.)\n\t */\n\tif (joinrel_setup_hook)\n\t\t(*joinrel_setup_hook) (root, joinrel, outer_rel, inner_rel, sjinfo,\n\t\t\t\t\t\t\t   restrictlist);\n\n\t/* Is the join between partitions itself partitioned? */\n\tbuild_joinrel_partition_info(root, joinrel, outer_rel, inner_rel, sjinfo,\n\t\t\t\t\t\t\t\t restrictlist);\n\n\t/* We build the join only once. */\n\tAssert(!find_join_rel(root, joinrel->relids));", "title": "Core call context: src/backend/optimizer/util/relnode.c:1139\u20131153", "paragraphs": []}], "signature": "typedef void (*joinrel_setup_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outer_rel, RelOptInfo *inner_rel, SpecialJoinInfo *sjinfo, List *restrictlist);\nextern PGDLLIMPORT joinrel_setup_hook_type joinrel_setup_hook;", "description": ["Hook for plugins to get control during joinrel setup"]}, "20": {"facts": [{"label": "Interface type", "value": "joinrel_setup_hook_type"}, {"label": "Header", "value": "src/include/optimizer/pathnode.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/pathnode.h#L42", "path": "src/include/optimizer/pathnode.h", "label": "Interface declaration", "sha256": "7f5594bdaa1a3cd656ab9a8174fc3ba3d1b25ddf79773e5f8063b939413d1fd9"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/util/relnode.c#L54", "path": "src/backend/optimizer/util/relnode.c", "label": "Core definition", "sha256": "e4d52530d522808857981ecf0b5943d10844732c06f18a4e4b2323afbd58b67d"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/util/relnode.c#L1012", "path": "src/backend/optimizer/util/relnode.c", "label": "Call sites", "sha256": "e4d52530d522808857981ecf0b5943d10844732c06f18a4e4b2323afbd58b67d"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the new joinrel's properties. Actions might include altering the size estimate, clearing consider_parallel, or adjusting pgs_mask.", "Allow a plugin to editorialize on the new joinrel's properties. Actions might include altering the size estimate, clearing consider_parallel, or adjusting pgs_mask. (However, note that clearing consider_parallel would be better done in the parent joinrel rather than here.)"]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/util/relnode.c:1012", "src/backend/optimizer/util/relnode.c:1173"]}, {"code": "\t/*\n\t * Allow a plugin to editorialize on the new joinrel's properties. Actions\n\t * might include altering the size estimate, clearing consider_parallel,\n\t * or adjusting pgs_mask.\n\t */\n\tif (joinrel_setup_hook)\n\t\t(*joinrel_setup_hook) (root, joinrel, outer_rel, inner_rel, sjinfo,\n\t\t\t\t\t\t\t   restrictlist);\n\n\t/* Store the partition information. */\n\tbuild_joinrel_partition_info(root, joinrel, outer_rel, inner_rel, sjinfo,\n\t\t\t\t\t\t\t\t restrictlist);\n\n\t/* Add the joinrel to the PlannerInfo. */\n\tadd_join_rel(root, joinrel);", "title": "Core call context: src/backend/optimizer/util/relnode.c:1006\u20131020", "paragraphs": []}, {"code": "\t * Allow a plugin to editorialize on the new joinrel's properties. Actions\n\t * might include altering the size estimate, clearing consider_parallel,\n\t * or adjusting pgs_mask. (However, note that clearing consider_parallel\n\t * would be better done in the parent joinrel rather than here.)\n\t */\n\tif (joinrel_setup_hook)\n\t\t(*joinrel_setup_hook) (root, joinrel, outer_rel, inner_rel, sjinfo,\n\t\t\t\t\t\t\t   restrictlist);\n\n\t/* Is the join between partitions itself partitioned? */\n\tbuild_joinrel_partition_info(root, joinrel, outer_rel, inner_rel, sjinfo,\n\t\t\t\t\t\t\t\t restrictlist);\n\n\t/* We build the join only once. */\n\tAssert(!find_join_rel(root, joinrel->relids));", "title": "Core call context: src/backend/optimizer/util/relnode.c:1167\u20131181", "paragraphs": []}], "signature": "typedef void (*joinrel_setup_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outer_rel, RelOptInfo *inner_rel, SpecialJoinInfo *sjinfo, List *restrictlist);\nextern PGDLLIMPORT joinrel_setup_hook_type joinrel_setup_hook;", "description": ["Hook for plugins to get control during joinrel setup"]}}, "content_hash": "1440c361e077d36e0d403d962fbe6c744b9af31963b265a1c6309b54892d554d", "imported_at": "2026-09-27T09:57:58.879", "url": "/wiki/hook/joinrel_setup_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=15"}, {"major": "16", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 16 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=16"}, {"major": "17", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 17 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=17"}, {"major": "18", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 18 \u00b7 Not recorded in this version", "url": "/wiki/hook/joinrel_setup_hook/?v=18"}, {"major": "19", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 19 Beta 4 \u00b7 First recorded in this sample", "url": "/wiki/hook/joinrel_setup_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/joinrel_setup_hook/?v=20"}], "present": false}, {"slug": "planner_hook", "name": "planner_hook", "name_zh": "planner_hook", "category": "Query planning", "summary": "Hook for plugins to get control in planner()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/optimizer/planner.h#L22", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "38335a1fe8bdf73232384fc8b5113e17aed43e0902fcf77b8cd41cc01b6d76ee"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/plan/planner.c#L67", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "aee8c494facfb92d69ab66efc6f3a119b8796f488174eb07d2ef08346709dab6"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/plan/planner.c#L208", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "aee8c494facfb92d69ab66efc6f3a119b8796f488174eb07d2ef08346709dab6"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:208"]}, {"code": "PlannedStmt *\nplanner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{", "title": "Core call context: src/backend/optimizer/plan/planner.c:202\u2013216", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "11": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/optimizer/planner.h#L22", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "51eeb8cf86be4935e89ed182a0802dcabd69b5f8c6705c23349daf7f35ebdca6"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/plan/planner.c#L69", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "2759e867f1d3350da408571eeafd5a0eb2137d0c02e52579d726140aa31bcab7"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/plan/planner.c#L261", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "2759e867f1d3350da408571eeafd5a0eb2137d0c02e52579d726140aa31bcab7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:261"]}, {"code": "PlannedStmt *\nplanner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{", "title": "Core call context: src/backend/optimizer/plan/planner.c:255\u2013269", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "12": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/optimizer/planner.h#L26", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "8d4820190535b8e59c659c3c237e2018d2bfe5a8b000ffb048fe1eebccb7073c"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/plan/planner.c#L75", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "a27e680979f187ec5264f5675cc44a9a5aa67b85c9b69a207f4f7d3a791adedb"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/plan/planner.c#L273", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "a27e680979f187ec5264f5675cc44a9a5aa67b85c9b69a207f4f7d3a791adedb"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:273"]}, {"code": "PlannedStmt *\nplanner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)\n{", "title": "Core call context: src/backend/optimizer/plan/planner.c:267\u2013281", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "13": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/optimizer/planner.h#L26", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "06cb8f28d3a2810d58006b1a91d01481d8cd05dccb4132d2c7b439fdc2f4e344"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/plan/planner.c#L75", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "9f9d4c68be0349980cfefe9109df2415756fd04fa45a6f7176381eba8c32ccef"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/plan/planner.c#L274", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "9f9d4c68be0349980cfefe9109df2415756fd04fa45a6f7176381eba8c32ccef"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:274"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:268\u2013282", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "14": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/optimizer/planner.h#L26", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "90fa62aaa319c5a7c0990ee37e386e09543bf84e2b615ba82bb36fee401f186e"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/plan/planner.c#L75", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "567c6f13b08a1bfd8089c7b02203a43ef0627305b184087ee3296bed0502d680"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/plan/planner.c#L270", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "567c6f13b08a1bfd8089c7b02203a43ef0627305b184087ee3296bed0502d680"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:270"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:264\u2013278", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "15": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/optimizer/planner.h#L26", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "d08a1626954ade22b46ed1e5b585c365765cb3f4aeb19b6b6d220a953f9f9f11"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/plan/planner.c#L75", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "3312bdb7dc77f49e01a7a4afd110f3414c03ce755e7e5fb00deca3b5c2ebd6ee"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/plan/planner.c#L276", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "3312bdb7dc77f49e01a7a4afd110f3414c03ce755e7e5fb00deca3b5c2ebd6ee"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:276"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:270\u2013284", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "16": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/optimizer/planner.h#L26", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "57fcc2e58b25f30a1bcc75c39b40077df4a27c2c4d6f9f618f99d86921f7e361"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/plan/planner.c#L78", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "07f42ef50710179096fb328be88393d58865a39ca8e6020789718cbc78ce355e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/plan/planner.c#L290", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "07f42ef50710179096fb328be88393d58865a39ca8e6020789718cbc78ce355e"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:290"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:284\u2013298", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "17": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/optimizer/planner.h#L26", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "09bba5b6f72173dab2a34129916f97d1f39819d417cba80aa5d73a64bf9e8bbc"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/plan/planner.c#L73", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "d542e814c23cebd3dce7f9c958a376c10c4b1921ba0cb966e67d5ce2c0afb421"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/plan/planner.c#L292", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "d542e814c23cebd3dce7f9c958a376c10c4b1921ba0cb966e67d5ce2c0afb421"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:292"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\treturn result;\n}\n\nPlannedStmt *\nstandard_planner(Query *parse, const char *query_string, int cursorOptions,\n\t\t\t\t ParamListInfo boundParams)", "title": "Core call context: src/backend/optimizer/plan/planner.c:286\u2013300", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "18": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/planner.h#L26", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "2b48e2afeff0e27570bc5bf536f3d5cdaab6111beb0b98bef9e5ce069598d08b"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L74", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/plan/planner.c#L316", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "70faebbc45551e477e5d75000911b029ea648e8cc616725f3b0032480cf16878"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:316"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions, boundParams);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions, boundParams);\n\n\tpgstat_report_plan_id(result->planId, false);\n\n\treturn result;\n}\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:310\u2013324", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "19": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/planner.h#L28", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L74", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L344", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:344"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams, ExplainState *es)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t\t  boundParams, es);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t\t  boundParams, es);\n\n\tpgstat_report_plan_id(result->planId, false);\n\n\treturn result;", "title": "Core call context: src/backend/optimizer/plan/planner.c:338\u2013352", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams, ExplainState *es);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}, "20": {"facts": [{"label": "Interface type", "value": "planner_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/planner.h#L28", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L74", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L344", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:344"]}, {"code": "planner(Query *parse, const char *query_string, int cursorOptions,\n\t\tParamListInfo boundParams, ExplainState *es)\n{\n\tPlannedStmt *result;\n\n\tif (planner_hook)\n\t\tresult = (*planner_hook) (parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t\t  boundParams, es);\n\telse\n\t\tresult = standard_planner(parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t\t  boundParams, es);\n\n\tpgstat_report_plan_id(result->planId, false);\n\n\treturn result;", "title": "Core call context: src/backend/optimizer/plan/planner.c:338\u2013352", "paragraphs": []}], "signature": "typedef PlannedStmt *(*planner_hook_type) (Query *parse, const char *query_string, int cursorOptions, ParamListInfo boundParams, ExplainState *es);\nextern PGDLLIMPORT planner_hook_type planner_hook;", "description": ["Hook for plugins to get control in planner()"]}}, "content_hash": "8074b5fa8dfb063fe3df9e4e704a6ff0cd13951bef893e0284bda3063fd4b9eb", "imported_at": "2026-09-27T09:57:58.880", "url": "/wiki/hook/planner_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=12"}, {"major": "13", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 13 \u00b7 Interface or attribute change", "url": "/wiki/hook/planner_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=18"}, {"major": "19", "state": "changed", "label": "Interface or attribute change", "title": "PostgreSQL 19 Beta 4 \u00b7 Interface or attribute change", "url": "/wiki/hook/planner_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/planner_hook/?v=20"}], "present": true}, {"slug": "planner_setup_hook", "name": "planner_setup_hook", "name_zh": "planner_setup_hook", "category": "Query planning", "summary": "Not recorded in the selected version.", "aliases": [], "versions": {"19": {"facts": [{"label": "Interface type", "value": "planner_setup_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/planner.h#L36", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L77", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L538", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow plugins to take control after we've initialized \"glob\""]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:538"]}, {"code": "\t\tglob->default_pgs_mask |= PGS_GATHER_MERGE;\n\tif (enable_partitionwise_join)\n\t\tglob->default_pgs_mask |= PGS_CONSIDER_PARTITIONWISE;\n\n\t/* Allow plugins to take control after we've initialized \"glob\" */\n\tif (planner_setup_hook)\n\t\t(*planner_setup_hook) (glob, parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t   &tuple_fraction, es);\n\n\t/* primary planning entry point (may recurse for subqueries) */\n\troot = subquery_planner(glob, parse, NULL, NULL, NULL, false,\n\t\t\t\t\t\t\ttuple_fraction, NULL);\n\n\t/* Select best Path and turn it into a Plan */\n\tfinal_rel = fetch_upper_rel(root, UPPERREL_FINAL, NULL);", "title": "Core call context: src/backend/optimizer/plan/planner.c:532\u2013546", "paragraphs": []}], "signature": "typedef void (*planner_setup_hook_type) (PlannerGlobal *glob, Query *parse, const char *query_string, int cursorOptions, double *tuple_fraction, ExplainState *es);\nextern PGDLLIMPORT planner_setup_hook_type planner_setup_hook;", "description": ["Hook for plugins to get control after PlannerGlobal is initialized"]}, "20": {"facts": [{"label": "Interface type", "value": "planner_setup_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/planner.h#L36", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L77", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L538", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow plugins to take control after we've initialized \"glob\""]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:538"]}, {"code": "\t\tglob->default_pgs_mask |= PGS_GATHER_MERGE;\n\tif (enable_partitionwise_join)\n\t\tglob->default_pgs_mask |= PGS_CONSIDER_PARTITIONWISE;\n\n\t/* Allow plugins to take control after we've initialized \"glob\" */\n\tif (planner_setup_hook)\n\t\t(*planner_setup_hook) (glob, parse, query_string, cursorOptions,\n\t\t\t\t\t\t\t   &tuple_fraction, es);\n\n\t/* primary planning entry point (may recurse for subqueries) */\n\troot = subquery_planner(glob, parse, NULL, NULL, NULL, false,\n\t\t\t\t\t\t\ttuple_fraction, NULL);\n\n\t/* Select best Path and turn it into a Plan */\n\tfinal_rel = fetch_upper_rel(root, UPPERREL_FINAL, NULL);", "title": "Core call context: src/backend/optimizer/plan/planner.c:532\u2013546", "paragraphs": []}], "signature": "typedef void (*planner_setup_hook_type) (PlannerGlobal *glob, Query *parse, const char *query_string, int cursorOptions, double *tuple_fraction, ExplainState *es);\nextern PGDLLIMPORT planner_setup_hook_type planner_setup_hook;", "description": ["Hook for plugins to get control after PlannerGlobal is initialized"]}}, "content_hash": "cab5426487b6dceca93213414e8f43b9544e725224bbc52b6675f9ff9bdd61a3", "imported_at": "2026-09-27T09:57:58.882", "url": "/wiki/hook/planner_setup_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=15"}, {"major": "16", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 16 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=16"}, {"major": "17", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 17 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=17"}, {"major": "18", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 18 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_setup_hook/?v=18"}, {"major": "19", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 19 Beta 4 \u00b7 First recorded in this sample", "url": "/wiki/hook/planner_setup_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/planner_setup_hook/?v=20"}], "present": false}, {"slug": "planner_shutdown_hook", "name": "planner_shutdown_hook", "name_zh": "planner_shutdown_hook", "category": "Query planning", "summary": "Not recorded in the selected version.", "aliases": [], "versions": {"19": {"facts": [{"label": "Interface type", "value": "planner_shutdown_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/planner.h#L44", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L80", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/plan/planner.c#L735", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "f71d959162a35db9df0f7b54c0fb7980fd61d80e8da24b1adae7c0dafb33b1c4"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow plugins to take control before we discard \"glob\""]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:735"]}, {"code": "\t\tif (jit_tuple_deforming)\n\t\t\tresult->jitFlags |= PGJIT_DEFORM;\n\t}\n\n\t/* Allow plugins to take control before we discard \"glob\" */\n\tif (planner_shutdown_hook)\n\t\t(*planner_shutdown_hook) (glob, parse, query_string, result);\n\n\tif (glob->partition_directory != NULL)\n\t\tDestroyPartitionDirectory(glob->partition_directory);\n\n\treturn result;\n}\n\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:729\u2013743", "paragraphs": []}], "signature": "typedef void (*planner_shutdown_hook_type) (PlannerGlobal *glob, Query *parse, const char *query_string, PlannedStmt *pstmt);\nextern PGDLLIMPORT planner_shutdown_hook_type planner_shutdown_hook;", "description": ["Hook for plugins to get control before PlannerGlobal is discarded"]}, "20": {"facts": [{"label": "Interface type", "value": "planner_shutdown_hook_type"}, {"label": "Header", "value": "src/include/optimizer/planner.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/planner.h#L44", "path": "src/include/optimizer/planner.h", "label": "Interface declaration", "sha256": "4d38d7e4dd9956ef015711e8bf3262ea52631558a0eea290d4fa14ac517c5407"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L80", "path": "src/backend/optimizer/plan/planner.c", "label": "Core definition", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/plan/planner.c#L735", "path": "src/backend/optimizer/plan/planner.c", "label": "Call sites", "sha256": "fbcf53dca02672e0d1757d98942126dd22a4bcadf5a2323710f76d854fe84395"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow plugins to take control before we discard \"glob\""]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/plan/planner.c:735"]}, {"code": "\t\tif (jit_tuple_deforming)\n\t\t\tresult->jitFlags |= PGJIT_DEFORM;\n\t}\n\n\t/* Allow plugins to take control before we discard \"glob\" */\n\tif (planner_shutdown_hook)\n\t\t(*planner_shutdown_hook) (glob, parse, query_string, result);\n\n\tif (glob->partition_directory != NULL)\n\t\tDestroyPartitionDirectory(glob->partition_directory);\n\n\treturn result;\n}\n\n", "title": "Core call context: src/backend/optimizer/plan/planner.c:729\u2013743", "paragraphs": []}], "signature": "typedef void (*planner_shutdown_hook_type) (PlannerGlobal *glob, Query *parse, const char *query_string, PlannedStmt *pstmt);\nextern PGDLLIMPORT planner_shutdown_hook_type planner_shutdown_hook;", "description": ["Hook for plugins to get control before PlannerGlobal is discarded"]}}, "content_hash": "52e88914e0931c6e250c3ebf6ba0fce8b0690ceb3a794dd6b55675780241959a", "imported_at": "2026-09-27T09:57:58.884", "url": "/wiki/hook/planner_shutdown_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=14"}, {"major": "15", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 15 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=15"}, {"major": "16", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 16 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=16"}, {"major": "17", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 17 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=17"}, {"major": "18", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 18 \u00b7 Not recorded in this version", "url": "/wiki/hook/planner_shutdown_hook/?v=18"}, {"major": "19", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 19 Beta 4 \u00b7 First recorded in this sample", "url": "/wiki/hook/planner_shutdown_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/planner_shutdown_hook/?v=20"}], "present": false}, {"slug": "set_join_pathlist_hook", "name": "set_join_pathlist_hook", "name_zh": "set_join_pathlist_hook", "category": "Query planning", "summary": "Hook for plugins to get control in add_paths_to_joinrel()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/optimizer/paths.h#L36", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "e92f974fb44e1de3a6c550466b600af972c299c02d8d06c2a343ba339e224ce0"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/path/joinpath.c#L27", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "d1880e40332e45959c28ec4d1584d08de24768340aed9953ccccc47f434563ff"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/path/joinpath.c#L300", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "d1880e40332e45959c28ec4d1584d08de24768340aed9953ccccc47f434563ff"}], "sections": [{"title": "Core source comments", "paragraphs": ["6. Finally, give extensions a chance to manipulate the path list."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:300"]}, {"code": "\t\t\t\t\t\t\t\t\t\t\t\t jointype, &extra);\n\n\t/*\n\t * 6. Finally, give extensions a chance to manipulate the path list.\n\t */\n\tif (set_join_pathlist_hook)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:294\u2013308", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "11": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/optimizer/paths.h#L36", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "0a9804f99187ac049c367452e8f0e3a8bad2924a8ba64b20d3957feda7534ccb"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/path/joinpath.c#L28", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "1560fdfb87dcf49c4b8c2e1bd55b2f52a84a4eb43a6951dbc158992d48b46b80"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/path/joinpath.c#L344", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "1560fdfb87dcf49c4b8c2e1bd55b2f52a84a4eb43a6951dbc158992d48b46b80"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:344"]}, {"code": "\t * could add new paths (such as CustomPaths) by calling add_path(), or\n\t * add_partial_path() if parallel aware.  They could also delete or modify\n\t * paths added by the core code.\n\t */\n\tif (set_join_pathlist_hook &&\n\t\tconsider_join_pushdown)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:338\u2013352", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "12": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/optimizer/paths.h#L36", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "5cd4566bfd92117fc9528f43d1a41e923ea751b3f6a435bfefbacee28f2180ac"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/path/joinpath.c#L28", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "d64fd40a724dda69da40ed89a49d187eafbb9b34c0ca05797c453b9221603982"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/path/joinpath.c#L344", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "d64fd40a724dda69da40ed89a49d187eafbb9b34c0ca05797c453b9221603982"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:344"]}, {"code": "\t * could add new paths (such as CustomPaths) by calling add_path(), or\n\t * add_partial_path() if parallel aware.  They could also delete or modify\n\t * paths added by the core code.\n\t */\n\tif (set_join_pathlist_hook &&\n\t\tconsider_join_pushdown)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:338\u2013352", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "13": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/optimizer/paths.h#L36", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "9cf3e1a9a86500ab3330f6e6ccefc8d0368fe2ee15b521ed11c613f6f69ee487"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/path/joinpath.c#L28", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "cfd4b093003a38bec0f774c3f119f1fd6ef7ae91fc58e948e65c9a713b728c58"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/path/joinpath.c#L344", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "cfd4b093003a38bec0f774c3f119f1fd6ef7ae91fc58e948e65c9a713b728c58"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:344"]}, {"code": "\t * could add new paths (such as CustomPaths) by calling add_path(), or\n\t * add_partial_path() if parallel aware.  They could also delete or modify\n\t * paths added by the core code.\n\t */\n\tif (set_join_pathlist_hook &&\n\t\tconsider_join_pushdown)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:338\u2013352", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "14": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/optimizer/paths.h#L36", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "6f4a259bd1b518c6378a75766b2ca2285072894cf7645d102e98f15613dfb1c7"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/path/joinpath.c#L31", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "9841ecd96d3383c4637bc43392f25be072d80e0ba6c894010f80b74bf89e2097"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/path/joinpath.c#L355", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "9841ecd96d3383c4637bc43392f25be072d80e0ba6c894010f80b74bf89e2097"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:355"]}, {"code": "\t * could add new paths (such as CustomPaths) by calling add_path(), or\n\t * add_partial_path() if parallel aware.  They could also delete or modify\n\t * paths added by the core code.\n\t */\n\tif (set_join_pathlist_hook &&\n\t\tconsider_join_pushdown)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:349\u2013363", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "15": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/optimizer/paths.h#L36", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "26db4ac12a1de0b35a8f64334e4879725ead4060072fe6b105ee8f824c6a6916"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/path/joinpath.c#L31", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "77b50f75cf034218b9cb3337c8cd3ed03ba9c9b4f3f97b50eb58399ae7a07188"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/path/joinpath.c#L355", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "77b50f75cf034218b9cb3337c8cd3ed03ba9c9b4f3f97b50eb58399ae7a07188"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:355"]}, {"code": "\t * could add new paths (such as CustomPaths) by calling add_path(), or\n\t * add_partial_path() if parallel aware.  They could also delete or modify\n\t * paths added by the core code.\n\t */\n\tif (set_join_pathlist_hook &&\n\t\tconsider_join_pushdown)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:349\u2013363", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "16": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/optimizer/paths.h#L36", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "4c5cfcfe85de1611e544d8b832fe9b4fcf0f059a0e8d7ffb4f0f5b7381fd214e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/path/joinpath.c#L31", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "8c6d5206a9e280e4110d0127ccb0e0a08ddbf68957bcc11fb6c89bd582045522"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/path/joinpath.c#L358", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "8c6d5206a9e280e4110d0127ccb0e0a08ddbf68957bcc11fb6c89bd582045522"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:358"]}, {"code": "\t * could add new paths (such as CustomPaths) by calling add_path(), or\n\t * add_partial_path() if parallel aware.  They could also delete or modify\n\t * paths added by the core code.\n\t */\n\tif (set_join_pathlist_hook &&\n\t\tconsider_join_pushdown)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:352\u2013366", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "17": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/optimizer/paths.h#L37", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "95ee796a45866c5501ecaef58344017d69d2453da5dde588195c991934d35877"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/path/joinpath.c#L30", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "ec7c8b804b57e07c960f6ba53830e43b9882a2c2c764fc3948dd3ddd83769b36"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/path/joinpath.c#L343", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "ec7c8b804b57e07c960f6ba53830e43b9882a2c2c764fc3948dd3ddd83769b36"}], "sections": [{"title": "Core source comments", "paragraphs": ["6. Finally, give extensions a chance to manipulate the path list. They could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. They could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:343"]}, {"code": "\t * 6. Finally, give extensions a chance to manipulate the path list.  They\n\t * could add new paths (such as CustomPaths) by calling add_path(), or\n\t * add_partial_path() if parallel aware.  They could also delete or modify\n\t * paths added by the core code.\n\t */\n\tif (set_join_pathlist_hook)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:337\u2013351", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "18": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/paths.h#L37", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "bf497b2e5501e7c86250147c9cc779785ccec7bb2a806d3c71571313e890208f"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/joinpath.c#L33", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "03bf45577e4b5c70a6d9e9d2a0bb595846b0bedd7dde4ad4e7a48e5bc308e4c8"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/joinpath.c#L343", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "03bf45577e4b5c70a6d9e9d2a0bb595846b0bedd7dde4ad4e7a48e5bc308e4c8"}], "sections": [{"title": "Core source comments", "paragraphs": ["6. Finally, give extensions a chance to manipulate the path list. They could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. They could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:343"]}, {"code": "\t * 6. Finally, give extensions a chance to manipulate the path list.  They\n\t * could add new paths (such as CustomPaths) by calling add_path(), or\n\t * add_partial_path() if parallel aware.  They could also delete or modify\n\t * paths added by the core code.\n\t */\n\tif (set_join_pathlist_hook)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:337\u2013351", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "19": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/paths.h#L46", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "f1ad3b9072e9a7307836c33477dbb472f36bb3a2c135fa50cd1622d3750310cb"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/path/joinpath.c#L31", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "45ca2faac289f61d393e1e60cfe84725da1c233287b9fe550bd00c4452a32078"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/path/joinpath.c#L380", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "45ca2faac289f61d393e1e60cfe84725da1c233287b9fe550bd00c4452a32078"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in add_paths_to_joinrel()", "6. Finally, give extensions a chance to manipulate the path list. They could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. In theory, extensions could also use this hook to delete or modify paths added by the core code, but in practice this is difficult to make work, since it's too late to get back any paths that have already been discarded by add_path() or add_partial_path(). If you're trying to suppress paths, consider using join_path_setup_hook instead."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:380"]}, {"code": "\t * paths added by the core code, but in practice this is difficult to make\n\t * work, since it's too late to get back any paths that have already been\n\t * discarded by add_path() or add_partial_path(). If you're trying to\n\t * suppress paths, consider using join_path_setup_hook instead.\n\t */\n\tif (set_join_pathlist_hook)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   save_jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:374\u2013388", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}, "20": {"facts": [{"label": "Interface type", "value": "set_join_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/paths.h#L46", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "7d4e6d888e06597a145f6e53f235a90dc70f13db5bab820339f63023003b79e3"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/path/joinpath.c#L31", "path": "src/backend/optimizer/path/joinpath.c", "label": "Core definition", "sha256": "acf82e1a85a0ee004b15ab07db9f72a7729dcea096ffd82e509c0dc2b98b9faf"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/path/joinpath.c#L383", "path": "src/backend/optimizer/path/joinpath.c", "label": "Call sites", "sha256": "acf82e1a85a0ee004b15ab07db9f72a7729dcea096ffd82e509c0dc2b98b9faf"}], "sections": [{"title": "Core source comments", "paragraphs": ["Hooks for plugins to get control in add_paths_to_joinrel()", "6. Finally, give extensions a chance to manipulate the path list. They could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. In theory, extensions could also use this hook to delete or modify paths added by the core code, but in practice this is difficult to make work, since it's too late to get back any paths that have already been discarded by add_path() or add_partial_path(). If you're trying to suppress paths, consider using join_path_setup_hook instead."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/joinpath.c:383"]}, {"code": "\t * paths added by the core code, but in practice this is difficult to make\n\t * work, since it's too late to get back any paths that have already been\n\t * discarded by add_path() or add_partial_path(). If you're trying to\n\t * suppress paths, consider using join_path_setup_hook instead.\n\t */\n\tif (set_join_pathlist_hook)\n\t\tset_join_pathlist_hook(root, joinrel, outerrel, innerrel,\n\t\t\t\t\t\t\t   save_jointype, &extra);\n}\n\n/*\n * We override the param_source_rels heuristic to accept nestloop paths in\n * which the outer rel satisfies some but not all of the inner path's\n * parameterization.  This is necessary to get good plans for star-schema\n * scenarios, in which a parameterized path for a large table may require", "title": "Core call context: src/backend/optimizer/path/joinpath.c:377\u2013391", "paragraphs": []}], "signature": "typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel, JoinType jointype, JoinPathExtraData *extra);\nextern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;", "description": ["Hook for plugins to get control in add_paths_to_joinrel()"]}}, "content_hash": "7e4c49ea976a416e09eb6e8fef1fac0ffa4192068e77e6acbad3871417f5a432", "imported_at": "2026-09-27T09:57:58.886", "url": "/wiki/hook/set_join_pathlist_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/set_join_pathlist_hook/?v=20"}], "present": true}, {"slug": "set_rel_pathlist_hook", "name": "set_rel_pathlist_hook", "name_zh": "set_rel_pathlist_hook", "category": "Query planning", "summary": "Hook for plugins to get control in set_rel_pathlist()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/optimizer/paths.h#L29", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "e92f974fb44e1de3a6c550466b600af972c299c02d8d06c2a343ba339e224ce0"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/path/allpaths.c#L64", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "b9c72dfc75f4354dad3a64d886b8760197c0cf6496f40228e6341bcaf5389671"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/optimizer/path/allpaths.c#L488", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "b9c72dfc75f4354dad3a64d886b8760197c0cf6496f40228e6341bcaf5389671"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:488"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:482\u2013496", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "11": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/optimizer/paths.h#L29", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "0a9804f99187ac049c367452e8f0e3a8bad2924a8ba64b20d3957feda7534ccb"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/path/allpaths.c#L66", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "112b1ef97e3035f335e41f571e5c274144c0abee337a788e265b48ba1ee8a81a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/optimizer/path/allpaths.c#L489", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "112b1ef97e3035f335e41f571e5c274144c0abee337a788e265b48ba1ee8a81a"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:489"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:483\u2013497", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "12": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/optimizer/paths.h#L29", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "5cd4566bfd92117fc9528f43d1a41e923ea751b3f6a435bfefbacee28f2180ac"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/path/allpaths.c#L68", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "a6ee998b1e9a4c0b834d46dbc404d603e1d3d2d1127f430da1390e47eddae9a8"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/optimizer/path/allpaths.c#L540", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "a6ee998b1e9a4c0b834d46dbc404d603e1d3d2d1127f430da1390e47eddae9a8"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:540"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:534\u2013548", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "13": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/optimizer/paths.h#L29", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "9cf3e1a9a86500ab3330f6e6ccefc8d0368fe2ee15b521ed11c613f6f69ee487"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/path/allpaths.c#L68", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "d20c1bdd4a672afda6f6a3b555d2d823f3308435aac41516e0d63e413cdeb5f0"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/optimizer/path/allpaths.c#L540", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "d20c1bdd4a672afda6f6a3b555d2d823f3308435aac41516e0d63e413cdeb5f0"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:540"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:534\u2013548", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "14": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/optimizer/paths.h#L29", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "6f4a259bd1b518c6378a75766b2ca2285072894cf7645d102e98f15613dfb1c7"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/path/allpaths.c#L68", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "68b3eb17f9e400ebb4b7da3df2a133361fc5d1b3e6459805585a241c14c80a45"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/optimizer/path/allpaths.c#L541", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "68b3eb17f9e400ebb4b7da3df2a133361fc5d1b3e6459805585a241c14c80a45"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:541"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:535\u2013549", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "15": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/optimizer/paths.h#L29", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "26db4ac12a1de0b35a8f64334e4879725ead4060072fe6b105ee8f824c6a6916"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/path/allpaths.c#L87", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "3397ddbbffb459d63d802dd89ef4e30d830a6b0ac910dc50ee996923dd292a5f"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/optimizer/path/allpaths.c#L561", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "3397ddbbffb459d63d802dd89ef4e30d830a6b0ac910dc50ee996923dd292a5f"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:561"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:555\u2013569", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "16": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/optimizer/paths.h#L29", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "4c5cfcfe85de1611e544d8b832fe9b4fcf0f059a0e8d7ffb4f0f5b7381fd214e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/path/allpaths.c#L88", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "c80d07eee3c76057b7aab1c27be42c44e26c0a3231e6505d071e032ceefb9228"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/optimizer/path/allpaths.c#L542", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "c80d07eee3c76057b7aab1c27be42c44e26c0a3231e6505d071e032ceefb9228"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:542"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:536\u2013550", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "17": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/optimizer/paths.h#L30", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "95ee796a45866c5501ecaef58344017d69d2453da5dde588195c991934d35877"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/path/allpaths.c#L85", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "f3c06a7b804de19360b78d49dd3c31173d120a1186e248422e6dbcbe3a6905f3"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/optimizer/path/allpaths.c#L539", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "f3c06a7b804de19360b78d49dd3c31173d120a1186e248422e6dbcbe3a6905f3"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:539"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:533\u2013547", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "18": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/optimizer/paths.h#L30", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "bf497b2e5501e7c86250147c9cc779785ccec7bb2a806d3c71571313e890208f"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L85", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/optimizer/path/allpaths.c#L543", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "285b61d146f1e7324a43d7d408ca8d6f10ad3de7eaba01c9f1d618417c21392d"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:543"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:537\u2013551", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "19": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/optimizer/paths.h#L39", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "f1ad3b9072e9a7307836c33477dbb472f36bb3a2c135fa50cd1622d3750310cb"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/path/allpaths.c#L89", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "f1a5425d94371d2395bcc76be126cc75d65a8d96f1f3d87e851f540672e56f62"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/optimizer/path/allpaths.c#L590", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "f1a5425d94371d2395bcc76be126cc75d65a8d96f1f3d87e851f540672e56f62"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:590"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:584\u2013598", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}, "20": {"facts": [{"label": "Interface type", "value": "set_rel_pathlist_hook_type"}, {"label": "Header", "value": "src/include/optimizer/paths.h"}, {"label": "Subsystem", "value": "Query planning"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/optimizer/paths.h#L39", "path": "src/include/optimizer/paths.h", "label": "Interface declaration", "sha256": "7d4e6d888e06597a145f6e53f235a90dc70f13db5bab820339f63023003b79e3"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/path/allpaths.c#L89", "path": "src/backend/optimizer/path/allpaths.c", "label": "Core definition", "sha256": "b78b8e5a80c3a6f9886a5a6f3edb1dc89c366f8fcc3c890327e4b979bc7b08cc"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/optimizer/path/allpaths.c#L590", "path": "src/backend/optimizer/path/allpaths.c", "label": "Call sites", "sha256": "b78b8e5a80c3a6f9886a5a6f3edb1dc89c366f8fcc3c890327e4b979bc7b08cc"}], "sections": [{"title": "Core source comments", "paragraphs": ["Allow a plugin to editorialize on the set of Paths for this base relation. It could add new paths (such as CustomPaths) by calling add_path(), or add_partial_path() if parallel aware. It could also delete or modify paths added by the core code."]}, {"title": "Call sites", "paragraphs": ["src/backend/optimizer/path/allpaths.c:590"]}, {"code": "\t * Allow a plugin to editorialize on the set of Paths for this base\n\t * relation.  It could add new paths (such as CustomPaths) by calling\n\t * add_path(), or add_partial_path() if parallel aware.  It could also\n\t * delete or modify paths added by the core code.\n\t */\n\tif (set_rel_pathlist_hook)\n\t\t(*set_rel_pathlist_hook) (root, rel, rti, rte);\n\n\t/*\n\t * If this is a baserel, we should normally consider gathering any partial\n\t * paths we may have created for it.  We have to do this after calling the\n\t * set_rel_pathlist_hook, else it cannot add partial paths to be included\n\t * here.\n\t *\n\t * However, if this is an inheritance child, skip it.  Otherwise, we could", "title": "Core call context: src/backend/optimizer/path/allpaths.c:584\u2013598", "paragraphs": []}], "signature": "typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, Index rti, RangeTblEntry *rte);\nextern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;", "description": ["Hook for plugins to get control in set_rel_pathlist()"]}}, "content_hash": "f45e098d7bc0ff3b86847d5083bee675b8a9e0dbe644871ba054f56c18752ef3", "imported_at": "2026-09-27T09:57:58.888", "url": "/wiki/hook/set_rel_pathlist_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/set_rel_pathlist_hook/?v=20"}], "present": true}, {"slug": "shmem_request_hook", "name": "shmem_request_hook", "name_zh": "shmem_request_hook", "category": "Startup and shared memory", "summary": "shmem_request_hook: core extension hook declared in src/include/miscadmin.h. The exact interface and call sites are recorded below.", "aliases": [], "versions": {"15": {"facts": [{"label": "Interface type", "value": "shmem_request_hook_type"}, {"label": "Header", "value": "src/include/miscadmin.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=15", "label": "shared_preload_libraries"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/miscadmin.h#L495", "path": "src/include/miscadmin.h", "label": "Interface declaration", "sha256": "d632d6ac1bc6e351fb2f414ae056b78496d4994ea57c467e671bc4b48937621f"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/init/miscinit.c#L1673", "path": "src/backend/utils/init/miscinit.c", "label": "Core definition", "sha256": "1271d82aba17b5d88d964527ffa371a50ce1326cdaa05b91bd61f3c085e8a703"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/init/miscinit.c#L1767", "path": "src/backend/utils/init/miscinit.c", "label": "Call sites", "sha256": "1271d82aba17b5d88d964527ffa371a50ce1326cdaa05b91bd61f3c085e8a703"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/init/miscinit.c:1767"]}, {"code": " */\nvoid\nprocess_shmem_requests(void)\n{\n\tprocess_shmem_requests_in_progress = true;\n\tif (shmem_request_hook)\n\t\tshmem_request_hook();\n\tprocess_shmem_requests_in_progress = false;\n}\n\nvoid\npg_bindtextdomain(const char *domain)\n{\n#ifdef ENABLE_NLS\n\tif (my_exec_path[0] != '\\0')", "title": "Core call context: src/backend/utils/init/miscinit.c:1761\u20131775", "paragraphs": []}], "signature": "typedef void (*shmem_request_hook_type) (void);\nextern PGDLLIMPORT shmem_request_hook_type shmem_request_hook;", "description": ["shmem_request_hook: core extension hook declared in src/include/miscadmin.h. The exact interface and call sites are recorded below."]}, "16": {"facts": [{"label": "Interface type", "value": "shmem_request_hook_type"}, {"label": "Header", "value": "src/include/miscadmin.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=16", "label": "shared_preload_libraries"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/miscadmin.h#L503", "path": "src/include/miscadmin.h", "label": "Interface declaration", "sha256": "7558bf0de318ebafa10615b2ff400fc8d6f2db0012028843aff2cf1005e3433e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/init/miscinit.c#L1837", "path": "src/backend/utils/init/miscinit.c", "label": "Core definition", "sha256": "556e72104ec6b03446e4c333c0c89f005b7138c59430763ea3a2e993339b0588"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/init/miscinit.c#L1931", "path": "src/backend/utils/init/miscinit.c", "label": "Call sites", "sha256": "556e72104ec6b03446e4c333c0c89f005b7138c59430763ea3a2e993339b0588"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/init/miscinit.c:1931"]}, {"code": " */\nvoid\nprocess_shmem_requests(void)\n{\n\tprocess_shmem_requests_in_progress = true;\n\tif (shmem_request_hook)\n\t\tshmem_request_hook();\n\tprocess_shmem_requests_in_progress = false;\n}\n\nvoid\npg_bindtextdomain(const char *domain)\n{\n#ifdef ENABLE_NLS\n\tif (my_exec_path[0] != '\\0')", "title": "Core call context: src/backend/utils/init/miscinit.c:1925\u20131939", "paragraphs": []}], "signature": "typedef void (*shmem_request_hook_type) (void);\nextern PGDLLIMPORT shmem_request_hook_type shmem_request_hook;", "description": ["shmem_request_hook: core extension hook declared in src/include/miscadmin.h. The exact interface and call sites are recorded below."]}, "17": {"facts": [{"label": "Interface type", "value": "shmem_request_hook_type"}, {"label": "Header", "value": "src/include/miscadmin.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=17", "label": "shared_preload_libraries"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/miscadmin.h#L518", "path": "src/include/miscadmin.h", "label": "Interface declaration", "sha256": "7e3b8c86c2dc9f80fdcf277a614ebec3432e287895e6a26c30c8e11f62299e7b"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/init/miscinit.c#L1836", "path": "src/backend/utils/init/miscinit.c", "label": "Core definition", "sha256": "976e73d856b8c480dd6711387067668d1bb2e0c2f1251e39bb946b9b5cfe64ff"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/init/miscinit.c#L1930", "path": "src/backend/utils/init/miscinit.c", "label": "Call sites", "sha256": "976e73d856b8c480dd6711387067668d1bb2e0c2f1251e39bb946b9b5cfe64ff"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/init/miscinit.c:1930"]}, {"code": " */\nvoid\nprocess_shmem_requests(void)\n{\n\tprocess_shmem_requests_in_progress = true;\n\tif (shmem_request_hook)\n\t\tshmem_request_hook();\n\tprocess_shmem_requests_in_progress = false;\n}\n\nvoid\npg_bindtextdomain(const char *domain)\n{\n#ifdef ENABLE_NLS\n\tif (my_exec_path[0] != '\\0')", "title": "Core call context: src/backend/utils/init/miscinit.c:1924\u20131938", "paragraphs": []}], "signature": "typedef void (*shmem_request_hook_type) (void);\nextern PGDLLIMPORT shmem_request_hook_type shmem_request_hook;", "description": ["shmem_request_hook: core extension hook declared in src/include/miscadmin.h. The exact interface and call sites are recorded below."]}, "18": {"facts": [{"label": "Interface type", "value": "shmem_request_hook_type"}, {"label": "Header", "value": "src/include/miscadmin.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=18", "label": "shared_preload_libraries"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/miscadmin.h#L533", "path": "src/include/miscadmin.h", "label": "Interface declaration", "sha256": "597e33af3a463e98e900e9c20e949a48dfd0b20420d31f7db1d1eab58d4a89d3"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/init/miscinit.c#L1841", "path": "src/backend/utils/init/miscinit.c", "label": "Core definition", "sha256": "54bdb859c143a6c70d86067ccf2e124f59aa0852e5705bb653652e41a60af39a"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/init/miscinit.c#L1935", "path": "src/backend/utils/init/miscinit.c", "label": "Call sites", "sha256": "54bdb859c143a6c70d86067ccf2e124f59aa0852e5705bb653652e41a60af39a"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/init/miscinit.c:1935"]}, {"code": " */\nvoid\nprocess_shmem_requests(void)\n{\n\tprocess_shmem_requests_in_progress = true;\n\tif (shmem_request_hook)\n\t\tshmem_request_hook();\n\tprocess_shmem_requests_in_progress = false;\n}\n\nvoid\npg_bindtextdomain(const char *domain)\n{\n#ifdef ENABLE_NLS\n\tif (my_exec_path[0] != '\\0')", "title": "Core call context: src/backend/utils/init/miscinit.c:1929\u20131943", "paragraphs": []}], "signature": "typedef void (*shmem_request_hook_type) (void);\nextern PGDLLIMPORT shmem_request_hook_type shmem_request_hook;", "description": ["shmem_request_hook: core extension hook declared in src/include/miscadmin.h. The exact interface and call sites are recorded below."]}, "19": {"facts": [{"label": "Interface type", "value": "shmem_request_hook_type"}, {"label": "Header", "value": "src/include/miscadmin.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=19", "label": "shared_preload_libraries"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/miscadmin.h#L539", "path": "src/include/miscadmin.h", "label": "Interface declaration", "sha256": "42e5dbc203c366f3e959bb0a103fc1ef97696b83fde8fc493a8f910f823a9457"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/init/miscinit.c#L1790", "path": "src/backend/utils/init/miscinit.c", "label": "Core definition", "sha256": "7448d020460a9c354d69c97244da09d267271a2f419736addad3c33ddcfc3e8c"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/init/miscinit.c#L1884", "path": "src/backend/utils/init/miscinit.c", "label": "Call sites", "sha256": "7448d020460a9c354d69c97244da09d267271a2f419736addad3c33ddcfc3e8c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/init/miscinit.c:1884"]}, {"code": " */\nvoid\nprocess_shmem_requests(void)\n{\n\tprocess_shmem_requests_in_progress = true;\n\tif (shmem_request_hook)\n\t\tshmem_request_hook();\n\tprocess_shmem_requests_in_progress = false;\n}\n\nvoid\npg_bindtextdomain(const char *domain)\n{\n#ifdef ENABLE_NLS\n\tif (my_exec_path[0] != '\\0')", "title": "Core call context: src/backend/utils/init/miscinit.c:1878\u20131892", "paragraphs": []}], "signature": "typedef void (*shmem_request_hook_type) (void);\nextern PGDLLIMPORT shmem_request_hook_type shmem_request_hook;", "description": ["shmem_request_hook: core extension hook declared in src/include/miscadmin.h. The exact interface and call sites are recorded below."]}, "20": {"facts": [{"label": "Interface type", "value": "shmem_request_hook_type"}, {"label": "Header", "value": "src/include/miscadmin.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=20", "label": "shared_preload_libraries"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/miscadmin.h#L550", "path": "src/include/miscadmin.h", "label": "Interface declaration", "sha256": "edb8151c4b93a805230d2a61e537d71f1e34d03af331f04d16c05889a53f0962"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/init/miscinit.c#L1793", "path": "src/backend/utils/init/miscinit.c", "label": "Core definition", "sha256": "7db586ec34a7b5493e94ebe8e84ddd8ee64187fd211940cf02459eebd5cdb4e7"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/init/miscinit.c#L1887", "path": "src/backend/utils/init/miscinit.c", "label": "Call sites", "sha256": "7db586ec34a7b5493e94ebe8e84ddd8ee64187fd211940cf02459eebd5cdb4e7"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/init/miscinit.c:1887"]}, {"code": " */\nvoid\nprocess_shmem_requests(void)\n{\n\tprocess_shmem_requests_in_progress = true;\n\tif (shmem_request_hook)\n\t\tshmem_request_hook();\n\tprocess_shmem_requests_in_progress = false;\n}\n\nvoid\npg_bindtextdomain(const char *domain)\n{\n#ifdef ENABLE_NLS\n\tif (my_exec_path[0] != '\\0')", "title": "Core call context: src/backend/utils/init/miscinit.c:1881\u20131895", "paragraphs": []}], "signature": "typedef void (*shmem_request_hook_type) (void);\nextern PGDLLIMPORT shmem_request_hook_type shmem_request_hook;", "description": ["shmem_request_hook: core extension hook declared in src/include/miscadmin.h. The exact interface and call sites are recorded below."]}}, "content_hash": "9a5383ea58f129d46886b5692c1ae655dbcd26e58ff61cc2a0bfc1a8aeb0bec1", "imported_at": "2026-09-27T09:57:58.890", "url": "/wiki/hook/shmem_request_hook/?v=18", "cells": [{"major": "10", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 10 \u00b7 Not recorded in this version", "url": "/wiki/hook/shmem_request_hook/?v=10"}, {"major": "11", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 11 \u00b7 Not recorded in this version", "url": "/wiki/hook/shmem_request_hook/?v=11"}, {"major": "12", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 12 \u00b7 Not recorded in this version", "url": "/wiki/hook/shmem_request_hook/?v=12"}, {"major": "13", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 13 \u00b7 Not recorded in this version", "url": "/wiki/hook/shmem_request_hook/?v=13"}, {"major": "14", "state": "absent", "label": "Not recorded in this version", "title": "PostgreSQL 14 \u00b7 Not recorded in this version", "url": "/wiki/hook/shmem_request_hook/?v=14"}, {"major": "15", "state": "added", "label": "First recorded in this sample", "title": "PostgreSQL 15 \u00b7 First recorded in this sample", "url": "/wiki/hook/shmem_request_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/shmem_request_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/shmem_request_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/shmem_request_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/shmem_request_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/shmem_request_hook/?v=20"}], "present": true}, {"slug": "shmem_startup_hook", "name": "shmem_startup_hook", "name_zh": "shmem_startup_hook", "category": "Startup and shared memory", "summary": "Now give loadable modules a chance to set up their shmem allocations", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=10", "label": "shared_preload_libraries"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "e8ec446be87e95160699c928da2b2449a8c4b5ec38b31872581bb74252c13552"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/storage/ipc/ipci.c#L51", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "3d03133d5967740565f5a8c9b6d580c442980db2b28600eae5dcad4dc51e66f0"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/storage/ipc/ipci.c#L285", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "3d03133d5967740565f5a8c9b6d580c442980db2b28600eae5dcad4dc51e66f0"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:285"]}, {"code": "\t\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}", "title": "Core call context: src/backend/storage/ipc/ipci.c:279\u2013286", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "11": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=11", "label": "shared_preload_libraries"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "9f4784fb954960b8eadebf8436a5a32a1c8542c9884a96af0c75b25ae5842a3d"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/storage/ipc/ipci.c#L51", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "f86e1871958aeb6457ce0c69a88a747185b4f1a69d335e1fbdd4280daeb909ba"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/storage/ipc/ipci.c#L285", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "f86e1871958aeb6457ce0c69a88a747185b4f1a69d335e1fbdd4280daeb909ba"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:285"]}, {"code": "\t\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}", "title": "Core call context: src/backend/storage/ipc/ipci.c:279\u2013286", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "12": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=12", "label": "shared_preload_libraries"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "88e3ba6b702a5a2d3960b3e994a569ffdc9b24de47bdce0364f22d2ebea67411"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/storage/ipc/ipci.c#L52", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "b8f3c4393a31506796e84ce04f71d424b710b052852da7be8aa97d18279eb383"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/storage/ipc/ipci.c#L284", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "b8f3c4393a31506796e84ce04f71d424b710b052852da7be8aa97d18279eb383"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:284"]}, {"code": "\t\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}", "title": "Core call context: src/backend/storage/ipc/ipci.c:278\u2013285", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "13": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=13", "label": "shared_preload_libraries"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "955fda8c0d7145c5a336796f445c9790a3cb1eb554af2c4ebfb9d87e13560d44"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/storage/ipc/ipci.c#L52", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "dc2415038af0994aa474ff1b44946c6933573246543819404e39a9c54f00b9b0"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/storage/ipc/ipci.c#L284", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "dc2415038af0994aa474ff1b44946c6933573246543819404e39a9c54f00b9b0"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:284"]}, {"code": "\t\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}", "title": "Core call context: src/backend/storage/ipc/ipci.c:278\u2013285", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "14": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=14", "label": "shared_preload_libraries"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "76d5a65586f43350003cb56ff45684d5fac6523f264aa3f4be3511cb1893043f"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/storage/ipc/ipci.c#L53", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "6c2e3eebb079db0fcadf372ca01cdf4fe3ddc71552d1c61a3f6ce6ba039c8160"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/storage/ipc/ipci.c#L290", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "6c2e3eebb079db0fcadf372ca01cdf4fe3ddc71552d1c61a3f6ce6ba039c8160"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:290"]}, {"code": "\t\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}", "title": "Core call context: src/backend/storage/ipc/ipci.c:284\u2013291", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "15": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=15", "label": "shared_preload_libraries"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "04e61782b23fc323439743b3bc98c1f6a4e9af5a6f5f0afc22e0af206363a371"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/storage/ipc/ipci.c#L55", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "152966c82bef94f611646fe740baa595e80fc1fc12589823b1000649c73d3d0b"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/storage/ipc/ipci.c#L314", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "152966c82bef94f611646fe740baa595e80fc1fc12589823b1000649c73d3d0b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:314"]}, {"code": "\t\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n\n/*\n * InitializeShmemGUCs\n *\n * This function initializes runtime-computed GUCs related to the amount of\n * shared memory required for the current configuration.\n */", "title": "Core call context: src/backend/storage/ipc/ipci.c:308\u2013322", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "16": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=16", "label": "shared_preload_libraries"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "8631043c9f604c61c522965bbe4913cc642d952a92a519b4d5db48d7a69c7e7d"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/storage/ipc/ipci.c#L56", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "d3d2573b61e6f1f03ab66f699fe038e38b702e284082381ed5df0278d84649c8"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/storage/ipc/ipci.c#L315", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "d3d2573b61e6f1f03ab66f699fe038e38b702e284082381ed5df0278d84649c8"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:315"]}, {"code": "\t\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n\n/*\n * InitializeShmemGUCs\n *\n * This function initializes runtime-computed GUCs related to the amount of\n * shared memory required for the current configuration.\n */", "title": "Core call context: src/backend/storage/ipc/ipci.c:309\u2013323", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "17": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=17", "label": "shared_preload_libraries"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "bea80e3861ac919b8a7cb653f0b889546c3490a6950b37d092510007a320b6f2"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/storage/ipc/ipci.c#L59", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "2d88521d3af21b453fb062c5cf697a51579c2fca6f9481f7784d913ee0780645"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/storage/ipc/ipci.c#L190", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "2d88521d3af21b453fb062c5cf697a51579c2fca6f9481f7784d913ee0780645"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:190", "src/backend/storage/ipc/ipci.c:262"]}, {"code": "\tCreateOrAttachShmemStructs();\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n#endif\n\n/*\n * CreateSharedMemoryAndSemaphores\n *\t\tCreates and initializes shared memory and semaphores.\n */\nvoid", "title": "Core call context: src/backend/storage/ipc/ipci.c:184\u2013198", "paragraphs": []}, {"code": "\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n\n/*\n * Initialize various subsystems, setting up their data structures in\n * shared memory.\n *\n * This is called by the postmaster or by a standalone backend.\n * It is also called by a backend forked from the postmaster in the", "title": "Core call context: src/backend/storage/ipc/ipci.c:256\u2013270", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "18": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=18", "label": "shared_preload_libraries"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "7eaed5df20e9c94832bf72b758512f55113d727b3cfc426cf7642b2a8ca89334"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/storage/ipc/ipci.c#L58", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "2fa09c75851a35bfb974c97e64f82505e236e56cf480ded7ed7a632cec39d77c"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/storage/ipc/ipci.c#L191", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "2fa09c75851a35bfb974c97e64f82505e236e56cf480ded7ed7a632cec39d77c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:191", "src/backend/storage/ipc/ipci.c:249"]}, {"code": "\tCreateOrAttachShmemStructs();\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n#endif\n\n/*\n * CreateSharedMemoryAndSemaphores\n *\t\tCreates and initializes shared memory and semaphores.\n */\nvoid", "title": "Core call context: src/backend/storage/ipc/ipci.c:185\u2013199", "paragraphs": []}, {"code": "\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n\n/*\n * Initialize various subsystems, setting up their data structures in\n * shared memory.\n *\n * This is called by the postmaster or by a standalone backend.\n * It is also called by a backend forked from the postmaster in the", "title": "Core call context: src/backend/storage/ipc/ipci.c:243\u2013257", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "19": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=19", "label": "shared_preload_libraries"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "f9076b0d89e58e5b3f3a19b89d7f21a653fe870329536824bffcf7132964102c"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/storage/ipc/ipci.c#L31", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "70a3f02d2b29dc71f265f1b41312a7b075d0936a35728439680bf70c67c8f009"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/storage/ipc/ipci.c#L111", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "70a3f02d2b29dc71f265f1b41312a7b075d0936a35728439680bf70c67c8f009"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:111", "src/backend/storage/ipc/ipci.c:159"]}, {"code": "\tShmemAttachRequested();\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n#endif\n\n/*\n * CreateSharedMemoryAndSemaphores\n *\t\tCreates and initializes shared memory and semaphores.\n */\nvoid", "title": "Core call context: src/backend/storage/ipc/ipci.c:105\u2013119", "paragraphs": []}, {"code": "\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n\n/*\n * Early initialization of various subsystems, giving them a chance to\n * register their shared memory needs before the shared memory segment is\n * allocated.\n */\nvoid", "title": "Core call context: src/backend/storage/ipc/ipci.c:153\u2013167", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}, "20": {"facts": [{"label": "Interface type", "value": "shmem_startup_hook_type"}, {"label": "Header", "value": "src/include/storage/ipc.h"}, {"label": "Subsystem", "value": "Startup and shared memory"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/guc/shared_preload_libraries/?v=20", "label": "shared_preload_libraries"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/storage/ipc.h#L22", "path": "src/include/storage/ipc.h", "label": "Interface declaration", "sha256": "f9076b0d89e58e5b3f3a19b89d7f21a653fe870329536824bffcf7132964102c"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/storage/ipc/ipci.c#L31", "path": "src/backend/storage/ipc/ipci.c", "label": "Core definition", "sha256": "70a3f02d2b29dc71f265f1b41312a7b075d0936a35728439680bf70c67c8f009"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/storage/ipc/ipci.c#L111", "path": "src/backend/storage/ipc/ipci.c", "label": "Call sites", "sha256": "70a3f02d2b29dc71f265f1b41312a7b075d0936a35728439680bf70c67c8f009"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/storage/ipc/ipci.c:111", "src/backend/storage/ipc/ipci.c:159"]}, {"code": "\tShmemAttachRequested();\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n#endif\n\n/*\n * CreateSharedMemoryAndSemaphores\n *\t\tCreates and initializes shared memory and semaphores.\n */\nvoid", "title": "Core call context: src/backend/storage/ipc/ipci.c:105\u2013119", "paragraphs": []}, {"code": "\tdsm_postmaster_startup(shim);\n\n\t/*\n\t * Now give loadable modules a chance to set up their shmem allocations\n\t */\n\tif (shmem_startup_hook)\n\t\tshmem_startup_hook();\n}\n\n/*\n * Early initialization of various subsystems, giving them a chance to\n * register their shared memory needs before the shared memory segment is\n * allocated.\n */\nvoid", "title": "Core call context: src/backend/storage/ipc/ipci.c:153\u2013167", "paragraphs": []}], "signature": "typedef void (*shmem_startup_hook_type) (void);\nextern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;", "description": ["Now give loadable modules a chance to set up their shmem allocations"]}}, "content_hash": "3c5aed0d5f58818dbff898f3358943dd5a8622db5a5d1b25eff2f52f9d74ea11", "imported_at": "2026-09-27T09:57:58.892", "url": "/wiki/hook/shmem_startup_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/shmem_startup_hook/?v=20"}], "present": true}, {"slug": "get_attavgwidth_hook", "name": "get_attavgwidth_hook", "name_zh": "get_attavgwidth_hook", "category": "Statistics and estimation", "summary": "Hook for plugins to get control in get_attavgwidth()", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/utils/lsyscache.h#L61", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "c945f1fd1f9bd32587a82cad122af5b12553bc2d1a66767b120c17468fed949e"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/cache/lsyscache.c#L50", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "d572a1ae1cd94b54bfbbbda7adb2246471d89f275d16d3dd6fc14debd555d87f"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/cache/lsyscache.c#L2859", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "d572a1ae1cd94b54bfbbbda7adb2246471d89f275d16d3dd6fc14debd555d87f"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:2859"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:2853\u20132867", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "11": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/utils/lsyscache.h#L61", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "71f1dc96e3d4fca3cdc0384f4b603a070943d89ef16ec37979904789a0b4581a"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/cache/lsyscache.c#L50", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "3c63b43f833e40b63d7d1d15b7b321c890d2ae22ae1188b2f709eec38f139775"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/cache/lsyscache.c#L2877", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "3c63b43f833e40b63d7d1d15b7b321c890d2ae22ae1188b2f709eec38f139775"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:2877"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:2871\u20132885", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "12": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/utils/lsyscache.h#L62", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "32ad4fb942b8bbc692c362426d5871083e4cee69bceda0aaee7ae11f0d91680e"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/cache/lsyscache.c#L50", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "e1ba6033c579abbd16c7fd5c29aa527b009fcc06e298352e1bb5f2586fa32a83"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/cache/lsyscache.c#L2904", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "e1ba6033c579abbd16c7fd5c29aa527b009fcc06e298352e1bb5f2586fa32a83"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:2904"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:2898\u20132912", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "13": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/utils/lsyscache.h#L62", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "1356ab2c69ed832883ea0bd89a8e77f2291db56be4d1686e612540d26f0a6845"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/cache/lsyscache.c#L51", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "34198e44249c1191a7a60cc2dc6fe9149e3719434c9a02266acc5123ed43c00c"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/cache/lsyscache.c#L3014", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "34198e44249c1191a7a60cc2dc6fe9149e3719434c9a02266acc5123ed43c00c"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:3014"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:3008\u20133022", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "14": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/utils/lsyscache.h#L65", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "5916e946d0a8aa5896c0aa7088f60c8089b837a63ac97ce21a601b1c0c62e387"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/cache/lsyscache.c#L51", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "1b106f1558e4e9ac424623a5edd4c2aa15b564aacd45065ad3529a81243a3a17"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/cache/lsyscache.c#L3235", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "1b106f1558e4e9ac424623a5edd4c2aa15b564aacd45065ad3529a81243a3a17"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:3235"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:3229\u20133243", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "15": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/utils/lsyscache.h#L65", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "3cde44e1b3e9d92818f33efc79115306a6ec55a02dcdebd5b59f91f067e48d20"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/cache/lsyscache.c#L51", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "015446a5a6616d41cac8a939a6aa5771bbcd5e2220b4fffba095d2fa30e71e27"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/cache/lsyscache.c#L3235", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "015446a5a6616d41cac8a939a6aa5771bbcd5e2220b4fffba095d2fa30e71e27"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:3235"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:3229\u20133243", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "16": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/utils/lsyscache.h#L65", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "fb25cfb944af2754d95bfd007ddd2ee4c5aa0e2ee678086a4620fb6d1ba38ab6"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/cache/lsyscache.c#L52", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "c7669b67bbe5f3aad231d5e134563dc634026c559954e2719d41dace9cade0a9"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/cache/lsyscache.c#L3236", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "c7669b67bbe5f3aad231d5e134563dc634026c559954e2719d41dace9cade0a9"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:3236"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:3230\u20133244", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "17": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/utils/lsyscache.h#L65", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "d92246132a38a36a521a0b9b4704af9833cdfdb65cf5559582d97c4bec2a5283"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/cache/lsyscache.c#L53", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "a29a7752932c692d85fed61581b28d31113c349bb9cb8950b5fa325079f69541"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/cache/lsyscache.c#L3278", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "a29a7752932c692d85fed61581b28d31113c349bb9cb8950b5fa325079f69541"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:3278"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:3272\u20133286", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "18": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/utils/lsyscache.h#L66", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "48ab9cc15af02106e6710ea04b2738e8aea75b4956934ea8ec109c8c49daa834"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/cache/lsyscache.c#L54", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "43a22e20685c043936ddfeee032d0c06d9408d7edbadfa9417a2ede32e70b97d"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/cache/lsyscache.c#L3467", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "43a22e20685c043936ddfeee032d0c06d9408d7edbadfa9417a2ede32e70b97d"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:3467"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:3461\u20133475", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "19": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/utils/lsyscache.h#L66", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "1edd69681906b30b512c9085d2751efa1629ee26ca89c4154fca4b4f82793e03"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/cache/lsyscache.c#L55", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "8f2026cfcdf7465afc375123e5be302e3e4bf9815e325f41eba6dc55fb79cf00"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/cache/lsyscache.c#L3479", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "8f2026cfcdf7465afc375123e5be302e3e4bf9815e325f41eba6dc55fb79cf00"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:3479"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:3473\u20133487", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}, "20": {"facts": [{"label": "Interface type", "value": "get_attavgwidth_hook_type"}, {"label": "Header", "value": "src/include/utils/lsyscache.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/utils/lsyscache.h#L66", "path": "src/include/utils/lsyscache.h", "label": "Interface declaration", "sha256": "1edd69681906b30b512c9085d2751efa1629ee26ca89c4154fca4b4f82793e03"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/cache/lsyscache.c#L55", "path": "src/backend/utils/cache/lsyscache.c", "label": "Core definition", "sha256": "72b1e5cff25d0c35e454706269fe89e9c3e815e3714ebaf862230f589072b7f5"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/cache/lsyscache.c#L3479", "path": "src/backend/utils/cache/lsyscache.c", "label": "Call sites", "sha256": "72b1e5cff25d0c35e454706269fe89e9c3e815e3714ebaf862230f589072b7f5"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/cache/lsyscache.c:3479"]}, {"code": "{\n\tHeapTuple\ttp;\n\tint32\t\tstawidth;\n\n\tif (get_attavgwidth_hook)\n\t{\n\t\tstawidth = (*get_attavgwidth_hook) (relid, attnum);\n\t\tif (stawidth > 0)\n\t\t\treturn stawidth;\n\t}\n\ttp = SearchSysCache3(STATRELATTINH,\n\t\t\t\t\t\t ObjectIdGetDatum(relid),\n\t\t\t\t\t\t Int16GetDatum(attnum),\n\t\t\t\t\t\t BoolGetDatum(false));\n\tif (HeapTupleIsValid(tp))", "title": "Core call context: src/backend/utils/cache/lsyscache.c:3473\u20133487", "paragraphs": []}], "signature": "typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);\nextern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;", "description": ["Hook for plugins to get control in get_attavgwidth()"]}}, "content_hash": "04af6adb045a56da90e5fc2cd1899ee585db95a6076187116b4157aba2448317", "imported_at": "2026-09-27T09:57:58.894", "url": "/wiki/hook/get_attavgwidth_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/get_attavgwidth_hook/?v=20"}], "present": true}, {"slug": "get_index_stats_hook", "name": "get_index_stats_hook", "name_zh": "get_index_stats_hook", "category": "Statistics and estimation", "summary": "get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below.", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/utils/selfuncs.h#L147", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "6403861cc3a1cbe440f954519c911414d5b18530fda92c6e2ef8612075e74b30"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/adt/selfuncs.c#L156", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "288b5af493935cc76448085b2bdc43b5334a3b8eb2e30837135a4849d77c4c7b"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/adt/selfuncs.c#L4778", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "288b5af493935cc76448085b2bdc43b5334a3b8eb2e30837135a4849d77c4c7b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:4778", "src/backend/utils/adt/selfuncs.c:7054", "src/backend/utils/adt/selfuncs.c:8012"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:4772\u20134786", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7048\u20137062", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = qinfo->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:8006\u20138020", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "11": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/utils/selfuncs.h#L150", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "05b41241a0d7e6703407878eaf1a9ac5b2ca6387143c217533396f0dd05d41e7"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/adt/selfuncs.c#L159", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "8992cb024b68aabbb92e21703fb76efc266c9a79207430b1b7b7f0aaa59d3f18"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/adt/selfuncs.c#L4957", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "8992cb024b68aabbb92e21703fb76efc266c9a79207430b1b7b7f0aaa59d3f18"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:4957", "src/backend/utils/adt/selfuncs.c:7484", "src/backend/utils/adt/selfuncs.c:8444"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:4951\u20134965", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7478\u20137492", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = qinfo->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:8438\u20138452", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "12": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/utils/selfuncs.h#L121", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "4ee9dbdb6d7ce67221901d190471512285646f7514af6e9a9236437ec78189f2"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/adt/selfuncs.c#L148", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "4f7a57fc0766f773a26d2ffdc0fb84927cb8908ddce0e54e6cc8c5e36ab85d16"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/adt/selfuncs.c#L4659", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "4f7a57fc0766f773a26d2ffdc0fb84927cb8908ddce0e54e6cc8c5e36ab85d16"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:4659", "src/backend/utils/adt/selfuncs.c:6306", "src/backend/utils/adt/selfuncs.c:7237"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:4653\u20134667", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6300\u20136314", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7231\u20137245", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "13": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/utils/selfuncs.h#L126", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "035afc988c6f8bc39bf547dcbe12ac6e71aaae677f6673f50cc05cea84c7dfed"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/adt/selfuncs.c#L149", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "2d1bdf1b438c6167817fc6126837cb45196fe0c54c93dde18fa814b07d9b9370"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/adt/selfuncs.c#L4894", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "2d1bdf1b438c6167817fc6126837cb45196fe0c54c93dde18fa814b07d9b9370"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:4894", "src/backend/utils/adt/selfuncs.c:6629", "src/backend/utils/adt/selfuncs.c:7590"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:4888\u20134902", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6623\u20136637", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7584\u20137598", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "14": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/utils/selfuncs.h#L143", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "477ef6ccc43c3148b49e8209b03d40253a7c433e90503633b8ed2faa7215494a"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/adt/selfuncs.c#L145", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "c5e40038ae375f6162564473ff69520d53b19144d2aa966099f645967ef28886"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/adt/selfuncs.c#L5119", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "c5e40038ae375f6162564473ff69520d53b19144d2aa966099f645967ef28886"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5119", "src/backend/utils/adt/selfuncs.c:6948", "src/backend/utils/adt/selfuncs.c:7909"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5113\u20135127", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6942\u20136956", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7903\u20137917", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "15": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/utils/selfuncs.h#L143", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "1d508219fd05df7deb661e98b5532cefc7017758ed089babeb219b0e5d95cebd"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/adt/selfuncs.c#L145", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "79162c96bde542572b9415b92420897d493befc88f02e955af3090ab1c76af1d"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/adt/selfuncs.c#L5111", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "79162c96bde542572b9415b92420897d493befc88f02e955af3090ab1c76af1d"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5111", "src/backend/utils/adt/selfuncs.c:6932", "src/backend/utils/adt/selfuncs.c:7893"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5105\u20135119", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6926\u20136940", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7887\u20137901", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "16": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/utils/selfuncs.h#L143", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "1d8250535a2393b146598521d0c131233e174e21c62131ed8b904143f460562e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/adt/selfuncs.c#L148", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "9ac1490ef8751522c48415fb630e7b0a1fc32c23e177e01077adc3364a87ee79"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/adt/selfuncs.c#L5149", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "9ac1490ef8751522c48415fb630e7b0a1fc32c23e177e01077adc3364a87ee79"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5149", "src/backend/utils/adt/selfuncs.c:6977", "src/backend/utils/adt/selfuncs.c:7991"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5143\u20135157", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6971\u20136985", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7985\u20137999", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "17": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/utils/selfuncs.h#L146", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "d5e4e27a8f6eb3c1b474e3cc33d4594cdd79c80cf26f184bace66a566f2a0a3b"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/adt/selfuncs.c#L149", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "eff69814693a9b311261a1c9e7b533893baaab52b336d7ac67b2ba822ce1d222"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/adt/selfuncs.c#L5204", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "eff69814693a9b311261a1c9e7b533893baaab52b336d7ac67b2ba822ce1d222"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5204", "src/backend/utils/adt/selfuncs.c:7153", "src/backend/utils/adt/selfuncs.c:8167"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5198\u20135212", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7147\u20137161", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:8161\u20138175", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "18": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/utils/selfuncs.h#L147", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "a3b64e2dd2d41eab2c162a2571bfbe98fac83ae9fab514b73d637220157a501a"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/adt/selfuncs.c#L149", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "c51b0d3f9c9015e98278241c8efc28c39739a56337ffec1163427b3876170f19"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/adt/selfuncs.c#L5488", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "c51b0d3f9c9015e98278241c8efc28c39739a56337ffec1163427b3876170f19"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5488", "src/backend/utils/adt/selfuncs.c:6224", "src/backend/utils/adt/selfuncs.c:8783"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5482\u20135496", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = indexcol + 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t\t!vardata->freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6218\u20136232", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:8777\u20138791", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "19": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/utils/selfuncs.h#L154", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "7a49338488273cc2b9f37629eb1efa8304b35536e8b62e56d1ea69972f748d48"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/adt/selfuncs.c#L184", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "ce307caa3c344424565af0a1b2e19d2639bf56fbe7f73e7803e47f53f099dfcd"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/adt/selfuncs.c#L5827", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "ce307caa3c344424565af0a1b2e19d2639bf56fbe7f73e7803e47f53f099dfcd"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5827", "src/backend/utils/adt/selfuncs.c:6563", "src/backend/utils/adt/selfuncs.c:9147"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5821\u20135835", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = indexcol + 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t\t!vardata->freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6557\u20136571", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:9141\u20139155", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}, "20": {"facts": [{"label": "Interface type", "value": "get_index_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/utils/selfuncs.h#L154", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "7a49338488273cc2b9f37629eb1efa8304b35536e8b62e56d1ea69972f748d48"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/adt/selfuncs.c#L182", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "e944f9b47bb7ed57677bf10b54c7a0ef3d51c50796c04f31a46a7ac827608d56"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/adt/selfuncs.c#L5825", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "e944f9b47bb7ed57677bf10b54c7a0ef3d51c50796c04f31a46a7ac827608d56"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5825", "src/backend/utils/adt/selfuncs.c:6653", "src/backend/utils/adt/selfuncs.c:9187"]}, {"code": "\t\t\t\t\t\t * a partial index.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * An index stats hook, however, must make its own\n\t\t\t\t\t\t * decisions about what to do with partial indexes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (get_index_stats_hook &&\n\t\t\t\t\t\t\t(*get_index_stats_hook) (root, index->indexoid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t pos + 1, vardata))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * The hook took control of acquiring a stats\n\t\t\t\t\t\t\t * tuple.  If it did supply a tuple, it'd better\n\t\t\t\t\t\t\t * have supplied a freefunc.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5819\u20135833", "paragraphs": []}, {"code": "\t{\n\t\t/* Expression --- maybe there are stats for the index itself */\n\t\trelid = index->indexoid;\n\t\tcolnum = indexcol + 1;\n\n\t\tif (get_index_stats_hook &&\n\t\t\t(*get_index_stats_hook) (root, relid, colnum, vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t\t!vardata->freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6647\u20136661", "paragraphs": []}, {"code": "\t\t\t */\n\n\t\t\t/* get the attnum from the 0-based index. */\n\t\t\tattnum = iclause->indexcol + 1;\n\n\t\t\tif (get_index_stats_hook &&\n\t\t\t\t(*get_index_stats_hook) (root, index->indexoid, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t\t!vardata.freefunc)\n\t\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:9181\u20139195", "paragraphs": []}], "signature": "typedef bool (*get_index_stats_hook_type) (PlannerInfo *root, Oid indexOid, AttrNumber indexattnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook;", "description": ["get_index_stats_hook: core extension hook declared in src/include/utils/selfuncs.h. The exact interface and call sites are recorded below."]}}, "content_hash": "75ec4070d6d5bac73b854afef4a4ff4904e32538dfce309120c0361d4caad41f", "imported_at": "2026-09-27T09:57:58.895", "url": "/wiki/hook/get_index_stats_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/get_index_stats_hook/?v=20"}], "present": true}, {"slug": "get_relation_stats_hook", "name": "get_relation_stats_hook", "name_zh": "get_relation_stats_hook", "category": "Statistics and estimation", "summary": "Hooks for plugins to get control when we ask for stats", "aliases": [], "versions": {"10": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/10/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_10_STABLE", "label": "10", "major": "10", "channel": "historical", "revision": "f4e8f137bfb08a664c8288824c1e36b5143ac875"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/include/utils/selfuncs.h#L142", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "6403861cc3a1cbe440f954519c911414d5b18530fda92c6e2ef8612075e74b30"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/adt/selfuncs.c#L155", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "288b5af493935cc76448085b2bdc43b5334a3b8eb2e30837135a4849d77c4c7b"}, {"url": "https://github.com/postgres/postgres/blob/f4e8f137bfb08a664c8288824c1e36b5143ac875/src/backend/utils/adt/selfuncs.c#L4864", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "288b5af493935cc76448085b2bdc43b5334a3b8eb2e30837135a4849d77c4c7b"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:4864", "src/backend/utils/adt/selfuncs.c:7028", "src/backend/utils/adt/selfuncs.c:7981"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:4858\u20134872", "paragraphs": []}, {"code": "\t\tAssert(rte->rtekind == RTE_RELATION);\n\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[0];\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7022\u20137036", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7975\u20137989", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "11": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/11/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_11_STABLE", "label": "11", "major": "11", "channel": "historical", "revision": "170e416034ec0231d9e9238f2577eeb76ca8d181"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/include/utils/selfuncs.h#L145", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "05b41241a0d7e6703407878eaf1a9ac5b2ca6387143c217533396f0dd05d41e7"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/adt/selfuncs.c#L158", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "8992cb024b68aabbb92e21703fb76efc266c9a79207430b1b7b7f0aaa59d3f18"}, {"url": "https://github.com/postgres/postgres/blob/170e416034ec0231d9e9238f2577eeb76ca8d181/src/backend/utils/adt/selfuncs.c#L5089", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "8992cb024b68aabbb92e21703fb76efc266c9a79207430b1b7b7f0aaa59d3f18"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5089", "src/backend/utils/adt/selfuncs.c:7458", "src/backend/utils/adt/selfuncs.c:8413"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5083\u20135097", "paragraphs": []}, {"code": "\t\tAssert(rte->rtekind == RTE_RELATION);\n\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[0];\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7452\u20137466", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:8407\u20138421", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "12": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/12/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_12_STABLE", "label": "12", "major": "12", "channel": "historical", "revision": "3f302f0ed06f69c5ebd33d4df95895323a3cbef6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/include/utils/selfuncs.h#L116", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "4ee9dbdb6d7ce67221901d190471512285646f7514af6e9a9236437ec78189f2"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/adt/selfuncs.c#L147", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "4f7a57fc0766f773a26d2ffdc0fb84927cb8908ddce0e54e6cc8c5e36ab85d16"}, {"url": "https://github.com/postgres/postgres/blob/3f302f0ed06f69c5ebd33d4df95895323a3cbef6/src/backend/utils/adt/selfuncs.c#L4791", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "4f7a57fc0766f773a26d2ffdc0fb84927cb8908ddce0e54e6cc8c5e36ab85d16"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:4791", "src/backend/utils/adt/selfuncs.c:6280", "src/backend/utils/adt/selfuncs.c:7206"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:4785\u20134799", "paragraphs": []}, {"code": "\t\tAssert(rte->rtekind == RTE_RELATION);\n\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[0];\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6274\u20136288", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7200\u20137214", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "13": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/13/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_13_STABLE", "label": "13", "major": "13", "channel": "historical", "revision": "05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/include/utils/selfuncs.h#L121", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "035afc988c6f8bc39bf547dcbe12ac6e71aaae677f6673f50cc05cea84c7dfed"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/adt/selfuncs.c#L148", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "2d1bdf1b438c6167817fc6126837cb45196fe0c54c93dde18fa814b07d9b9370"}, {"url": "https://github.com/postgres/postgres/blob/05f6c9ec2c475fae8fdd56ae40bd01afcf70d1f2/src/backend/utils/adt/selfuncs.c#L4980", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "2d1bdf1b438c6167817fc6126837cb45196fe0c54c93dde18fa814b07d9b9370"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:4980", "src/backend/utils/adt/selfuncs.c:6603", "src/backend/utils/adt/selfuncs.c:7559"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:4974\u20134988", "paragraphs": []}, {"code": "\t\tAssert(rte->rtekind == RTE_RELATION);\n\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[0];\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6597\u20136611", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7553\u20137567", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "14": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/14/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_14_STABLE", "label": "14", "major": "14", "channel": "stable", "revision": "fba35c7c28a567839faba867db0808564c0a66db"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/include/utils/selfuncs.h#L138", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "477ef6ccc43c3148b49e8209b03d40253a7c433e90503633b8ed2faa7215494a"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/adt/selfuncs.c#L144", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "c5e40038ae375f6162564473ff69520d53b19144d2aa966099f645967ef28886"}, {"url": "https://github.com/postgres/postgres/blob/fba35c7c28a567839faba867db0808564c0a66db/src/backend/utils/adt/selfuncs.c#L5297", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "c5e40038ae375f6162564473ff69520d53b19144d2aa966099f645967ef28886"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5297", "src/backend/utils/adt/selfuncs.c:6922", "src/backend/utils/adt/selfuncs.c:7878"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5291\u20135305", "paragraphs": []}, {"code": "\t\tAssert(rte->rtekind == RTE_RELATION);\n\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[0];\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6916\u20136930", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7872\u20137886", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "15": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/15/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_15_STABLE", "label": "15", "major": "15", "channel": "stable", "revision": "0351991b8e7c7b64382e2f30ce581a8f276590a6"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/include/utils/selfuncs.h#L138", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "1d508219fd05df7deb661e98b5532cefc7017758ed089babeb219b0e5d95cebd"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/adt/selfuncs.c#L144", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "79162c96bde542572b9415b92420897d493befc88f02e955af3090ab1c76af1d"}, {"url": "https://github.com/postgres/postgres/blob/0351991b8e7c7b64382e2f30ce581a8f276590a6/src/backend/utils/adt/selfuncs.c#L5281", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "79162c96bde542572b9415b92420897d493befc88f02e955af3090ab1c76af1d"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5281", "src/backend/utils/adt/selfuncs.c:6906", "src/backend/utils/adt/selfuncs.c:7862"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5275\u20135289", "paragraphs": []}, {"code": "\t\tAssert(rte->rtekind == RTE_RELATION);\n\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[0];\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6900\u20136914", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7856\u20137870", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "16": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/16/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_16_STABLE", "label": "16", "major": "16", "channel": "stable", "revision": "dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/include/utils/selfuncs.h#L138", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "1d8250535a2393b146598521d0c131233e174e21c62131ed8b904143f460562e"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/adt/selfuncs.c#L147", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "9ac1490ef8751522c48415fb630e7b0a1fc32c23e177e01077adc3364a87ee79"}, {"url": "https://github.com/postgres/postgres/blob/dcc37b7099a9f3cf2c75167d8dc92e75f96bc1fa/src/backend/utils/adt/selfuncs.c#L5321", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "9ac1490ef8751522c48415fb630e7b0a1fc32c23e177e01077adc3364a87ee79"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5321", "src/backend/utils/adt/selfuncs.c:6951", "src/backend/utils/adt/selfuncs.c:7960"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5315\u20135329", "paragraphs": []}, {"code": "\t\tAssert(rte->rtekind == RTE_RELATION);\n\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[0];\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6945\u20136959", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7954\u20137968", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "17": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/17/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_17_STABLE", "label": "17", "major": "17", "channel": "stable", "revision": "163288afd32a448244c8df75b3c33181aadd7f20"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/include/utils/selfuncs.h#L141", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "d5e4e27a8f6eb3c1b474e3cc33d4594cdd79c80cf26f184bace66a566f2a0a3b"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/adt/selfuncs.c#L148", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "eff69814693a9b311261a1c9e7b533893baaab52b336d7ac67b2ba822ce1d222"}, {"url": "https://github.com/postgres/postgres/blob/163288afd32a448244c8df75b3c33181aadd7f20/src/backend/utils/adt/selfuncs.c#L5376", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "eff69814693a9b311261a1c9e7b533893baaab52b336d7ac67b2ba822ce1d222"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5376", "src/backend/utils/adt/selfuncs.c:7127", "src/backend/utils/adt/selfuncs.c:8136"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5370\u20135384", "paragraphs": []}, {"code": "\t\tAssert(rte->rtekind == RTE_RELATION);\n\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[0];\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, &vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata.statsTuple) &&\n\t\t\t\t!vardata.freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:7121\u20137135", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:8130\u20138144", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "18": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/18/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_18_STABLE", "label": "18", "major": "18", "channel": "stable", "revision": "753057e340da8f22e57c9a409ea7a235fd6a46bd"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/include/utils/selfuncs.h#L142", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "a3b64e2dd2d41eab2c162a2571bfbe98fac83ae9fab514b73d637220157a501a"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/adt/selfuncs.c#L148", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "c51b0d3f9c9015e98278241c8efc28c39739a56337ffec1163427b3876170f19"}, {"url": "https://github.com/postgres/postgres/blob/753057e340da8f22e57c9a409ea7a235fd6a46bd/src/backend/utils/adt/selfuncs.c#L5717", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "c51b0d3f9c9015e98278241c8efc28c39739a56337ffec1163427b3876170f19"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:5717", "src/backend/utils/adt/selfuncs.c:6198", "src/backend/utils/adt/selfuncs.c:8752"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:5711\u20135725", "paragraphs": []}, {"code": "\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[indexcol];\n\t\tvardata->rel = index->rel;\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t\t!vardata->freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6192\u20136206", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:8746\u20138760", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "19": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/19/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "REL_19_BETA4", "label": "19 Beta 4", "major": "19", "channel": "preview", "revision": "b73d13c32c834a2c8e1c60cb92f79530376cedf1"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/include/utils/selfuncs.h#L149", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "7a49338488273cc2b9f37629eb1efa8304b35536e8b62e56d1ea69972f748d48"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/adt/selfuncs.c#L183", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "ce307caa3c344424565af0a1b2e19d2639bf56fbe7f73e7803e47f53f099dfcd"}, {"url": "https://github.com/postgres/postgres/blob/b73d13c32c834a2c8e1c60cb92f79530376cedf1/src/backend/utils/adt/selfuncs.c#L6056", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "ce307caa3c344424565af0a1b2e19d2639bf56fbe7f73e7803e47f53f099dfcd"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:6056", "src/backend/utils/adt/selfuncs.c:6537", "src/backend/utils/adt/selfuncs.c:9116"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6050\u20136064", "paragraphs": []}, {"code": "\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[indexcol];\n\t\tvardata->rel = index->rel;\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t\t!vardata->freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6531\u20136545", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:9110\u20139124", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}, "20": {"facts": [{"label": "Interface type", "value": "get_relation_stats_hook_type"}, {"label": "Header", "value": "src/include/utils/selfuncs.h"}, {"label": "Subsystem", "value": "Statistics and estimation"}, {"label": "Initial value", "value": "NULL (no hook installed)"}], "related": [{"url": "/docs/devel/planner-optimizer.html", "label": "The Planner/Optimizer"}], "release": {"ref": "master", "label": "20 devel", "major": "20", "channel": "devel", "revision": "2c10c2ce4d7bcd57543a49ab402af02a39724e0a"}, "sources": [{"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/include/utils/selfuncs.h#L149", "path": "src/include/utils/selfuncs.h", "label": "Interface declaration", "sha256": "7a49338488273cc2b9f37629eb1efa8304b35536e8b62e56d1ea69972f748d48"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/adt/selfuncs.c#L181", "path": "src/backend/utils/adt/selfuncs.c", "label": "Core definition", "sha256": "e944f9b47bb7ed57677bf10b54c7a0ef3d51c50796c04f31a46a7ac827608d56"}, {"url": "https://github.com/postgres/postgres/blob/2c10c2ce4d7bcd57543a49ab402af02a39724e0a/src/backend/utils/adt/selfuncs.c#L6054", "path": "src/backend/utils/adt/selfuncs.c", "label": "Call sites", "sha256": "e944f9b47bb7ed57677bf10b54c7a0ef3d51c50796c04f31a46a7ac827608d56"}], "sections": [{"title": "Call sites", "paragraphs": ["src/backend/utils/adt/selfuncs.c:6054", "src/backend/utils/adt/selfuncs.c:6627", "src/backend/utils/adt/selfuncs.c:9156"]}, {"code": "{\n\tRangeTblEntry *rte = root->simple_rte_array[var->varno];\n\n\tAssert(IsA(rte, RangeTblEntry));\n\n\tif (get_relation_stats_hook &&\n\t\t(*get_relation_stats_hook) (root, rte, var->varattno, vardata))\n\t{\n\t\t/*\n\t\t * The hook took control of acquiring a stats tuple.  If it did supply\n\t\t * a tuple, it'd better have supplied a freefunc.\n\t\t */\n\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t!vardata->freefunc)\n\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6048\u20136062", "paragraphs": []}, {"code": "\t\trelid = rte->relid;\n\t\tAssert(relid != InvalidOid);\n\t\tcolnum = index->indexkeys[indexcol];\n\t\tvardata->rel = index->rel;\n\n\t\tif (get_relation_stats_hook &&\n\t\t\t(*get_relation_stats_hook) (root, rte, colnum, vardata))\n\t\t{\n\t\t\t/*\n\t\t\t * The hook took control of acquiring a stats tuple.  If it did\n\t\t\t * supply a tuple, it'd better have supplied a freefunc.\n\t\t\t */\n\t\t\tif (HeapTupleIsValid(vardata->statsTuple) &&\n\t\t\t\t!vardata->freefunc)\n\t\t\t\telog(ERROR, \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:6621\u20136635", "paragraphs": []}, {"code": "\n\t\t/* attempt to lookup stats in relation for this index column */\n\t\tif (attnum != 0)\n\t\t{\n\t\t\t/* Simple variable -- look to stats for the underlying table */\n\t\t\tif (get_relation_stats_hook &&\n\t\t\t\t(*get_relation_stats_hook) (root, rte, attnum, &vardata))\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t * The hook took control of acquiring a stats tuple.  If it\n\t\t\t\t * did supply a tuple, it'd better have supplied a freefunc.\n\t\t\t\t */\n\t\t\t\tif (HeapTupleIsValid(vardata.statsTuple) && !vardata.freefunc)\n\t\t\t\t\telog(ERROR,\n\t\t\t\t\t\t \"no function provided to release variable stats with\");", "title": "Core call context: src/backend/utils/adt/selfuncs.c:9150\u20139164", "paragraphs": []}], "signature": "typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root, RangeTblEntry *rte, AttrNumber attnum, VariableStatData *vardata);\nextern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;", "description": ["Hooks for plugins to get control when we ask for stats"]}}, "content_hash": "ac1568d690af48273e0bf228c6febb6054261afb5f9e0ddae42db5701d43d577", "imported_at": "2026-09-27T09:57:58.898", "url": "/wiki/hook/get_relation_stats_hook/?v=18", "cells": [{"major": "10", "state": "present", "label": "Recorded", "title": "PostgreSQL 10 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=10"}, {"major": "11", "state": "present", "label": "Recorded", "title": "PostgreSQL 11 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=11"}, {"major": "12", "state": "present", "label": "Recorded", "title": "PostgreSQL 12 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=12"}, {"major": "13", "state": "present", "label": "Recorded", "title": "PostgreSQL 13 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=13"}, {"major": "14", "state": "present", "label": "Recorded", "title": "PostgreSQL 14 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=14"}, {"major": "15", "state": "present", "label": "Recorded", "title": "PostgreSQL 15 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=15"}, {"major": "16", "state": "present", "label": "Recorded", "title": "PostgreSQL 16 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=16"}, {"major": "17", "state": "present", "label": "Recorded", "title": "PostgreSQL 17 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=17"}, {"major": "18", "state": "present", "label": "Recorded", "title": "PostgreSQL 18 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=18"}, {"major": "19", "state": "present", "label": "Recorded", "title": "PostgreSQL 19 Beta 4 \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=19"}, {"major": "20", "state": "present", "label": "Recorded", "title": "PostgreSQL 20 devel \u00b7 Recorded", "url": "/wiki/hook/get_relation_stats_hook/?v=20"}], "present": true}], "total": 39, "present": 34, "collection_tables": []}