Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1viGk5-001zp4-2G for pgsql-docs@arkaria.postgresql.org; Tue, 20 Jan 2026 18:46:18 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1viGk4-002QFd-2B for pgsql-docs@arkaria.postgresql.org; Tue, 20 Jan 2026 18:46:17 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1viGk4-002QFV-0l for pgsql-docs@lists.postgresql.org; Tue, 20 Jan 2026 18:46:16 +0000 Received: from mail-ot1-x332.google.com ([2607:f8b0:4864:20::332]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1viGk1-001SqZ-00 for pgsql-docs@lists.postgresql.org; Tue, 20 Jan 2026 18:46:15 +0000 Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-7d148dd3421so34605a34.0 for ; Tue, 20 Jan 2026 10:46:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1768934773; cv=none; d=google.com; s=arc-20240605; b=b58TdVgpaaPFGEx2pcaJ5XEY1JXtW+J/XAPh6KBnw6j6MxXnxLbPE1NniQahaPZJQr FJft0hqSmxIT/mbXozAN1DVGHF9gCJOG2iGsIC9qPuM1rEijlX91DeFPaJJ8ewbvsv+Y gOu5U+j4x3eMKPz9/cvhF3DkbOhCn5k/SIqtzGyh5cKzhXw/HQwdy1gabaV+ASivBWJw yOYvNXIO3ZKobqqvFkFW05mUEURWP+aioalhdE9CEAlQ6/VJiC54PieMxAOJF/1ewCHu shWFLHo7+edzTsJ1Ms8RibV/5HFeDsJGr18eyguGez92NHA4PPpH65Vuuf0eso71EwRZ kYqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=8ev8sUDw0HtYn1mRPwh1DCAVnSYHQM6BLlKe4tLNFOM=; fh=eitnFYqiGz5Qd9tP4ETN4LQj8BMqIm+FgmdzoPwQKYs=; b=jQUPJwpK5AZ7qMSzn7zLm22RW/t22XRrpNKG2iwpdJOSPvkoopifW8KmcsFLdFYb5e 0mmXPYzt7nV4kcPeRzVJvXusbHSOIRguQKldzBtOro7j279fUWobIyrImmV6yDbxX6s0 eHmT5GKaR2dut3fN6/T5HOBZFlH6xpqwCCw/D7Dhcuo7fH0W4NG9+A2XMYqImfTOeNy/ 99Evbi9apJCUj3ZdOvwC7vPXDGP7IHG1dAYhfnpm6OyiaKzrB/frnIrJEvjB6i+wXZ25 iLZlLEU4BAVabZkL6I7ltoGV6IPSh3pVWRYkXjF2h19YRJ7x1Gh8gl70Ox4rQpoTNYL+ UsiQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=illuminatedcomputing-com.20230601.gappssmtp.com; s=20230601; t=1768934773; x=1769539573; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=8ev8sUDw0HtYn1mRPwh1DCAVnSYHQM6BLlKe4tLNFOM=; b=3QMWiMcth+8p0FXIA6ve1otvfjb+/HVLO5At0ZnlS1WAETPfk2AeMaWxqF+cMt2WG6 8cbucgWag7vXcaThYP7anGwV3XgfBIvDB52kcjhsnGoJ/R5VSQTSjnzXt2fteZIWPGLt TeOOhVvSG1t20c6uCq+fQxFBTdMJ/stjJm4KsJPR0USSmv1dQE0ZpDMdZLk5JZfyszI+ gbU9sQbswWfbi+38EQ35W1dN3Ef1FasWNYk1O2R30kTizt/zYgrG1h7WCve7RxTIKY1K BX7myD9OlpJGFzJscmTK3maGNU+wxU7PMlwDJAx9/yE4C08A7MLC+c/P87zJx2OwNbqk iBOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768934773; x=1769539573; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=8ev8sUDw0HtYn1mRPwh1DCAVnSYHQM6BLlKe4tLNFOM=; b=uZ1Gy9wvjO5EUN5fnQOA3YqGw/cAi6ZG6j+m6o6vo+aXaK1wSGRtT1NCo4NfLqj5rx MH88E7ShhUzkxXyoEaD+9eiEr7en696dK+uOARPgk6X9QS5tcEpUxOZAZ4/GZ/xYKA8D VVtNbXche9Cch/XvcJEM4x6kaVcs0A69YJgstJC50cracdRnaCXNDIw+ZT1rUt8vWFEx uCEvibx3pUEdPwOhJwHtSUXGy1FBNh9e18S7j7aZ7Qi9jHZHXC1yqRfn64bFgJLeLVI5 tTVvQpIiSztAQ0/3iMUWfgwAaGN4VdNZvxhEB+hRy4LZ/V6QeoDyC8EmcAlolJjKn/4r w7uQ== X-Gm-Message-State: AOJu0YzvtLjLo41b8m5upVvhsFHZmqYOwfCkVucyvQ7OZcgALA6NelSP qDmXRJVqvFFboYICc+63scNJ/OEZQfR5FbHVPglsHOTfcTt21ZJk7QDiSzPzvxW4/1tQPmpY6Wa lKuShxEXrfCfK7Don9t3wWuhDKMl6CwOr5cz+EytqiWjIDGOYlb+oNU7/Lw== X-Gm-Gg: AY/fxX7Ic17Rh9vXX9c3GXRZRYBm5jrX+eRnnQqC2Zuvgl1PDNmS2HSnEZcDHKAlsW8 4f2YDRIQYpCjNYZaptRfDLT7am7D8ZMOsYE4oAIi9zTaSO/2PhH8tDhCnYt8I1ZcPJBLekNrN6L 2ZAoTc+4qXu1xnD6AWvv3JizkEjMwWoGlEyxrbSmGvJzoYcaohe+DKZ6KAsEB0Y8/bARE54n1iS 0pJBR5PGSs+igsHgW0b5ezJfEldso7yNjrGsTTW8VatdHtRVqA/UsPIvY3L1kJ1Xkxe X-Received: by 2002:a05:6820:1798:b0:65f:6d6c:52f7 with SMTP id 006d021491bc7-661188f95cbmr6434505eaf.19.1768934772801; Tue, 20 Jan 2026 10:46:12 -0800 (PST) MIME-Version: 1.0 From: Paul A Jungwirth Date: Tue, 20 Jan 2026 10:46:01 -0800 X-Gm-Features: AZwV_QhNdgXgHdSmWKwWvSnPedVVVDQDRSU6n6CvXQ7J_LUMtL7ksjQXgG_Hqew Message-ID: Subject: cmax docs seem misleading To: pgsql-docs@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000c3a9070648d6389d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000c3a9070648d6389d Content-Type: text/plain; charset="UTF-8" The docs for cmax say:[0] > The command identifier within the deleting transaction, or zero. This was true once upon a time, I think. But nowadays cmax and cmin are the same physical field, and the user-facing system columns don't seem to be trying to interpret it. For example: [v19devel:5432][334102] regression=# create table pj (a int); CREATE TABLE [v19devel:5432][334102] regression=# begin; insert into pj values (1); insert into pj values (2); commit; BEGIN INSERT 0 1 INSERT 0 1 COMMIT [v19devel:5432][334102] regression=# select ctid, xmin, xmax, cmin, cmax, * from pj; ctid | xmin | xmax | cmin | cmax | a -------+-------+------+------+------+--- (0,1) | 22424 | 0 | 0 | 0 | 1 (0,2) | 22424 | 0 | 1 | 1 | 2 So here you have a non-zero cmax for a not-deleted row. The converse isn't true either. "Or zero" hints that deleted rows might always have a non-zero value, but 0 is also just the first command in the transaction. (Null would be a meaningful signal, but I assume we don't want to do that.) As far as I can tell, it is impossible to observe cmin <> cmax. From heap_getsysattr (access/common/heaptuple.c): case MinCommandIdAttributeNumber: case MaxCommandIdAttributeNumber: /* * cmin and cmax are now both aliases for the same field, which * can in fact also be a combo command id. XXX perhaps we should * return the "real" cmin or cmax if possible, that is if we are * inside the originating transaction? */ result = CommandIdGetDatum(HeapTupleHeaderGetRawCommandId(tup->t_data)); break; So it looks like these system columns also don't look up combocids. I'm not interested in changing any of this, but I think we could clean up the docs a little. The description for cmin is questionable too: > The command identifier (starting at zero) within the inserting transaction. That's true if the row hasn't been deleted yet, but then we overwrite the field. Here is a patch to make both of these fields a little clearer, I think. It could be improved further by some glossary entries explaining what a command id is (and a combocid). Or maybe that's too much information? And maybe we should be more drastic: combine cmin & cmax into one entry, and explain that they are two names for the same value, which might signify the insert cid, the delete cid, or a combocid. [0] https://www.postgresql.org/docs/current/ddl-system-columns.html#DDL-SYSTEM-COLUMNS-CMAX Yours, -- Paul ~{:-) pj@illuminatedcomputing.com --000000000000c3a9070648d6389d Content-Type: text/x-patch; charset="US-ASCII"; name="v1-0001-docs-Clarify-cmin-and-cmax-system-columns.patch" Content-Disposition: attachment; filename="v1-0001-docs-Clarify-cmin-and-cmax-system-columns.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkmxvkzb0 RnJvbSA1Y2ZhMDVlZTljNmYwNzU4NzViNGViOWFkNmQ2NGU4MWM5Y2JkY2JiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAiUGF1bCBBLiBKdW5nd2lydGgiIDxwakBpbGx1bWluYXRlZGNv bXB1dGluZy5jb20+CkRhdGU6IFR1ZSwgMjAgSmFuIDIwMjYgMTA6MzM6MzEgLTA4MDAKU3ViamVj dDogW1BBVENIIHYxXSBkb2NzOiBDbGFyaWZ5IGNtaW4gYW5kIGNtYXggc3lzdGVtIGNvbHVtbnMK ClRoZXNlIGFyZSB0d28gbmFtZXMgZm9yIHRoZSBzYW1lIHBoeXNpY2FsIGZpZWxkLiBUaGUgZG9j cyBzdWdnZXN0ZWQgdGhhdCB0aGV5CndlcmUgZGlzdGluY3QsIGFuZCB0aGUgY21heCBkZXNjcmlw dGlvbiB3YXMgc2ltcGx5IHdyb25nIGZvciBub3QteWV0LWRlbGV0ZWQKcm93cy4KLS0tCiBkb2Mv c3JjL3NnbWwvZGRsLnNnbWwgfCAxMiArKysrKysrKysrLS0KIDEgZmlsZSBjaGFuZ2VkLCAxMCBp bnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9k ZGwuc2dtbCBiL2RvYy9zcmMvc2dtbC9kZGwuc2dtbAppbmRleCA5MDcwYWFhNWE3Yy4uN2ZkZmM4 ZGExYjggMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9kZGwuc2dtbAorKysgYi9kb2Mvc3JjL3Nn bWwvZGRsLnNnbWwKQEAgLTE1MTAsNyArMTUxMCwxMCBAQCBDUkVBVEUgVEFCTEUgY2lyY2xlcyAo CiAKICAgICAgPHBhcmE+CiAgICAgICBUaGUgY29tbWFuZCBpZGVudGlmaWVyIChzdGFydGluZyBh dCB6ZXJvKSB3aXRoaW4gdGhlIGluc2VydGluZwotICAgICAgdHJhbnNhY3Rpb24uCisgICAgICB0 cmFuc2FjdGlvbi4gIE9uY2UgdGhlIHJvdyBoYXMgYmVlbiBkZWxldGVkLCB0aGlzIGlzIHJlcGxh Y2VkIGJ5IHRoZQorICAgICAgaWRlbnRpZmllciBvZiB0aGUgZGVsZXRlIGNvbW1hbmQgKG9yIGEg Y29tYm8gaWRlbnRpZmllciwgaWYgc3RpbGwgaW4gdGhlCisgICAgICBzYW1lIHRyYW5zYWN0aW9u IGFzIHRoZSBpbnNlcnQpLiA8c3RydWN0ZmllbGQ+Y21pbjwvc3RydWN0ZmllbGQ+IGFsd2F5cwor ICAgICAgaGFzIHRoZSBzYW1lIHZhbHVlIGFzIDxzdHJ1Y3RmaWVsZD5jbWF4PC9zdHJ1Y3RmaWVs ZD4uCiAgICAgIDwvcGFyYT4KICAgICA8L2xpc3RpdGVtPgogICAgPC92YXJsaXN0ZW50cnk+CkBA IC0xNTQwLDcgKzE1NDMsMTIgQEAgQ1JFQVRFIFRBQkxFIGNpcmNsZXMgKAogICAgICA8L2luZGV4 dGVybT4KIAogICAgICA8cGFyYT4KLSAgICAgIFRoZSBjb21tYW5kIGlkZW50aWZpZXIgd2l0aGlu IHRoZSBkZWxldGluZyB0cmFuc2FjdGlvbiwgb3IgemVyby4KKyAgICAgIFRoZSBjb21tYW5kIGlk ZW50aWZpZXIgKHN0YXJ0aW5nIGF0IHplcm8pIHdpdGhpbiB0aGUgZGVsZXRpbmcKKyAgICAgIHRy YW5zYWN0aW9uLiAgSWYgdGhlIHJvdyBoYXMgbm90IHlldCBiZWVuIGRlbGV0ZWQsIHRoaXMgaXMg dGhlIGlkZW50aWZpZXIKKyAgICAgIG9mIHRoZSBpbnNlcnQgY29tbWFuZC4gSWYgdGhlIHJvdyB3 YXMgaW5zZXJ0ZWQgYW5kIGRlbGV0ZWQgaW4gdGhlIHNhbWUKKyAgICAgIHRyYW5zYWN0aW9uLCBp dCBpcyBhIGNvbWJvIGlkZW50aWZpZXIgaW5zdGVhZCwgd2hvc2UgbWVhbmluZyBpcyBwcml2YXRl CisgICAgICB0byB0aGF0IHRyYW5zYWN0aW9uLiA8c3RydWN0ZmllbGQ+Y21heDwvc3RydWN0Zmll bGQ+IGFsd2F5cyBoYXMgdGhlIHNhbWUKKyAgICAgIHZhbHVlIGFzIDxzdHJ1Y3RmaWVsZD5jbWlu PC9zdHJ1Y3RmaWVsZD4uCiAgICAgIDwvcGFyYT4KICAgICA8L2xpc3RpdGVtPgogICAgPC92YXJs aXN0ZW50cnk+Ci0tIAoyLjQ3LjMKCg== --000000000000c3a9070648d6389d--