{"kind": "decode", "major": "18", "item": {"slug": "test_decoding", "name": "test_decoding", "name_zh": "Testing and examples", "category": "\u6d4b\u8bd5\u4e0e\u793a\u4f8b", "summary": "\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002", "aliases": [], "content_hash": "df62bf7043057a7b6151bc581fd3c04e9c14ec24c52a6df985f4492f9dd98d06", "versions": {"10": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "7"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "\u672a\u767b\u8bb0"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/10/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 10.23 source archive", "label": "10.23", "major": "10", "channel": "historical", "revision": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9", "source_url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/10/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 10 English manual", "sha256": "8463836c180cf30bf33dff157110defa581019d9da4064a80d6571b4e97ce8ce", "language": "en", "original_url": "/docs/10/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v10.23/postgresql-10.23.tar.bz2", "line": 81, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:81", "sha256": "337c1ad2052f53684ee0bba7e6e1f31312caa1f26a27c641b6d69ff157329bba", "archive_sha256": "94a4b2528372458e5662c18d406629266667c437198160a18cdfd2c4a4d6eee9"}, {"url": "https://pg.center/docs/10/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 10 English manual", "sha256": "c023fc2750375bbd45d810f49639e224a847e4ee32db70bdc154b26c397498bc", "language": "en", "original_url": "/docs/10/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tAssertVariableIsOfType(&_PG_output_plugin_init, LogicalOutputPluginInit);\n\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "filter_by_origin_cb": "pg_decode_filter"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\">F.41.\u00a0test_decoding</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre></div>", "manual_path": "/docs/10/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/10/test-decoding.html", "method": "same-major semantic node", "sha256": "2e5452e1d746f0feb34068b66043f77a575b835d032acde46863dc9a2d2d3ba1", "language": "zh", "matched_nodes": ["#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]"]}], "language": "zh", "original_text": {"/versions/10/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/10/facts/0/label": "Interface family", "/versions/10/facts/0/value": "Logical-decoding output plugin", "/versions/10/facts/1/label": "Handler or routine", "/versions/10/facts/2/label": "Recorded callbacks", "/versions/10/tables/0/title": "Registered interface handlers", "/versions/10/tables/1/title": "Option names recognized by this plugin build", "/versions/10/related/0/label": "Logical decoding output interface", "/versions/10/related/1/label": "Existing extension catalogue identity", "/versions/10/sections/0/title": "Interface and capability boundaries", "/versions/10/sections/1/title": "Output and protocol boundaries", "/versions/10/sections/2/title": "Registered implementation in core source", "/versions/10/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/10/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/10/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/10/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/10/tables/0/rows/3/state": "No handler registered in this build", "/versions/10/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/10/tables/0/rows/5/state": "No handler registered in this build", "/versions/10/tables/0/rows/6/state": "No handler registered in this build", "/versions/10/tables/0/rows/7/state": "No handler registered in this build", "/versions/10/tables/0/rows/8/state": "No handler registered in this build", "/versions/10/tables/0/rows/9/state": "No handler registered in this build", "/versions/10/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/10/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/10/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/10/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/10/tables/0/rows/0/feature": "Begin transaction", "/versions/10/tables/0/rows/1/feature": "Row changes", "/versions/10/tables/0/rows/4/feature": "Logical messages", "/versions/10/tables/0/rows/5/feature": "Start streamed transaction", "/versions/10/tables/0/rows/6/feature": "Stream row changes", "/versions/10/tables/0/rows/7/feature": "Prepare transaction", "/versions/10/tables/0/rows/8/feature": "Commit prepared", "/versions/10/tables/0/rows/9/feature": "Rollback prepared", "/versions/10/tables/0/columns/0/label": "Interface operation", "/versions/10/tables/0/columns/1/label": "Source observation", "/versions/10/tables/0/columns/2/label": "Callback", "/versions/10/tables/0/columns/3/label": "Implementation", "/versions/10/tables/1/columns/0/label": "Source option name", "/versions/10/tables/0/rows/3/implementation": "Not registered", "/versions/10/tables/0/rows/5/implementation": "Not registered", "/versions/10/tables/0/rows/6/implementation": "Not registered", "/versions/10/tables/0/rows/7/implementation": "Not registered", "/versions/10/tables/0/rows/8/implementation": "Not registered", "/versions/10/tables/0/rows/9/implementation": "Not registered"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "1ee7301534f63c1db0f0161b9cadb9ff585901d954a0743e3f1298c0b95e792c"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "filter_by_origin_cb": "pg_decode_filter"}, "source_options": ["force-binary", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts"], "protocol_versions": {}}, "comparison_hash": "bcccdd6dcf62a1e1dc0e1e7c1ae3ad087f88d5bd0e2940ce85a291271f7a9a16", "manual_language": "zh", "runtime_verified": false}, "11": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "8"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "\u672a\u767b\u8bb0"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/11/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 11.22 source archive", "label": "11.22", "major": "11", "channel": "historical", "revision": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0", "source_url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/11/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 11 English manual", "sha256": "9eec639bc68c06e84b15a821ea3c81238313936af94eda0b43abadb68fcff541", "language": "en", "original_url": "/docs/11/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v11.22/postgresql-11.22.tar.bz2", "line": 75, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:75", "sha256": "88cd177db67c0eea08efe94aeaded0c678f4f474d34156558acc43f61e98305d", "archive_sha256": "2cb7c97d7a0d7278851bbc9c61f467b69c094c72b81740b751108e7892ebe1f0"}, {"url": "https://pg.center/docs/11/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 11 English manual", "sha256": "69b72c5a11a8905c173c8db4a5322f1d58e7876cbc706c7f4feb99402b6ab274", "language": "en", "original_url": "/docs/11/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tAssertVariableIsOfType(&_PG_output_plugin_init, LogicalOutputPluginInit);\n\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "filter_by_origin_cb": "pg_decode_filter"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\">F.40.\u00a0test_decoding</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n</div>", "manual_path": "/docs/11/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/11/test-decoding.html", "method": "same-major semantic node", "sha256": "ebb203bfdbc78ef35cbf1d37820e9bfa26128e6e751de566884b167443399604", "language": "zh", "matched_nodes": ["#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]"]}], "language": "zh", "original_text": {"/versions/11/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/11/facts/0/label": "Interface family", "/versions/11/facts/0/value": "Logical-decoding output plugin", "/versions/11/facts/1/label": "Handler or routine", "/versions/11/facts/2/label": "Recorded callbacks", "/versions/11/tables/0/title": "Registered interface handlers", "/versions/11/tables/1/title": "Option names recognized by this plugin build", "/versions/11/related/0/label": "Logical decoding output interface", "/versions/11/related/1/label": "Existing extension catalogue identity", "/versions/11/sections/0/title": "Interface and capability boundaries", "/versions/11/sections/1/title": "Output and protocol boundaries", "/versions/11/sections/2/title": "Registered implementation in core source", "/versions/11/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/11/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/11/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/11/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/11/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/11/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/11/tables/0/rows/5/state": "No handler registered in this build", "/versions/11/tables/0/rows/6/state": "No handler registered in this build", "/versions/11/tables/0/rows/7/state": "No handler registered in this build", "/versions/11/tables/0/rows/8/state": "No handler registered in this build", "/versions/11/tables/0/rows/9/state": "No handler registered in this build", "/versions/11/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/11/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/11/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/11/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/11/tables/0/rows/0/feature": "Begin transaction", "/versions/11/tables/0/rows/1/feature": "Row changes", "/versions/11/tables/0/rows/4/feature": "Logical messages", "/versions/11/tables/0/rows/5/feature": "Start streamed transaction", "/versions/11/tables/0/rows/6/feature": "Stream row changes", "/versions/11/tables/0/rows/7/feature": "Prepare transaction", "/versions/11/tables/0/rows/8/feature": "Commit prepared", "/versions/11/tables/0/rows/9/feature": "Rollback prepared", "/versions/11/tables/0/columns/0/label": "Interface operation", "/versions/11/tables/0/columns/1/label": "Source observation", "/versions/11/tables/0/columns/2/label": "Callback", "/versions/11/tables/0/columns/3/label": "Implementation", "/versions/11/tables/1/columns/0/label": "Source option name", "/versions/11/tables/0/rows/5/implementation": "Not registered", "/versions/11/tables/0/rows/6/implementation": "Not registered", "/versions/11/tables/0/rows/7/implementation": "Not registered", "/versions/11/tables/0/rows/8/implementation": "Not registered", "/versions/11/tables/0/rows/9/implementation": "Not registered"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "b2b7bc039826cfa9552e5e30a75ef8f3fdf85c94a2a2f07a3a5066add4a42ecf"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "filter_by_origin_cb": "pg_decode_filter"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts"], "protocol_versions": {}}, "comparison_hash": "738ac0f40cbeb95cf50bf83c7406775489147586500a397873551a69cd860c02", "manual_language": "zh", "runtime_verified": false}, "12": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "8"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "\u672a\u767b\u8bb0"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/12/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 12.22 source archive", "label": "12.22", "major": "12", "channel": "historical", "revision": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b", "source_url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/12/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 12 English manual", "sha256": "8a5251bb67bc93fbb96494c450291dd5e68c288ed6dff442001ba8bb2539d739", "language": "en", "original_url": "/docs/12/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v12.22/postgresql-12.22.tar.bz2", "line": 75, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:75", "sha256": "52a8899e51065f8ef839720d7d675b79fb8a9a047bce1cd68aa037d0eaaf5f88", "archive_sha256": "8df3c0474782589d3c6f374b5133b1bd14d168086edbc13c6e72e67dd4527a3b"}, {"url": "https://pg.center/docs/12/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 12 English manual", "sha256": "996af632b11f48ee4f102c7b63c8bf6a2f0e2b6debc1bc76d34a27775c0556b1", "language": "en", "original_url": "/docs/12/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tAssertVariableIsOfType(&_PG_output_plugin_init, LogicalOutputPluginInit);\n\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "filter_by_origin_cb": "pg_decode_filter"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\">F.40.\u00a0test_decoding</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n</div>", "manual_path": "/docs/12/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/12/test-decoding.html", "method": "same-major semantic node", "sha256": "8965f05f68f895d247ba80fcabf5b3432b76357356f0dfeacbcc66200fff8601", "language": "zh", "matched_nodes": ["#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]"]}], "language": "zh", "original_text": {"/versions/12/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/12/facts/0/label": "Interface family", "/versions/12/facts/0/value": "Logical-decoding output plugin", "/versions/12/facts/1/label": "Handler or routine", "/versions/12/facts/2/label": "Recorded callbacks", "/versions/12/tables/0/title": "Registered interface handlers", "/versions/12/tables/1/title": "Option names recognized by this plugin build", "/versions/12/related/0/label": "Logical decoding output interface", "/versions/12/related/1/label": "Existing extension catalogue identity", "/versions/12/sections/0/title": "Interface and capability boundaries", "/versions/12/sections/1/title": "Output and protocol boundaries", "/versions/12/sections/2/title": "Registered implementation in core source", "/versions/12/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/12/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/12/tables/0/rows/5/state": "No handler registered in this build", "/versions/12/tables/0/rows/6/state": "No handler registered in this build", "/versions/12/tables/0/rows/7/state": "No handler registered in this build", "/versions/12/tables/0/rows/8/state": "No handler registered in this build", "/versions/12/tables/0/rows/9/state": "No handler registered in this build", "/versions/12/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/12/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/12/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/12/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/12/tables/0/rows/0/feature": "Begin transaction", "/versions/12/tables/0/rows/1/feature": "Row changes", "/versions/12/tables/0/rows/4/feature": "Logical messages", "/versions/12/tables/0/rows/5/feature": "Start streamed transaction", "/versions/12/tables/0/rows/6/feature": "Stream row changes", "/versions/12/tables/0/rows/7/feature": "Prepare transaction", "/versions/12/tables/0/rows/8/feature": "Commit prepared", "/versions/12/tables/0/rows/9/feature": "Rollback prepared", "/versions/12/tables/0/columns/0/label": "Interface operation", "/versions/12/tables/0/columns/1/label": "Source observation", "/versions/12/tables/0/columns/2/label": "Callback", "/versions/12/tables/0/columns/3/label": "Implementation", "/versions/12/tables/1/columns/0/label": "Source option name", "/versions/12/tables/0/rows/5/implementation": "Not registered", "/versions/12/tables/0/rows/6/implementation": "Not registered", "/versions/12/tables/0/rows/7/implementation": "Not registered", "/versions/12/tables/0/rows/8/implementation": "Not registered", "/versions/12/tables/0/rows/9/implementation": "Not registered"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "dfafd429a4e3d026194debe40b094de01afb3729de48ce31ae04ae1a1f30dc8c"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "filter_by_origin_cb": "pg_decode_filter"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts"], "protocol_versions": {}}, "comparison_hash": "738ac0f40cbeb95cf50bf83c7406775489147586500a397873551a69cd860c02", "manual_language": "zh", "runtime_verified": false}, "13": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "8"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "\u672a\u767b\u8bb0"}, {"state": "\u6b64\u6784\u5efa\u672a\u6ce8\u518c\u5904\u7406\u51fd\u6570", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "\u672a\u767b\u8bb0"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/13/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 13.23 source archive", "label": "13.23", "major": "13", "channel": "historical", "revision": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6", "source_url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/13/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 13 English manual", "sha256": "7c38cbe2595dbfd0a4064b94569bfb1d75b43adc1d59d7e86367966f22fd0f3b", "language": "en", "original_url": "/docs/13/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v13.23/postgresql-13.23.tar.bz2", "line": 75, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:75", "sha256": "621b7b48baa72c1e3f328108ebfeba6a64338df64e1eb5c2a72d3e41b0c0b3fb", "archive_sha256": "6ec3c82726af92b7dec873fa1cdf881eca92a4219787dfad05acb6b10e041fd6"}, {"url": "https://pg.center/docs/13/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 13 English manual", "sha256": "a9a536d274ad7fb994ae70df068b06da58b5077aca4ce86289ed07921baefd4f", "language": "en", "original_url": "/docs/13/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tAssertVariableIsOfType(&_PG_output_plugin_init, LogicalOutputPluginInit);\n\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "filter_by_origin_cb": "pg_decode_filter"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\">F.40.\u00a0test_decoding</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n</div>", "manual_path": "/docs/13/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/13/test-decoding.html", "method": "same-major semantic node", "sha256": "ee571ed24e678f626a8e8a4eb4ebe1450574db2c672040a8287b772f967364b7", "language": "zh", "matched_nodes": ["#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]"]}], "language": "zh", "original_text": {"/versions/13/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/13/facts/0/label": "Interface family", "/versions/13/facts/0/value": "Logical-decoding output plugin", "/versions/13/facts/1/label": "Handler or routine", "/versions/13/facts/2/label": "Recorded callbacks", "/versions/13/tables/0/title": "Registered interface handlers", "/versions/13/tables/1/title": "Option names recognized by this plugin build", "/versions/13/related/0/label": "Logical decoding output interface", "/versions/13/related/1/label": "Existing extension catalogue identity", "/versions/13/sections/0/title": "Interface and capability boundaries", "/versions/13/sections/1/title": "Output and protocol boundaries", "/versions/13/sections/2/title": "Registered implementation in core source", "/versions/13/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/13/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/13/tables/0/rows/5/state": "No handler registered in this build", "/versions/13/tables/0/rows/6/state": "No handler registered in this build", "/versions/13/tables/0/rows/7/state": "No handler registered in this build", "/versions/13/tables/0/rows/8/state": "No handler registered in this build", "/versions/13/tables/0/rows/9/state": "No handler registered in this build", "/versions/13/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/13/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/13/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/13/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/13/tables/0/rows/0/feature": "Begin transaction", "/versions/13/tables/0/rows/1/feature": "Row changes", "/versions/13/tables/0/rows/4/feature": "Logical messages", "/versions/13/tables/0/rows/5/feature": "Start streamed transaction", "/versions/13/tables/0/rows/6/feature": "Stream row changes", "/versions/13/tables/0/rows/7/feature": "Prepare transaction", "/versions/13/tables/0/rows/8/feature": "Commit prepared", "/versions/13/tables/0/rows/9/feature": "Rollback prepared", "/versions/13/tables/0/columns/0/label": "Interface operation", "/versions/13/tables/0/columns/1/label": "Source observation", "/versions/13/tables/0/columns/2/label": "Callback", "/versions/13/tables/0/columns/3/label": "Implementation", "/versions/13/tables/1/columns/0/label": "Source option name", "/versions/13/tables/0/rows/5/implementation": "Not registered", "/versions/13/tables/0/rows/6/implementation": "Not registered", "/versions/13/tables/0/rows/7/implementation": "Not registered", "/versions/13/tables/0/rows/8/implementation": "Not registered", "/versions/13/tables/0/rows/9/implementation": "Not registered"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "240c3c35aa429d6838c2ca03ac55426a2e1d697b9cea09fab6a83ccadc398828"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "filter_by_origin_cb": "pg_decode_filter"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts"], "protocol_versions": {}}, "comparison_hash": "738ac0f40cbeb95cf50bf83c7406775489147586500a397873551a69cd860c02", "manual_language": "zh", "runtime_verified": false}, "14": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "21"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "pg_decode_stream_start"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "pg_decode_stream_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "pg_decode_prepare_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "pg_decode_commit_prepared_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "pg_decode_rollback_prepared_txn"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}, {"name": "stream-changes"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/14/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 14.24 source archive", "label": "14.24", "major": "14", "channel": "stable", "revision": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897", "source_url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/14/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 14 English manual", "sha256": "585d75e17fe03157d1563f3ce13110b6a6768ff0db1b836e0fc490b59fcaa75d", "language": "en", "original_url": "/docs/14/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v14.24/postgresql-14.24.tar.bz2", "line": 133, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:133", "sha256": "4df3c026a3c1f82ac0e98cb4f1564e7fd81f33b6c22b81cdf42babb9bed322f0", "archive_sha256": "a7fa7ed3d558172355f51406097a7bd4f6b473be80f311ef7cda96bf383d8897"}, {"url": "https://pg.center/docs/14/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 14 English manual", "sha256": "8657a205ee5dc4698b76016d8df9f89a0aea844bdeaa5466b2308401ad6b6dc4", "language": "en", "original_url": "/docs/14/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tAssertVariableIsOfType(&_PG_output_plugin_init, LogicalOutputPluginInit);\n\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n\tcb->filter_prepare_cb = pg_decode_filter_prepare;\n\tcb->begin_prepare_cb = pg_decode_begin_prepare_txn;\n\tcb->prepare_cb = pg_decode_prepare_txn;\n\tcb->commit_prepared_cb = pg_decode_commit_prepared_txn;\n\tcb->rollback_prepared_cb = pg_decode_rollback_prepared_txn;\n\tcb->stream_start_cb = pg_decode_stream_start;\n\tcb->stream_stop_cb = pg_decode_stream_stop;\n\tcb->stream_abort_cb = pg_decode_stream_abort;\n\tcb->stream_prepare_cb = pg_decode_stream_prepare;\n\tcb->stream_commit_cb = pg_decode_stream_commit;\n\tcb->stream_change_cb = pg_decode_stream_change;\n\tcb->stream_message_cb = pg_decode_stream_message;\n\tcb->stream_truncate_cb = pg_decode_stream_truncate;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\">F.42.\u00a0test_decoding</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n<p lang=\"zh\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u83b7\u53d6\u8fdb\u884c\u4e2d\u4e8b\u52a1\u7684\u53d8\u66f4\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');\n    lsn    | xid |                       data                       \n-----------+-----+--------------------------------------------------\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | streaming change for TXN 503\n 0/16B2300 | 503 | streaming change for TXN 503\n 0/16B2408 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16BECA8 | 503 | streaming change for TXN 503\n 0/16BEDB0 | 503 | streaming change for TXN 503\n 0/16BEEB8 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n(10 rows)\n</pre>\n</div>", "manual_path": "/docs/14/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/14/test-decoding.html", "method": "same-major semantic node", "sha256": "7ad847b3040f806655624ec84b42ae986e3cd8a403ec496b24399deb9b50289f", "language": "zh", "matched_nodes": ["#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]", "#TEST-DECODING/p[6]"]}], "language": "zh", "original_text": {"/versions/14/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/14/facts/0/label": "Interface family", "/versions/14/facts/0/value": "Logical-decoding output plugin", "/versions/14/facts/1/label": "Handler or routine", "/versions/14/facts/2/label": "Recorded callbacks", "/versions/14/tables/0/title": "Registered interface handlers", "/versions/14/tables/1/title": "Option names recognized by this plugin build", "/versions/14/related/0/label": "Logical decoding output interface", "/versions/14/related/1/label": "Existing extension catalogue identity", "/versions/14/sections/0/title": "Interface and capability boundaries", "/versions/14/sections/1/title": "Output and protocol boundaries", "/versions/14/sections/2/title": "Registered implementation in core source", "/versions/14/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/14/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/14/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/14/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/14/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/14/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/14/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/14/tables/0/rows/0/feature": "Begin transaction", "/versions/14/tables/0/rows/1/feature": "Row changes", "/versions/14/tables/0/rows/4/feature": "Logical messages", "/versions/14/tables/0/rows/5/feature": "Start streamed transaction", "/versions/14/tables/0/rows/6/feature": "Stream row changes", "/versions/14/tables/0/rows/7/feature": "Prepare transaction", "/versions/14/tables/0/rows/8/feature": "Commit prepared", "/versions/14/tables/0/rows/9/feature": "Rollback prepared", "/versions/14/tables/0/columns/0/label": "Interface operation", "/versions/14/tables/0/columns/1/label": "Source observation", "/versions/14/tables/0/columns/2/label": "Callback", "/versions/14/tables/0/columns/3/label": "Implementation", "/versions/14/tables/1/columns/0/label": "Source option name"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "68d013405cecdf784b209e05a449f07ab4ec6581afcf7f94ae76a0a5e72ede8c"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts", "stream-changes"], "protocol_versions": {}}, "comparison_hash": "465d2c6d5759db47dd963a4b8f5bcb847943413cfd5afb7eb4fd0bd7b894b83e", "manual_language": "zh", "runtime_verified": false}, "15": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "21"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "pg_decode_stream_start"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "pg_decode_stream_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "pg_decode_prepare_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "pg_decode_commit_prepared_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "pg_decode_rollback_prepared_txn"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}, {"name": "stream-changes"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/15/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 15.19 source archive", "label": "15.19", "major": "15", "channel": "stable", "revision": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89", "source_url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/15/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 15 English manual", "sha256": "07650e2734f3133b733d634e59776611445c52edbddd58e6a4c89a69b7750587", "language": "en", "original_url": "/docs/15/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v15.19/postgresql-15.19.tar.bz2", "line": 133, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:133", "sha256": "61e388a9e86a9443ffdf5c007299ef43a51df1c16ef95c72113e118221e7a85d", "archive_sha256": "e1a64a87a46b825b88c082e4518161a47aab53c45694964f8ba1df28f7859f89"}, {"url": "https://pg.center/docs/15/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 15 English manual", "sha256": "6c81b3b643e0a8f47dc1a136953fb61d57b48434a3c8aa7393b06dae440406a5", "language": "en", "original_url": "/docs/15/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tAssertVariableIsOfType(&_PG_output_plugin_init, LogicalOutputPluginInit);\n\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n\tcb->filter_prepare_cb = pg_decode_filter_prepare;\n\tcb->begin_prepare_cb = pg_decode_begin_prepare_txn;\n\tcb->prepare_cb = pg_decode_prepare_txn;\n\tcb->commit_prepared_cb = pg_decode_commit_prepared_txn;\n\tcb->rollback_prepared_cb = pg_decode_rollback_prepared_txn;\n\tcb->stream_start_cb = pg_decode_stream_start;\n\tcb->stream_stop_cb = pg_decode_stream_stop;\n\tcb->stream_abort_cb = pg_decode_stream_abort;\n\tcb->stream_prepare_cb = pg_decode_stream_prepare;\n\tcb->stream_commit_cb = pg_decode_stream_commit;\n\tcb->stream_change_cb = pg_decode_stream_change;\n\tcb->stream_message_cb = pg_decode_stream_message;\n\tcb->stream_truncate_cb = pg_decode_stream_truncate;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\">F.45.\u00a0test_decoding</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n<p lang=\"zh\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u83b7\u53d6\u8fdb\u884c\u4e2d\u4e8b\u52a1\u7684\u53d8\u66f4\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');\n    lsn    | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | streaming change for TXN 503\n 0/16B2300 | 503 | streaming change for TXN 503\n 0/16B2408 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16BECA8 | 503 | streaming change for TXN 503\n 0/16BEDB0 | 503 | streaming change for TXN 503\n 0/16BEEB8 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n(10 rows)\n</pre>\n</div>", "manual_path": "/docs/15/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/15/test-decoding.html", "method": "same-major semantic node", "sha256": "0eca2c54ecd584b68aef23e731a886d485b80aac01e9f6fd4a7d961ae05fecfc", "language": "zh", "matched_nodes": ["#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]", "#TEST-DECODING/p[6]"]}], "language": "zh", "original_text": {"/versions/15/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/15/facts/0/label": "Interface family", "/versions/15/facts/0/value": "Logical-decoding output plugin", "/versions/15/facts/1/label": "Handler or routine", "/versions/15/facts/2/label": "Recorded callbacks", "/versions/15/tables/0/title": "Registered interface handlers", "/versions/15/tables/1/title": "Option names recognized by this plugin build", "/versions/15/related/0/label": "Logical decoding output interface", "/versions/15/related/1/label": "Existing extension catalogue identity", "/versions/15/sections/0/title": "Interface and capability boundaries", "/versions/15/sections/1/title": "Output and protocol boundaries", "/versions/15/sections/2/title": "Registered implementation in core source", "/versions/15/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/15/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/15/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/15/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/15/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/15/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/15/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/15/tables/0/rows/0/feature": "Begin transaction", "/versions/15/tables/0/rows/1/feature": "Row changes", "/versions/15/tables/0/rows/4/feature": "Logical messages", "/versions/15/tables/0/rows/5/feature": "Start streamed transaction", "/versions/15/tables/0/rows/6/feature": "Stream row changes", "/versions/15/tables/0/rows/7/feature": "Prepare transaction", "/versions/15/tables/0/rows/8/feature": "Commit prepared", "/versions/15/tables/0/rows/9/feature": "Rollback prepared", "/versions/15/tables/0/columns/0/label": "Interface operation", "/versions/15/tables/0/columns/1/label": "Source observation", "/versions/15/tables/0/columns/2/label": "Callback", "/versions/15/tables/0/columns/3/label": "Implementation", "/versions/15/tables/1/columns/0/label": "Source option name"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "44d31ec9332b21da21baed3f17f21b34e41944a9ff9be0e8a2622711555f1689"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts", "stream-changes"], "protocol_versions": {}}, "comparison_hash": "465d2c6d5759db47dd963a4b8f5bcb847943413cfd5afb7eb4fd0bd7b894b83e", "manual_language": "zh", "runtime_verified": false}, "16": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "21"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "pg_decode_stream_start"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "pg_decode_stream_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "pg_decode_prepare_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "pg_decode_commit_prepared_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "pg_decode_rollback_prepared_txn"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}, {"name": "stream-changes"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/16/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 16.15 source archive", "label": "16.15", "major": "16", "channel": "stable", "revision": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed", "source_url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/16/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 16 English manual", "sha256": "5fe87919271068465a6dda1585f5c4b029c1b93f91d2d27d3130a53fb50ecd55", "language": "en", "original_url": "/docs/16/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v16.15/postgresql-16.15.tar.bz2", "line": 129, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:129", "sha256": "3635be9b98bdb50351c64e77f685110e78f5c02f9f8ca87815d9795ad871badd", "archive_sha256": "c1575341fa7bd40f5274ea465b34390f4dc64cdd0770af327005caaeb9f6b7ed"}, {"url": "https://pg.center/docs/16/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 16 English manual", "sha256": "c093330981ad988f2081ad6ac1eb74b0c8ab7fbc19928ca50e12fcdfe7647a4f", "language": "en", "original_url": "/docs/16/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n\tcb->filter_prepare_cb = pg_decode_filter_prepare;\n\tcb->begin_prepare_cb = pg_decode_begin_prepare_txn;\n\tcb->prepare_cb = pg_decode_prepare_txn;\n\tcb->commit_prepared_cb = pg_decode_commit_prepared_txn;\n\tcb->rollback_prepared_cb = pg_decode_rollback_prepared_txn;\n\tcb->stream_start_cb = pg_decode_stream_start;\n\tcb->stream_stop_cb = pg_decode_stream_stop;\n\tcb->stream_abort_cb = pg_decode_stream_abort;\n\tcb->stream_prepare_cb = pg_decode_stream_prepare;\n\tcb->stream_commit_cb = pg_decode_stream_commit;\n\tcb->stream_change_cb = pg_decode_stream_change;\n\tcb->stream_message_cb = pg_decode_stream_message;\n\tcb->stream_truncate_cb = pg_decode_stream_truncate;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\n<div>\n<div>\n<h2 class=\"title\" style=\"clear: both\">F.45.\u00a0test_decoding \u2014 \u7528\u4e8e WAL \u903b\u8f91\u89e3\u7801\u7684\u57fa\u4e8e SQL \u7684\u6d4b\u8bd5/\u793a\u4f8b\u6a21\u5757 </h2>\n</div>\n</div>\n</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n<p lang=\"zh\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u83b7\u53d6\u8fdb\u884c\u4e2d\u4e8b\u52a1\u7684\u53d8\u66f4\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');\n    lsn    | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | streaming change for TXN 503\n 0/16B2300 | 503 | streaming change for TXN 503\n 0/16B2408 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16BECA8 | 503 | streaming change for TXN 503\n 0/16BEDB0 | 503 | streaming change for TXN 503\n 0/16BEEB8 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n(10 rows)\n</pre>\n</div>", "manual_path": "/docs/16/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/16/test-decoding.html", "method": "same-major semantic node", "sha256": "f1b81e128e65a37ed99d476a26937157a52c0562feeed6e3ce922237c91dfb74", "language": "zh", "matched_nodes": ["#TEST-DECODING/div[0]", "#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]", "#TEST-DECODING/p[6]"]}], "language": "zh", "original_text": {"/versions/16/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/16/facts/0/label": "Interface family", "/versions/16/facts/0/value": "Logical-decoding output plugin", "/versions/16/facts/1/label": "Handler or routine", "/versions/16/facts/2/label": "Recorded callbacks", "/versions/16/tables/0/title": "Registered interface handlers", "/versions/16/tables/1/title": "Option names recognized by this plugin build", "/versions/16/related/0/label": "Logical decoding output interface", "/versions/16/related/1/label": "Existing extension catalogue identity", "/versions/16/sections/0/title": "Interface and capability boundaries", "/versions/16/sections/1/title": "Output and protocol boundaries", "/versions/16/sections/2/title": "Registered implementation in core source", "/versions/16/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/16/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/16/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/16/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/16/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/16/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/16/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/16/tables/0/rows/0/feature": "Begin transaction", "/versions/16/tables/0/rows/1/feature": "Row changes", "/versions/16/tables/0/rows/4/feature": "Logical messages", "/versions/16/tables/0/rows/5/feature": "Start streamed transaction", "/versions/16/tables/0/rows/6/feature": "Stream row changes", "/versions/16/tables/0/rows/7/feature": "Prepare transaction", "/versions/16/tables/0/rows/8/feature": "Commit prepared", "/versions/16/tables/0/rows/9/feature": "Rollback prepared", "/versions/16/tables/0/columns/0/label": "Interface operation", "/versions/16/tables/0/columns/1/label": "Source observation", "/versions/16/tables/0/columns/2/label": "Callback", "/versions/16/tables/0/columns/3/label": "Implementation", "/versions/16/tables/1/columns/0/label": "Source option name"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "a497c98fccfb15f8bbb0aea3106c5d5c16a55b3d248106ffbdf2b958284d4893"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts", "stream-changes"], "protocol_versions": {}}, "comparison_hash": "465d2c6d5759db47dd963a4b8f5bcb847943413cfd5afb7eb4fd0bd7b894b83e", "manual_language": "zh", "runtime_verified": false}, "17": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "21"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "pg_decode_stream_start"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "pg_decode_stream_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "pg_decode_prepare_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "pg_decode_commit_prepared_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "pg_decode_rollback_prepared_txn"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}, {"name": "stream-changes"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/17/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 17.11 source archive", "label": "17.11", "major": "17", "channel": "stable", "revision": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979", "source_url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/17/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 17 English manual", "sha256": "f7efc73343523984dedbc7bb8a71e3d3c110fc90f5f6340893757c65ceeb27d3", "language": "en", "original_url": "/docs/17/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.bz2", "line": 129, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:129", "sha256": "35b7df261959d783ac7d1bbaea15044aa55da32b3b3b1c7f259dbc21ece73296", "archive_sha256": "dd27f2b3c59e73ed14aa3324901242bf69a032a6347805f274e6260322d42979"}, {"url": "https://pg.center/docs/17/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 17 English manual", "sha256": "2be04efbf0e2c4266665b8e7b8ebbc04a92456d3fcfdfe2667e8e4486bd70be8", "language": "en", "original_url": "/docs/17/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n\tcb->filter_prepare_cb = pg_decode_filter_prepare;\n\tcb->begin_prepare_cb = pg_decode_begin_prepare_txn;\n\tcb->prepare_cb = pg_decode_prepare_txn;\n\tcb->commit_prepared_cb = pg_decode_commit_prepared_txn;\n\tcb->rollback_prepared_cb = pg_decode_rollback_prepared_txn;\n\tcb->stream_start_cb = pg_decode_stream_start;\n\tcb->stream_stop_cb = pg_decode_stream_stop;\n\tcb->stream_abort_cb = pg_decode_stream_abort;\n\tcb->stream_prepare_cb = pg_decode_stream_prepare;\n\tcb->stream_commit_cb = pg_decode_stream_commit;\n\tcb->stream_change_cb = pg_decode_stream_change;\n\tcb->stream_message_cb = pg_decode_stream_message;\n\tcb->stream_truncate_cb = pg_decode_stream_truncate;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\n<div>\n<div>\n<h2 class=\"title\" style=\"clear: both\">F.43.\u00a0test_decoding \u2014 \u7528\u4e8e WAL \u903b\u8f91\u89e3\u7801\u7684\u57fa\u4e8e SQL \u7684\u6d4b\u8bd5/\u793a\u4f8b\u6a21\u5757 </h2>\n</div>\n</div>\n</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n<p lang=\"zh\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u83b7\u53d6\u8fdb\u884c\u4e2d\u4e8b\u52a1\u7684\u53d8\u66f4\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');\n    lsn    | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | streaming change for TXN 503\n 0/16B2300 | 503 | streaming change for TXN 503\n 0/16B2408 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16BECA8 | 503 | streaming change for TXN 503\n 0/16BEDB0 | 503 | streaming change for TXN 503\n 0/16BEEB8 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n(10 rows)\n</pre>\n</div>", "manual_path": "/docs/17/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/17/test-decoding.html", "method": "same-major semantic node", "sha256": "dbd932446be033d4262d82b0429b485266c318e1fe7d3d77fddb088295b36891", "language": "zh", "matched_nodes": ["#TEST-DECODING/div[0]", "#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]", "#TEST-DECODING/p[6]"]}], "language": "zh", "original_text": {"/versions/17/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/17/facts/0/label": "Interface family", "/versions/17/facts/0/value": "Logical-decoding output plugin", "/versions/17/facts/1/label": "Handler or routine", "/versions/17/facts/2/label": "Recorded callbacks", "/versions/17/tables/0/title": "Registered interface handlers", "/versions/17/tables/1/title": "Option names recognized by this plugin build", "/versions/17/related/0/label": "Logical decoding output interface", "/versions/17/related/1/label": "Existing extension catalogue identity", "/versions/17/sections/0/title": "Interface and capability boundaries", "/versions/17/sections/1/title": "Output and protocol boundaries", "/versions/17/sections/2/title": "Registered implementation in core source", "/versions/17/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/17/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/17/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/17/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/17/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/17/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/17/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/17/tables/0/rows/0/feature": "Begin transaction", "/versions/17/tables/0/rows/1/feature": "Row changes", "/versions/17/tables/0/rows/4/feature": "Logical messages", "/versions/17/tables/0/rows/5/feature": "Start streamed transaction", "/versions/17/tables/0/rows/6/feature": "Stream row changes", "/versions/17/tables/0/rows/7/feature": "Prepare transaction", "/versions/17/tables/0/rows/8/feature": "Commit prepared", "/versions/17/tables/0/rows/9/feature": "Rollback prepared", "/versions/17/tables/0/columns/0/label": "Interface operation", "/versions/17/tables/0/columns/1/label": "Source observation", "/versions/17/tables/0/columns/2/label": "Callback", "/versions/17/tables/0/columns/3/label": "Implementation", "/versions/17/tables/1/columns/0/label": "Source option name"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "f3e0ea54524cc1c74d1cdb1e3a5e098da307ce443c348cb11798ce5ebff11eca"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts", "stream-changes"], "protocol_versions": {}}, "comparison_hash": "465d2c6d5759db47dd963a4b8f5bcb847943413cfd5afb7eb4fd0bd7b894b83e", "manual_language": "zh", "runtime_verified": false}, "18": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "21"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "pg_decode_stream_start"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "pg_decode_stream_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "pg_decode_prepare_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "pg_decode_commit_prepared_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "pg_decode_rollback_prepared_txn"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}, {"name": "stream-changes"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/18/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 18.6 source archive", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/18/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 18 English manual", "sha256": "630f953dd8c232a410627e4993be253b13665bb1b04ca1be26c871afd7c3eebe", "language": "en", "original_url": "/docs/18/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 132, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:132", "sha256": "3110af5e2b768a3311f20a32ac9d90c7a18f437e0ceaef69fbee51cc28900357", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 18 English manual", "sha256": "e5b3d13adfcc9e33f24524cb09d93eb91a1292fdb3124234002ccccf93f45738", "language": "en", "original_url": "/docs/18/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n\tcb->filter_prepare_cb = pg_decode_filter_prepare;\n\tcb->begin_prepare_cb = pg_decode_begin_prepare_txn;\n\tcb->prepare_cb = pg_decode_prepare_txn;\n\tcb->commit_prepared_cb = pg_decode_commit_prepared_txn;\n\tcb->rollback_prepared_cb = pg_decode_rollback_prepared_txn;\n\tcb->stream_start_cb = pg_decode_stream_start;\n\tcb->stream_stop_cb = pg_decode_stream_stop;\n\tcb->stream_abort_cb = pg_decode_stream_abort;\n\tcb->stream_prepare_cb = pg_decode_stream_prepare;\n\tcb->stream_commit_cb = pg_decode_stream_commit;\n\tcb->stream_change_cb = pg_decode_stream_change;\n\tcb->stream_message_cb = pg_decode_stream_message;\n\tcb->stream_truncate_cb = pg_decode_stream_truncate;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\n<div>\n<div>\n<h2 class=\"title\" style=\"clear: both\">F.45.\u00a0test_decoding \u2014 \u7528\u4e8e WAL \u903b\u8f91\u89e3\u7801\u7684\u57fa\u4e8e SQL \u7684\u6d4b\u8bd5/\u793a\u4f8b\u6a21\u5757 </h2>\n</div>\n</div>\n</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n<p lang=\"zh\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u83b7\u53d6\u8fdb\u884c\u4e2d\u4e8b\u52a1\u7684\u53d8\u66f4\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');\n    lsn    | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | streaming change for TXN 503\n 0/16B2300 | 503 | streaming change for TXN 503\n 0/16B2408 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16BECA8 | 503 | streaming change for TXN 503\n 0/16BEDB0 | 503 | streaming change for TXN 503\n 0/16BEEB8 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n(10 rows)\n</pre>\n</div>", "manual_path": "/docs/18/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/18/test-decoding.html", "method": "same-major semantic node", "sha256": "51dbf85146860d160206a6e6a461c169a8ab0784b8c20f1723352193d4e4bc81", "language": "zh", "matched_nodes": ["#TEST-DECODING/div[0]", "#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]", "#TEST-DECODING/p[6]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/18/facts/0/label": "Interface family", "/versions/18/facts/0/value": "Logical-decoding output plugin", "/versions/18/facts/1/label": "Handler or routine", "/versions/18/facts/2/label": "Recorded callbacks", "/versions/18/tables/0/title": "Registered interface handlers", "/versions/18/tables/1/title": "Option names recognized by this plugin build", "/versions/18/related/0/label": "Logical decoding output interface", "/versions/18/related/1/label": "Existing extension catalogue identity", "/versions/18/sections/0/title": "Interface and capability boundaries", "/versions/18/sections/1/title": "Output and protocol boundaries", "/versions/18/sections/2/title": "Registered implementation in core source", "/versions/18/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/18/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/18/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/18/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/18/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/18/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/18/tables/0/rows/0/feature": "Begin transaction", "/versions/18/tables/0/rows/1/feature": "Row changes", "/versions/18/tables/0/rows/4/feature": "Logical messages", "/versions/18/tables/0/rows/5/feature": "Start streamed transaction", "/versions/18/tables/0/rows/6/feature": "Stream row changes", "/versions/18/tables/0/rows/7/feature": "Prepare transaction", "/versions/18/tables/0/rows/8/feature": "Commit prepared", "/versions/18/tables/0/rows/9/feature": "Rollback prepared", "/versions/18/tables/0/columns/0/label": "Interface operation", "/versions/18/tables/0/columns/1/label": "Source observation", "/versions/18/tables/0/columns/2/label": "Callback", "/versions/18/tables/0/columns/3/label": "Implementation", "/versions/18/tables/1/columns/0/label": "Source option name"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "3eee67f5ac58cf2808ec3ce9e551f64adbecc41ccc907560e08b83dcf7c5cb25"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts", "stream-changes"], "protocol_versions": {}}, "comparison_hash": "465d2c6d5759db47dd963a4b8f5bcb847943413cfd5afb7eb4fd0bd7b894b83e", "manual_language": "zh", "runtime_verified": false}, "19": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "21"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "pg_decode_stream_start"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "pg_decode_stream_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "pg_decode_prepare_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "pg_decode_commit_prepared_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "pg_decode_rollback_prepared_txn"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}, {"name": "stream-changes"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/19/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 19beta4 source archive", "label": "19beta4", "major": "19", "channel": "preview", "revision": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86", "source_url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/19/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 19 English manual", "sha256": "bb8605063120a337d288fbdb033cdab716d51547e117a5bbc0ee48a24c057d1f", "language": "en", "original_url": "/docs/19/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v19beta4/postgresql-19beta4.tar.bz2", "line": 132, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:132", "sha256": "71ab00d5b820393edf509b78cae7b01df29b8318aaefa2cf234c82f43c78463a", "archive_sha256": "83157ee9c599d03b2f7a3d73ef3a56ec24e0e79cc2b3501a64d1364f56398c86"}, {"url": "https://pg.center/docs/19/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 19 English manual", "sha256": "5bbd383a295ed5cdb65b99d721fb7320aafdb7a343b26abbcb022134635d5ff7", "language": "en", "original_url": "/docs/19/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n\tcb->filter_prepare_cb = pg_decode_filter_prepare;\n\tcb->begin_prepare_cb = pg_decode_begin_prepare_txn;\n\tcb->prepare_cb = pg_decode_prepare_txn;\n\tcb->commit_prepared_cb = pg_decode_commit_prepared_txn;\n\tcb->rollback_prepared_cb = pg_decode_rollback_prepared_txn;\n\tcb->stream_start_cb = pg_decode_stream_start;\n\tcb->stream_stop_cb = pg_decode_stream_stop;\n\tcb->stream_abort_cb = pg_decode_stream_abort;\n\tcb->stream_prepare_cb = pg_decode_stream_prepare;\n\tcb->stream_commit_cb = pg_decode_stream_commit;\n\tcb->stream_change_cb = pg_decode_stream_change;\n\tcb->stream_message_cb = pg_decode_stream_message;\n\tcb->stream_truncate_cb = pg_decode_stream_truncate;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\n<div>\n<div>\n<h2 class=\"title\" style=\"clear: both\">F.47.\u00a0test_decoding \u2014 \u7528\u4e8e WAL \u903b\u8f91\u89e3\u7801\u7684\u57fa\u4e8e SQL \u7684\u6d4b\u8bd5/\u793a\u4f8b\u6a21\u5757 </h2>\n</div>\n</div>\n</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n    lsn     | xid |                       data\n------------+-----+--------------------------------------------------\n 0/016D30F8 | 691 | BEGIN\n 0/016D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/016D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/016D32A0 | 691 | COMMIT\n 0/016D32D8 | 692 | BEGIN\n 0/016D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/016D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/016D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n<p lang=\"zh\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u83b7\u53d6\u8fdb\u884c\u4e2d\u4e8b\u52a1\u7684\u53d8\u66f4\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');\n    lsn     | xid |                       data\n------------+-----+--------------------------------------------------\n 0/016B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/016B21F8 | 503 | streaming change for TXN 503\n 0/016B2300 | 503 | streaming change for TXN 503\n 0/016B2408 | 503 | streaming change for TXN 503\n 0/016BEBA0 | 503 | closing a streamed block for transaction TXN 503\n 0/016B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/016BECA8 | 503 | streaming change for TXN 503\n 0/016BEDB0 | 503 | streaming change for TXN 503\n 0/016BEEB8 | 503 | streaming change for TXN 503\n 0/016BEBA0 | 503 | closing a streamed block for transaction TXN 503\n(10 rows)\n</pre>\n</div>", "manual_path": "/docs/19/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/19/test-decoding.html", "method": "same-major semantic node", "sha256": "0bbba54354c8a7329f2949dfa5fd6dae7464e5826d8199165d31f787069305ac", "language": "zh", "matched_nodes": ["#TEST-DECODING/div[0]", "#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]", "#TEST-DECODING/p[6]"]}], "language": "zh", "original_text": {"/versions/19/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/19/facts/0/label": "Interface family", "/versions/19/facts/0/value": "Logical-decoding output plugin", "/versions/19/facts/1/label": "Handler or routine", "/versions/19/facts/2/label": "Recorded callbacks", "/versions/19/tables/0/title": "Registered interface handlers", "/versions/19/tables/1/title": "Option names recognized by this plugin build", "/versions/19/related/0/label": "Logical decoding output interface", "/versions/19/related/1/label": "Existing extension catalogue identity", "/versions/19/sections/0/title": "Interface and capability boundaries", "/versions/19/sections/1/title": "Output and protocol boundaries", "/versions/19/sections/2/title": "Registered implementation in core source", "/versions/19/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/19/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/19/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/19/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/19/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/19/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/19/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/19/tables/0/rows/0/feature": "Begin transaction", "/versions/19/tables/0/rows/1/feature": "Row changes", "/versions/19/tables/0/rows/4/feature": "Logical messages", "/versions/19/tables/0/rows/5/feature": "Start streamed transaction", "/versions/19/tables/0/rows/6/feature": "Stream row changes", "/versions/19/tables/0/rows/7/feature": "Prepare transaction", "/versions/19/tables/0/rows/8/feature": "Commit prepared", "/versions/19/tables/0/rows/9/feature": "Rollback prepared", "/versions/19/tables/0/columns/0/label": "Interface operation", "/versions/19/tables/0/columns/1/label": "Source observation", "/versions/19/tables/0/columns/2/label": "Callback", "/versions/19/tables/0/columns/3/label": "Implementation", "/versions/19/tables/1/columns/0/label": "Source option name"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "fb6f63468c952012cd3ae480ded063b252549f2fca2157e3406c369896b09f1f"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts", "stream-changes"], "protocol_versions": {}}, "comparison_hash": "465d2c6d5759db47dd963a4b8f5bcb847943413cfd5afb7eb4fd0bd7b894b83e", "manual_language": "zh", "runtime_verified": false}, "20": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "21"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "pg_decode_stream_start"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "pg_decode_stream_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "pg_decode_prepare_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "pg_decode_commit_prepared_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "pg_decode_rollback_prepared_txn"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}, {"name": "stream-changes"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/devel/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 20devel source archive", "label": "20devel", "major": "20", "channel": "devel", "revision": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41", "source_url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "source_snapshot_utc": "26-Sep-2026 20:22"}, "sources": [{"url": "https://pg.center/docs/devel/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 20 English manual", "sha256": "68eb7c306b53fc205d131101f1e3f2eb622274594d3d479361eda57954eae938", "language": "en", "original_url": "/docs/devel/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/snapshot/dev/postgresql-snapshot.tar.bz2", "line": 132, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:132", "sha256": "cd1c86b7040eee0a4f67eef397295759bba0d920bc70d38b16574f1e47a48086", "archive_sha256": "4d3346909b201ac1648232cf290462a7070c119326f56196f1f0253ed80fae41"}, {"url": "https://pg.center/docs/devel/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 20 English manual", "sha256": "c3155ae81ecabd273f3b326b0e44b4cf39954def59a10c58f50f7ec51ac1923c", "language": "en", "original_url": "/docs/devel/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n\tcb->filter_prepare_cb = pg_decode_filter_prepare;\n\tcb->begin_prepare_cb = pg_decode_begin_prepare_txn;\n\tcb->prepare_cb = pg_decode_prepare_txn;\n\tcb->commit_prepared_cb = pg_decode_commit_prepared_txn;\n\tcb->rollback_prepared_cb = pg_decode_rollback_prepared_txn;\n\tcb->stream_start_cb = pg_decode_stream_start;\n\tcb->stream_stop_cb = pg_decode_stream_stop;\n\tcb->stream_abort_cb = pg_decode_stream_abort;\n\tcb->stream_prepare_cb = pg_decode_stream_prepare;\n\tcb->stream_commit_cb = pg_decode_stream_commit;\n\tcb->stream_change_cb = pg_decode_stream_change;\n\tcb->stream_message_cb = pg_decode_stream_message;\n\tcb->stream_truncate_cb = pg_decode_stream_truncate;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\n<div>\n<div>\n<h2 class=\"title\" style=\"clear: both\">F.47.\u00a0test_decoding \u2014 \u7528\u4e8e WAL \u903b\u8f91\u89e3\u7801\u7684\u57fa\u4e8e SQL \u7684\u6d4b\u8bd5/\u793a\u4f8b\u6a21\u5757 </h2>\n</div>\n</div>\n</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n    lsn     | xid |                       data\n------------+-----+--------------------------------------------------\n 0/016D30F8 | 691 | BEGIN\n 0/016D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/016D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/016D32A0 | 691 | COMMIT\n 0/016D32D8 | 692 | BEGIN\n 0/016D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/016D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/016D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n<p lang=\"zh\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u83b7\u53d6\u8fdb\u884c\u4e2d\u4e8b\u52a1\u7684\u53d8\u66f4\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');\n    lsn     | xid |                       data\n------------+-----+--------------------------------------------------\n 0/016B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/016B21F8 | 503 | streaming change for TXN 503\n 0/016B2300 | 503 | streaming change for TXN 503\n 0/016B2408 | 503 | streaming change for TXN 503\n 0/016BEBA0 | 503 | closing a streamed block for transaction TXN 503\n 0/016B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/016BECA8 | 503 | streaming change for TXN 503\n 0/016BEDB0 | 503 | streaming change for TXN 503\n 0/016BEEB8 | 503 | streaming change for TXN 503\n 0/016BEBA0 | 503 | closing a streamed block for transaction TXN 503\n(10 rows)\n</pre>\n</div>", "manual_path": "/docs/devel/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/devel/test-decoding.html", "method": "same-major semantic node", "sha256": "d5c645e3212fed80d9d76671d1981cc5237139b33e7318d9cf449aabd1e70325", "language": "zh", "matched_nodes": ["#TEST-DECODING/div[0]", "#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]", "#TEST-DECODING/p[6]"]}], "language": "zh", "original_text": {"/summary": "A test and example output plugin that renders logical changes in a textual format.", "/category": "Testing and examples", "/versions/20/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/20/facts/0/label": "Interface family", "/versions/20/facts/0/value": "Logical-decoding output plugin", "/versions/20/facts/1/label": "Handler or routine", "/versions/20/facts/2/label": "Recorded callbacks", "/versions/20/tables/0/title": "Registered interface handlers", "/versions/20/tables/1/title": "Option names recognized by this plugin build", "/versions/20/related/0/label": "Logical decoding output interface", "/versions/20/related/1/label": "Existing extension catalogue identity", "/versions/20/sections/0/title": "Interface and capability boundaries", "/versions/20/sections/1/title": "Output and protocol boundaries", "/versions/20/sections/2/title": "Registered implementation in core source", "/versions/20/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/20/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/20/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/20/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/20/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/20/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/20/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/20/tables/0/rows/0/feature": "Begin transaction", "/versions/20/tables/0/rows/1/feature": "Row changes", "/versions/20/tables/0/rows/4/feature": "Logical messages", "/versions/20/tables/0/rows/5/feature": "Start streamed transaction", "/versions/20/tables/0/rows/6/feature": "Stream row changes", "/versions/20/tables/0/rows/7/feature": "Prepare transaction", "/versions/20/tables/0/rows/8/feature": "Commit prepared", "/versions/20/tables/0/rows/9/feature": "Rollback prepared", "/versions/20/tables/0/columns/0/label": "Interface operation", "/versions/20/tables/0/columns/1/label": "Source observation", "/versions/20/tables/0/columns/2/label": "Callback", "/versions/20/tables/0/columns/3/label": "Implementation", "/versions/20/tables/1/columns/0/label": "Source option name"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "821f50d2ac1a2c6ea9046cb3c1e284fd691644db7b83ed66c7fd34092ab09cc7"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts", "stream-changes"], "protocol_versions": {}}, "comparison_hash": "465d2c6d5759db47dd963a4b8f5bcb847943413cfd5afb7eb4fd0bd7b894b83e", "manual_language": "zh", "runtime_verified": false}}}, "snapshot": {"facts": [{"label": "\u63a5\u53e3\u7c7b\u522b", "value": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6"}, {"label": "\u5904\u7406\u51fd\u6570\u6216\u4f8b\u7a0b", "value": "_PG_output_plugin_init"}, {"label": "\u8bb0\u5f55\u7684\u56de\u8c03", "value": "21"}], "tables": [{"key": "callbacks", "rows": [{"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u4e8b\u52a1", "callback": "begin_cb", "implementation": "pg_decode_begin_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u884c\u53d8\u66f4", "callback": "change_cb", "implementation": "pg_decode_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "Commit", "callback": "commit_cb", "implementation": "pg_decode_commit_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "TRUNCATE", "callback": "truncate_cb", "implementation": "pg_decode_truncate"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u903b\u8f91\u6d88\u606f", "callback": "message_cb", "implementation": "pg_decode_message"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u5f00\u59cb\u6d41\u5f0f\u4e8b\u52a1", "callback": "stream_start_cb", "implementation": "pg_decode_stream_start"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u6d41\u5f0f\u884c\u53d8\u66f4", "callback": "stream_change_cb", "implementation": "pg_decode_stream_change"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u51c6\u5907\u4e8b\u52a1", "callback": "prepare_cb", "implementation": "pg_decode_prepare_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u63d0\u4ea4\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "commit_prepared_cb", "implementation": "pg_decode_commit_prepared_txn"}, {"state": "\u5df2\u6ce8\u518c\u5904\u7406\u51fd\u6570\uff1b\u9002\u7528\u6761\u4ef6\u9650\u5236", "feature": "\u56de\u6eda\u5df2\u51c6\u5907\u4e8b\u52a1", "callback": "rollback_prepared_cb", "implementation": "pg_decode_rollback_prepared_txn"}], "title": "\u6ce8\u518c\u7684\u63a5\u53e3\u5904\u7406\u51fd\u6570", "columns": [{"key": "feature", "label": "\u63a5\u53e3\u64cd\u4f5c"}, {"key": "state", "label": "\u6e90\u7801\u89c2\u5bdf"}, {"key": "callback", "label": "\u56de\u8c03"}, {"key": "implementation", "label": "\u5b9e\u73b0"}]}, {"key": "source-options", "rows": [{"name": "force-binary"}, {"name": "include-rewrites"}, {"name": "include-timestamp"}, {"name": "include-xids"}, {"name": "only-local"}, {"name": "skip-empty-xacts"}, {"name": "stream-changes"}], "title": "\u672c\u6784\u5efa\u8bc6\u522b\u7684\u63d2\u4ef6\u9009\u9879\u540d", "caption": "\u4ece\u9009\u9879\u89e3\u6790\u5668\u4e2d\u63d0\u53d6\uff1b\u4ec5\u51ed\u540d\u79f0\u65e0\u6cd5\u786e\u5b9a\u9ed8\u8ba4\u503c\u3001\u53ef\u63a5\u53d7\u7684\u53d6\u503c\u6216\u534f\u8bae\u8981\u6c42\u3002", "columns": [{"key": "name", "label": "\u6e90\u7801\u9009\u9879\u540d"}]}], "related": [{"url": "/docs/18/logicaldecoding-output-plugin.html", "label": "\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63a5\u53e3"}, {"url": "/e/test_decoding/", "label": "\u65e2\u6709\u6269\u5c55\u76ee\u5f55\u6807\u8bc6"}], "release": {"ref": "PostgreSQL 18.6 source archive", "label": "18.6", "major": "18", "channel": "stable", "revision": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f", "source_url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "source_snapshot_utc": ""}, "sources": [{"url": "https://pg.center/docs/18/test-decoding.html", "path": "test-decoding.html", "label": "PostgreSQL 18 English manual", "sha256": "630f953dd8c232a410627e4993be253b13665bb1b04ca1be26c871afd7c3eebe", "language": "en", "original_url": "/docs/18/test-decoding.html"}, {"url": "https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2", "line": 132, "path": "contrib/test_decoding/test_decoding.c", "label": "contrib/test_decoding/test_decoding.c:132", "sha256": "3110af5e2b768a3311f20a32ac9d90c7a18f437e0ceaef69fbee51cc28900357", "archive_sha256": "555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f"}, {"url": "https://pg.center/docs/18/logicaldecoding-output-plugin.html", "path": "logicaldecoding-output-plugin.html", "label": "PostgreSQL 18 English manual", "sha256": "e5b3d13adfcc9e33f24524cb09d93eb91a1292fdb3124234002ccccf93f45738", "language": "en", "original_url": "/docs/18/logicaldecoding-output-plugin.html"}], "sections": [{"title": "\u63a5\u53e3\u4e0e\u80fd\u529b\u8fb9\u754c", "paragraphs": ["\u77e9\u9635\u8bb0\u5f55\u6b64\u6e90\u7801\u6784\u5efa\u5b9e\u9645\u6ce8\u518c\u7684\u56de\u8c03\u3002\u6ce8\u518c\u8868\u660e\u5b9e\u73b0\u4e86\u76f8\u5e94\u63a5\u53e3\u94a9\u5b50\uff1b\u64cd\u4f5c\u662f\u5426\u5141\u8bb8\u8fd8\u53d6\u51b3\u4e8e\u9009\u9879\u3001\u67e5\u8be2\u5f62\u5f0f\u3001\u6743\u9650\u548c\u63d0\u4f9b\u65b9\u89c4\u5219\u3002", "\u4e0b\u65b9\u4fdd\u7559\u540c\u7248\u672c\u5b8c\u6574\u624b\u518c\uff0c\u5305\u62ec\u914d\u7f6e\u3001\u7ea6\u675f\u548c\u793a\u4f8b\u3002\u4e0d\u58f0\u79f0\u5df2\u8fdb\u884c\u8fd0\u884c\u65f6\u80fd\u529b\u6d4b\u8bd5\u3002"]}, {"title": "\u8f93\u51fa\u4e0e\u534f\u8bae\u8fb9\u754c", "paragraphs": ["\u56de\u8c03\u662f\u5426\u5b58\u5728\u3001\u534f\u8bae\u7248\u672c\u3001\u5ba2\u6237\u7aef\u534f\u5546\u53ca\u5df2\u542f\u7528\u7684\u63d2\u4ef6\u9009\u9879\u5206\u522b\u8bb0\u5f55\u3002\u6d41\u5f0f\u5904\u7406\u548c\u4e24\u9636\u6bb5\u5904\u7406\u9700\u8981\u5339\u914d\u7684\u534f\u8bae\u4e0e\u914d\u7f6e\u3002", "test_decoding \u662f\u793a\u4f8b\uff0f\u6d4b\u8bd5\u8f93\u51fa\u683c\u5f0f\uff0cpgoutput \u5b9e\u73b0\u903b\u8f91\u590d\u5236\u534f\u8bae\uff0c\u4e24\u8005\u7684\u8f93\u51fa\u7ea6\u5b9a\u4e0d\u53ef\u4e92\u6362\u3002"]}, {"code": "{\n\tcb->startup_cb = pg_decode_startup;\n\tcb->begin_cb = pg_decode_begin_txn;\n\tcb->change_cb = pg_decode_change;\n\tcb->truncate_cb = pg_decode_truncate;\n\tcb->commit_cb = pg_decode_commit_txn;\n\tcb->filter_by_origin_cb = pg_decode_filter;\n\tcb->shutdown_cb = pg_decode_shutdown;\n\tcb->message_cb = pg_decode_message;\n\tcb->filter_prepare_cb = pg_decode_filter_prepare;\n\tcb->begin_prepare_cb = pg_decode_begin_prepare_txn;\n\tcb->prepare_cb = pg_decode_prepare_txn;\n\tcb->commit_prepared_cb = pg_decode_commit_prepared_txn;\n\tcb->rollback_prepared_cb = pg_decode_rollback_prepared_txn;\n\tcb->stream_start_cb = pg_decode_stream_start;\n\tcb->stream_stop_cb = pg_decode_stream_stop;\n\tcb->stream_abort_cb = pg_decode_stream_abort;\n\tcb->stream_prepare_cb = pg_decode_stream_prepare;\n\tcb->stream_commit_cb = pg_decode_stream_commit;\n\tcb->stream_change_cb = pg_decode_stream_change;\n\tcb->stream_message_cb = pg_decode_stream_message;\n\tcb->stream_truncate_cb = pg_decode_stream_truncate;\n}", "title": "\u6838\u5fc3\u6e90\u7801\u4e2d\u6ce8\u518c\u7684\u5b9e\u73b0"}], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "description": ["\u7528\u4e8e\u6d4b\u8bd5\u548c\u793a\u4f8b\u7684\u8f93\u51fa\u63d2\u4ef6\uff0c\u4ee5\u6587\u672c\u683c\u5f0f\u5448\u73b0\u903b\u8f91\u53d8\u66f4\u3002"], "manual_html": "<div class=\"sect1\" id=\"TEST-DECODING\">\n<div class=\"titlepage\">\n<div>\n<div>\n<h2 class=\"title\" lang=\"zh\">\n<div>\n<div>\n<h2 class=\"title\" style=\"clear: both\">F.45.\u00a0test_decoding \u2014 \u7528\u4e8e WAL \u903b\u8f91\u89e3\u7801\u7684\u57fa\u4e8e SQL \u7684\u6d4b\u8bd5/\u793a\u4f8b\u6a21\u5757 </h2>\n</div>\n</div>\n</h2>\n</div>\n</div>\n</div>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u662f\u4e00\u4e2a\u903b\u8f91\u89e3\u7801\u8f93\u51fa\u63d2\u4ef6\u793a\u4f8b\u3002\u5b83\u672c\u8eab\u5e76\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u6709\u7528\u7684\u529f\u80fd\uff0c\u4f46\u53ef\u4f5c\u4e3a\u5f00\u53d1\u81ea\u5b9a\u4e49\u8f93\u51fa\u63d2\u4ef6\u7684\u8d77\u70b9\u3002</p>\n<p lang=\"zh\"><code class=\"filename\">test_decoding</code> \u901a\u8fc7\u903b\u8f91\u89e3\u7801\u673a\u5236\u63a5\u6536 WAL\uff0c\u5e76\u5c06\u5176\u89e3\u7801\u4e3a\u6240\u6267\u884c\u64cd\u4f5c\u7684\u6587\u672c\u8868\u793a\u5f62\u5f0f\u3002</p>\n<p lang=\"zh\">\u901a\u8fc7 SQL \u903b\u8f91\u89e3\u7801\u63a5\u53e3\u4f7f\u7528\u8be5\u63d2\u4ef6\u65f6\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');\n   lsn     | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16D30F8 | 691 | BEGIN\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'\n 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'\n 0/16D32A0 | 691 | COMMIT\n 0/16D32D8 | 692 | BEGIN\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2\n 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3\n 0/16D3398 | 692 | COMMIT\n(8 rows)\n</pre>\n<p lang=\"zh\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u83b7\u53d6\u8fdb\u884c\u4e2d\u4e8b\u52a1\u7684\u53d8\u66f4\uff0c\u5176\u5178\u578b\u8f93\u51fa\u53ef\u80fd\u5982\u4e0b\uff1a</p>\n<pre class=\"programlisting\">postgres[33712]=#* SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'stream-changes', '1');\n    lsn    | xid |                       data\n-----------+-----+--------------------------------------------------\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | streaming change for TXN 503\n 0/16B2300 | 503 | streaming change for TXN 503\n 0/16B2408 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n 0/16B21F8 | 503 | opening a streamed block for transaction TXN 503\n 0/16BECA8 | 503 | streaming change for TXN 503\n 0/16BEDB0 | 503 | streaming change for TXN 503\n 0/16BEEB8 | 503 | streaming change for TXN 503\n 0/16BEBA0 | 503 | closing a streamed block for transaction TXN 503\n(10 rows)\n</pre>\n</div>", "manual_path": "/docs/18/test-decoding.html", "localization": {"status": "complete", "sources": [{"url": "/docs/18/test-decoding.html", "method": "same-major semantic node", "sha256": "51dbf85146860d160206a6e6a461c169a8ab0784b8c20f1723352193d4e4bc81", "language": "zh", "matched_nodes": ["#TEST-DECODING/div[0]", "#TEST-DECODING/p[2]", "#TEST-DECODING/p[3]", "#TEST-DECODING/p[4]", "#TEST-DECODING/p[6]"]}], "language": "zh", "original_text": {"/versions/18/description/0": "A test and example output plugin that renders logical changes in a textual format.", "/versions/18/facts/0/label": "Interface family", "/versions/18/facts/0/value": "Logical-decoding output plugin", "/versions/18/facts/1/label": "Handler or routine", "/versions/18/facts/2/label": "Recorded callbacks", "/versions/18/tables/0/title": "Registered interface handlers", "/versions/18/tables/1/title": "Option names recognized by this plugin build", "/versions/18/related/0/label": "Logical decoding output interface", "/versions/18/related/1/label": "Existing extension catalogue identity", "/versions/18/sections/0/title": "Interface and capability boundaries", "/versions/18/sections/1/title": "Output and protocol boundaries", "/versions/18/sections/2/title": "Registered implementation in core source", "/versions/18/tables/1/caption": "Extracted from the option parser; names alone do not describe defaults, accepted values or protocol requirements.", "/versions/18/tables/0/rows/0/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/1/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/2/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/3/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/4/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/5/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/6/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/7/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/8/state": "Handler registered; conditions apply", "/versions/18/tables/0/rows/9/state": "Handler registered; conditions apply", "/versions/18/sections/0/paragraphs/0": "The matrix records callbacks actually registered in this source build. Registration identifies an implemented interface hook; options, query shape, privileges and provider rules determine whether an operation is allowed.", "/versions/18/sections/0/paragraphs/1": "The complete same-version manual below retains configuration, constraints and examples. No runtime capability test is claimed.", "/versions/18/sections/1/paragraphs/0": "Callback presence and protocol versions are separate from client negotiation and enabled plugin options. Streaming and two-phase processing require the matching protocol and configuration.", "/versions/18/sections/1/paragraphs/1": "test_decoding is an example/test output format; pgoutput implements the logical-replication protocol. Their output contracts are not interchangeable.", "/versions/18/tables/0/rows/0/feature": "Begin transaction", "/versions/18/tables/0/rows/1/feature": "Row changes", "/versions/18/tables/0/rows/4/feature": "Logical messages", "/versions/18/tables/0/rows/5/feature": "Start streamed transaction", "/versions/18/tables/0/rows/6/feature": "Stream row changes", "/versions/18/tables/0/rows/7/feature": "Prepare transaction", "/versions/18/tables/0/rows/8/feature": "Commit prepared", "/versions/18/tables/0/rows/9/feature": "Rollback prepared", "/versions/18/tables/0/columns/0/label": "Interface operation", "/versions/18/tables/0/columns/1/label": "Source observation", "/versions/18/tables/0/columns/2/label": "Callback", "/versions/18/tables/0/columns/3/label": "Implementation", "/versions/18/tables/1/columns/0/label": "Source option name"}, "fallback_fields": [], "source_language": "en", "original_snapshot_sha256": "3eee67f5ac58cf2808ec3ce9e551f64adbecc41ccc907560e08b83dcf7c5cb25"}, "evidence_kind": "source and documentation", "comparison_data": {"options": [], "callbacks": {"begin_cb": "pg_decode_begin_txn", "change_cb": "pg_decode_change", "commit_cb": "pg_decode_commit_txn", "message_cb": "pg_decode_message", "prepare_cb": "pg_decode_prepare_txn", "startup_cb": "pg_decode_startup", "shutdown_cb": "pg_decode_shutdown", "truncate_cb": "pg_decode_truncate", "stream_stop_cb": "pg_decode_stream_stop", "stream_abort_cb": "pg_decode_stream_abort", "stream_start_cb": "pg_decode_stream_start", "begin_prepare_cb": "pg_decode_begin_prepare_txn", "stream_change_cb": "pg_decode_stream_change", "stream_commit_cb": "pg_decode_stream_commit", "filter_prepare_cb": "pg_decode_filter_prepare", "stream_message_cb": "pg_decode_stream_message", "stream_prepare_cb": "pg_decode_stream_prepare", "commit_prepared_cb": "pg_decode_commit_prepared_txn", "stream_truncate_cb": "pg_decode_stream_truncate", "filter_by_origin_cb": "pg_decode_filter", "rollback_prepared_cb": "pg_decode_rollback_prepared_txn"}, "source_options": ["force-binary", "include-rewrites", "include-timestamp", "include-xids", "only-local", "skip-empty-xacts", "stream-changes"], "protocol_versions": {}}, "comparison_hash": "465d2c6d5759db47dd963a4b8f5bcb847943413cfd5afb7eb4fd0bd7b894b83e", "manual_language": "zh", "runtime_verified": false}, "comparison": {"left": "13", "right": "14", "status": "changed", "diff": "--- PostgreSQL 13\n+++ PostgreSQL 14\n@@ -1,12 +1,25 @@\n {\n   \"callbacks\": {\n     \"begin_cb\": \"pg_decode_begin_txn\",\n+    \"begin_prepare_cb\": \"pg_decode_begin_prepare_txn\",\n     \"change_cb\": \"pg_decode_change\",\n     \"commit_cb\": \"pg_decode_commit_txn\",\n+    \"commit_prepared_cb\": \"pg_decode_commit_prepared_txn\",\n     \"filter_by_origin_cb\": \"pg_decode_filter\",\n+    \"filter_prepare_cb\": \"pg_decode_filter_prepare\",\n     \"message_cb\": \"pg_decode_message\",\n+    \"prepare_cb\": \"pg_decode_prepare_txn\",\n+    \"rollback_prepared_cb\": \"pg_decode_rollback_prepared_txn\",\n     \"shutdown_cb\": \"pg_decode_shutdown\",\n     \"startup_cb\": \"pg_decode_startup\",\n+    \"stream_abort_cb\": \"pg_decode_stream_abort\",\n+    \"stream_change_cb\": \"pg_decode_stream_change\",\n+    \"stream_commit_cb\": \"pg_decode_stream_commit\",\n+    \"stream_message_cb\": \"pg_decode_stream_message\",\n+    \"stream_prepare_cb\": \"pg_decode_stream_prepare\",\n+    \"stream_start_cb\": \"pg_decode_stream_start\",\n+    \"stream_stop_cb\": \"pg_decode_stream_stop\",\n+    \"stream_truncate_cb\": \"pg_decode_stream_truncate\",\n     \"truncate_cb\": \"pg_decode_truncate\"\n   },\n   \"options\": [],\n@@ -17,6 +30,7 @@\n     \"include-timestamp\",\n     \"include-xids\",\n     \"only-local\",\n-    \"skip-empty-xacts\"\n+    \"skip-empty-xacts\",\n+    \"stream-changes\"\n   ]\n }"}}