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 1vatKh-00FQQu-0Z for pgsql-hackers@arkaria.postgresql.org; Wed, 31 Dec 2025 10:21:36 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vatKg-0062sd-0C for pgsql-hackers@arkaria.postgresql.org; Wed, 31 Dec 2025 10:21:34 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vatKf-0062sT-2C for pgsql-hackers@lists.postgresql.org; Wed, 31 Dec 2025 10:21:34 +0000 Received: from mail-japanwestazon11020089.outbound.protection.outlook.com ([52.101.228.89] helo=OS0P286CU011.outbound.protection.outlook.com) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vatKd-003l3b-2J for pgsql-hackers@postgresql.org; Wed, 31 Dec 2025 10:21:33 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=G4+DqtrJUjhw2AR8hq/GV+gqkatlZSaw3/A8YCDQtbCXdLt3eRHnl6gRVLzGufD3vbpuhvS3FcyD665JhVbus0+p7eqbkvoc2AdtQXjbJcvrht+m4MZZMB3l8s7lruYMh7GIXPZdxN/ydSxPbdska8ieatBTAfcFNx5NVzhwi3F65+0fR98HCJFu8pkJw36hYZ2vTviW4pE0epmL1aF29eTW6GSo4wWKn7WbGz7Zw59neUtLMSL6xysizMFYrQbiuTF7N0ob8kXpT3mtKESgdQjjIkeeDW5hpyAPqCrhHWAxC8MQLSKpVmfHgZwsAKZJRU75i1Bi2a1GC8vAYP/QNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=JuD5VwoiEbsH2jK48wbuw6cUvrmGT/x5ZDSV59sboVg=; b=Iwu6RchuZgxUBHV6dKH1VY/2RA9JyYc3Svyl3MheGik4rsttLlIkP+berLryRtqL8cECgIp4L3/luiVVQmJlrrtRoWxzSh2zkyHpHaR752NMD7hCLi4I2RWm7YvzuInSyPVjFsCHVko8dy/58GEuGgXYby6C6yVz55jAS9DoZh8O0CU837vvC+34i+PYmKLVO/bAcQ/h/YX77J+aXTmMb7YN6ab8z3da8o0eqUwnUQQnx/jRVUDH6lfogFkurcymE+D28WDB7OnuHLejFC5LZaV9L3mLMjePCx3R+GIOCrLahINMkFoTzQ81rkEhY2wT6fk2K7I8qo4DgEreYxUmAw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=sraoss.co.jp; dmarc=pass action=none header.from=sraoss.co.jp; dkim=pass header.d=sraoss.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sraoss.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JuD5VwoiEbsH2jK48wbuw6cUvrmGT/x5ZDSV59sboVg=; b=TYd29TXKUSAjzUXXxChiH/lUW3KQcNyTBwj9p8aTn2sBu9jGDkz9DkHxm37DPwdglwzlz2Tk/6cCucAnm5KCxq0Li3dvg4Klzriy5tp8EeghJbED65uHyNShqer25pQ9J1vU060LF9XKUcgTINCScvJk/5OI3H27cFebAia//m2qTQAu1usYDLNDYYNt9oqt+GIXP8m3ThtmnVYxWgBxKWPzWv+hOq4xuMgeWng74R0QUdVmsuh896tRRI4c9ga6YlS5hGUtdpgEhgNFhx/UMwZemiF5gQJY4zd1ZHivr8BRt93s1mhRIo46hW65DmCiU1bjrkrEfBwOmX79sZbqhA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=sraoss.co.jp; Received: from OSZP286MB2160.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:189::12) by OS7P286MB7773.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:443::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9478.4; Wed, 31 Dec 2025 10:21:25 +0000 Received: from OSZP286MB2160.JPNP286.PROD.OUTLOOK.COM ([fe80::a4f:22fd:288:2dcb]) by OSZP286MB2160.JPNP286.PROD.OUTLOOK.COM ([fe80::a4f:22fd:288:2dcb%5]) with mapi id 15.20.9478.004; Wed, 31 Dec 2025 10:21:25 +0000 Date: Wed, 31 Dec 2025 19:21:24 +0900 From: Yugo Nagata To: Peter Geoghegan Cc: Pgsql Hackers Subject: Re: Add a berief general comment on BTScanInsertData's nextkey and backward Message-Id: <20251231192124.9aeda68f5518d78483bd84e7@sraoss.co.jp> In-Reply-To: References: <20251118162801.27cb13408cb3c9dd3a72cf7d@sraoss.co.jp> X-Mailer: Sylpheed 3.8.0beta1 (GTK+ 2.24.33; x86_64-pc-linux-gnu) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-ClientProxiedBy: TYCPR01CA0013.jpnprd01.prod.outlook.com (2603:1096:405::25) To OSZP286MB2160.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:189::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: OSZP286MB2160:EE_|OS7P286MB7773:EE_ X-MS-Office365-Filtering-Correlation-Id: 188641b8-2ef2-4d1d-a1a6-08de48565a17 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016|7053199007; X-Microsoft-Antispam-Message-Info: =?utf-8?B?Y211UkNYcm8yVTZpRTlabWVMUHdydFVFZXRIU3doci95TGxWd0pwUFAxNnBD?= =?utf-8?B?QnNIRFNyWlJRWkRKelRhR2Z2N1M1THIrcHpDckNPZmUySnh4MzZENVNHbC9V?= =?utf-8?B?eExwN0FtQ2JWRTFpUUNUb0dxUWQrQXJwd1FrRGk2UDdOOFhiLzRiTWdsa1Bm?= =?utf-8?B?VFAwM3E5cldSOFc0aHFxUWUxNWJjZVlScFJrb3ZObVlZUlJPL2hRbUgyUXN2?= =?utf-8?B?ZGVEeVdzak44Q3lIQ0sxR0QvZisyRlk3bmV0TCt1MTRjYzQ0RU5oaVRHSGdn?= =?utf-8?B?WllSMFpkR2tOd0N2SjJKV043NXE1UTNCYnRrZ0JybHdzczBJTGszNlFRUWxC?= =?utf-8?B?SGp2NWxFdEhqL0RhQjFDWXdkelZXQWFFWTFYQ1hDdHpMblhHOTFjSmFROHNL?= =?utf-8?B?cGRpS28yTGY4Y1phZGJhK01vQld5c0xOS3p1UWtTTDhHVHBzTTVZaWFKcHhH?= =?utf-8?B?S2NZTmtYUlRpNWZoaHlHSHM1VXI5S2c2VERHMkowRDlrcWdxcHdVRERmMjk5?= =?utf-8?B?eFJXanh5QTJsbHRZYUJLejQwL0tuL05MOTRnalVIeFl5bUttTW9tSHdybXdD?= =?utf-8?B?MEtUeHpWU2dQbUUwRkwxaXRvSWJLTE5ocmNramVaT2EzODNVdGVXS0l3WTRw?= =?utf-8?B?NC91VFVXajQ4VElVNVkxeDd1ZnhmQXVidWxUc2dUeVJnL1JvSERXd3FBeXNE?= =?utf-8?B?VmxITGdMUUh0RjY5RmZiZGpuU1p2VkpBOVd5SVBtMU1zK0dCODZoRlFDTXJr?= =?utf-8?B?T0ZEeEJ5K3lGUG1UTDY0d3ROUTYwMUJYMHpJcmc1MHRlTHk4eWNWTGRucTIv?= =?utf-8?B?d25xdzkvSll0OFM1cS90by9wamZVdTFOL2hQQTNHdThuZGdudG5OTVc5MTVI?= =?utf-8?B?QXhRZ2d5SllzNG5nY3h5RlhyUUNzTkFSejcrUWZwWmRmSHBVWEg3RlVWdlBC?= =?utf-8?B?Sk1CT09tN2ovTUxNOEhtTTRTMlZ5YXFZODg1bmJYUnQ1YzJqR0dMNmxWcG1W?= =?utf-8?B?WXN4aGZseGdwNXU1ZmtWR2lZQmJzWG54aCtkbWcwWTkrZEhhTndxQ1Q2SnVD?= =?utf-8?B?M3k0bThIdzkwMXN0TXU1bkx4cWFQZ20vWHpEU1Y4VjFWdk1lVm9aUEZxNGlG?= =?utf-8?B?TXpBSnBTakpJcG5IOGJEWE1GSkVaVWlmcWZsVGVMZjRsazZSOHFtbThLcnRI?= =?utf-8?B?T1h4SmxBaGh4amxLZHZQbFFRb1VUakRSdWRSalpGM2dSbEp2OER5SitZVGNq?= =?utf-8?B?a3FYWVNocHRZU0RKcm9qZFVLblk0NUhZR1JYd0dOVzJUQVJ0QnJaTExtSG1T?= =?utf-8?B?MGFKU2N5ZnhzcitRbnNWTExzMkRJVUdMVnFPMHhZTGVlVFZrdzlTVmlnVU1S?= =?utf-8?B?b3lVMjdBWWFqTVU5cllmY01vL1g5YVlKZmJwWHhiUHBnTVZqM2RFU0xHazg1?= =?utf-8?B?d1UwNmJtR0hnais4YXpIZ0xXazdVell5andSdGl6UDRJajdsK3BxU25kMnpn?= =?utf-8?B?VEF5eEFHTTk1bEd5NGFBeTZuZUhwOVM5Skg5YWF2cVRsSFUraWN0T3NJWmN5?= =?utf-8?B?bUlJay9NdnFlRnpJS25kNkZjL2ZTcjJ5WkRONXk1K3RGNEhYSEZHWXVRZTQx?= =?utf-8?B?b0gzWDZHOXJBY0hNSHVUOUwralhNemx3bkNjS3lOdVA2dXgxRC9yZGs0ZGFq?= =?utf-8?B?bnhvWWpQUFRyQmpXU2lmSkdsVVZtTzk4NiszcHJLaFRnZTMwZkNVcnJ2UEds?= =?utf-8?B?S0VHVkJlYk5FczlOMWxCOE0vK3BKUTBQTFIwaTRTK0JMWUVta25PeGdVb1M3?= =?utf-8?B?RC9sSkdhcXlTN2JaVHFzbmxMdGliL2ZucjMrUVN3czN1RU1saUo4NXhoZnZ3?= =?utf-8?B?RERuczVFUHl1QnlGS05ORU1kSjgxcWdCWWtNbTNwZGpZYmMwRE0rbHEwMUUy?= =?utf-8?Q?Nq4iOh0TXR5E7zJ962lvJab41eu7sVV6?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OSZP286MB2160.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016)(7053199007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bkQ1OVJ0UTBKdThRTjdMamFlR2MvVk5kUXdXVE9pYlUvRDN4YzIzYXJYMUJ4?= =?utf-8?B?QjFQNUhUTGZoQS9jWnR3dVZIakhOMXR1Q0VMaEcvd3ZvNGswNjdyVDRBeTR2?= =?utf-8?B?WmFEek42YmppZU9mSENSVWl1YXEzS1pkNWprSFlVUGhOL29kZHYwNUpNUU1z?= =?utf-8?B?QXpaN2tPdzVyQ1Z6VmVIMjFhOE10ajFPaDlpTHVCSlBCVUJFalEyVWVYVExQ?= =?utf-8?B?TkE4WHVFSGczOHlCcjdFam45K1RxaDFYQ3ZzMkhCM0tDR25tUHJrTUVVZkpS?= =?utf-8?B?V3RVRUZOWUdJWS9JY3FRNElTV25tT09uOVRPZ05MRkZqMjF5TUlXdzRVbTFY?= =?utf-8?B?NnBVeW5DaXo3TXd5ZXpMeFV4VEw4K1ZBS1N1TUNkR1FGT2xQTmZiZndlNjUz?= =?utf-8?B?UzZpU3pWMkRIVnZONmdYR05WcUMyUlB2SDltRFYzeHFsY1hHNjEySU12Zmx3?= =?utf-8?B?Q242K3U2bitsZlRPL1ZZcFpRT240Z1RLTldJYnFTc200b20wQ0dmQTNIaHlz?= =?utf-8?B?L2ZXUFI3eVVBNHV2UEN2VDlzazFyRmtIR1VSTWhKNXlxcVozVjdmaUwvMVY3?= =?utf-8?B?bnBPZ3F6bGZ6dm5MaGFVQXQvQlRZQzZZeXk2VUtTdVh6UGRvVjJmVERrRDg0?= =?utf-8?B?WEI5bEZaY1FPMWVmQ2Vka25Fb2F1WndqdHhOUk1rQ0dyTlB2bHA3aGtwbWRJ?= =?utf-8?B?TEo4MVdRMmExL2pWb3k4MDZlZHphc3c1Qk9TOEJpQVc3bzE3bWNSeXpoeHdR?= =?utf-8?B?cDM0R0QrSElMZllEWDlNMjE3WkF5RktDclVRVzA3bktKc2NCVUx0UzJFTC8x?= =?utf-8?B?TFVTS1ZkVjh3NW82VEtsbDVzbi91RjVYbmMzSXZwVnFndUYvUkxUVmRWVkY5?= =?utf-8?B?SXFuQk9wV3NQRTBHb1FEM3ZvVi9hK3pUUzFUOVJhZkl5eE5IUnd4MGJ6MlBV?= =?utf-8?B?RW9JTnNiNW83ckNTSyt4RkFHaXoxRHBWVkNMTFRCSFozei9MazM2QUE1WERJ?= =?utf-8?B?MEs0ejk0ZHhwL2JFdENaL29uVm5wTXh5OHU2Z1VIbS9FZUN0VUg1Szg1WklG?= =?utf-8?B?YjB3VkhGLzUwZy9CUDlZUHMvS2p5bWtEaGtWWmE1WXZmdm1HRThPbENwaWQ1?= =?utf-8?B?QlRCS1FqMmw1SmhDdDZHTE1ib1U2MVBTY24vSjlFZTZqdTYxbE1wWGI5NFpS?= =?utf-8?B?MlZ4M1h2d0RWZUFCZ3F4L3NpVG1qei9Jc3pPVElJT0xHc0lGMHRiaGJmdEUr?= =?utf-8?B?cWNHckZmelkweXFPSEhRUVBoUnRQNWFWcmJkWjMydnVCeWpseTRBUllib1Z6?= =?utf-8?B?ellVQTVPVVZEaDFwL0NiakRCWHRBMVdkVFVRY1JSbFFqdE91OGpocVpUMWtT?= =?utf-8?B?MS9KS3dsejFuWFVTdFpiY0hIQTYrVzN2SXV1SzFaaDVxR3o2VzV2QURtWnpO?= =?utf-8?B?MlZKakgxbG4rbEhETVA2UjVDSVY4aVZpblVtT3YzenpwUjVzTnN3WERHYkc4?= =?utf-8?B?azNMQm1vL0V2NnZqZkRwamRKaGFnOEk5aUh5YUxKK2c2YVBUOUZQL1N5anBw?= =?utf-8?B?eHNsYWRvWnluT1ZqcnJMcUExU1lyVmF4TGlkeHRNTW9kbEhQbDY5SVV6bEVG?= =?utf-8?B?cUwvQXZFWWxHc1ZQZ1ZESzh1YVBxMFZQV0N4djc1YlkzbXNkVlM2cU05ZndV?= =?utf-8?B?eFJmVC82WFNaUFNWblhNdkYvS1oyak95VEZNYmtvRnlkUE94dmtSazFDbXhi?= =?utf-8?B?TE9wVEV3VDN1Zmt6UHJOQWp3bDE4dkFIbkdGTXNaay9VVW9OV010ayt5RHlG?= =?utf-8?B?MldTRUFEVlA5cC9ydDQ5V1pXNmU0TU1vQ3RyNG9UYjdPY2pzWThQZmFnVEd1?= =?utf-8?B?MnNUcXduYTlMREx6MWJzdXNhZFliWmJKQ2hQWEtuZy8xdE1NdVBDNGxmdHJi?= =?utf-8?B?RGhBS2I2SDBOSTNUc3FDOFN5VUNlM3dEdyt3QXo4TDVTQkRxZjU2Sjc3SFJo?= =?utf-8?B?NEdRM2t5MDdzUmp1NG9wVEwvZTV4RUVUNEZzZzZVYVJqS1V1dlJDcjd0dVNl?= =?utf-8?B?STNBVzlnK2dOVDVoK1JVa2RXdDg5VXVjcnBiSm00ZGNXNmY2SjVSdUZKK2s1?= =?utf-8?B?ZUFrdUVVT3FCTGpJSmg4OXZxMHV6L1hxZUZaejcxU3Fpdng0TEo5WUd0bFRJ?= =?utf-8?B?RWVhbHJRMHFhRzBZODRPL3hCdnpaMERQN0kyeW9EYzJlWTBIaC9iYytCZ1Nw?= =?utf-8?B?OWxiNmpnaG1VNUNSOGVQOUJnbEhwd1huUDhORzF2TlhPZHJWME5Tdm9YRVNu?= =?utf-8?B?Tk5lSHdONG8yY3MzQ1dTamFPS2dnV1pra2NPVTlyM2hPME5nMVo0dz09?= X-OriginatorOrg: sraoss.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 188641b8-2ef2-4d1d-a1a6-08de48565a17 X-MS-Exchange-CrossTenant-AuthSource: OSZP286MB2160.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Dec 2025 10:21:25.0552 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 75db6c32-352e-4063-ae79-cafb8623f6db X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: WBTMyH9P0rExh0xWfuz315riMQpdCn8E5WGxEIqCdH16grzrppx9SEiDLYeT4jHvJgGSnO+JT+6k2CJ+OMgw3Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7773 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On Tue, 18 Nov 2025 20:15:40 -0500 Peter Geoghegan wrote: > On Tue, Nov 18, 2025 at 2:28 AM Yugo Nagata wrote: > > I've attached a patch that adds the following comment: > > > > + * nextkey determines how the scankey's boundary is interpreted, and backward > > + * indicates a backward scan. See comments in _bt_first for a more detailed > > + * explanation of these fields. > > > > What do think? > > Seems reasonable to me. Thank you for your review. > > I wonder if we also do something about these existing _bt_binsrch comments: > > * On an internal (non-leaf) page, _bt_binsrch() returns the OffsetNumber > * of the last key < given scankey, or last key <= given scankey if nextkey > * is true. (Since _bt_compare treats the first data key of such a page as > * minus infinity, there will be at least one key < scankey, so the result > * always points at one of the keys on the page.) > > Here we describe what happens on an internal page. This is correct, > but *seems* to contradict the higher level comments at the end of > _bt_first. There is actually no contradiction between the two -- not > when you understand that _bt_first describes the whole end-to-end > process of calling _bt_search and then calling _bt_binsrch on the leaf > page (not of calling _bt_binsrch once, against an internal page). > > One could think of this _bt_binsrch internal page behavior as > compensating for the fact that internal pages have pivot tuples that > consist of a separator key (except for the first key, which is just > has a -inf key/no key), plus a downlink that points to the *next* page > after that separator key one level down (except for the internal page > high key, which has no downlink at all). Might be useful to say > something like that instead. > > This is hard to explain without an example. Right now, an internal > page might have pivot tuples that look like this: > > Separator: -inf, Downlink: 1 > Separator: 'a', Downlink: 2 > Separator: 'c', Downlink: 3 > Separator: 'f', Downlink: (none, this is the high key) > > But _bt_binsrch "pretends" that our internal page actually contains: > > Downlink: 1 > Separator: 'a' > Downlink: 2 > Separator: 'c' > Downlink: 3 > Separator: 'f' > > So if our = scan key is (say) 'c', we should descend using the > downlink that points to block 2 (not the one that points to block 3, > as might be expected from looking at the real physical representation > consisting of pivot tuples). That is what the scan needs to do to get > to the page one level down whose high key is also 'c' -- that's where > the scan needs to look. (If the next level down is the leaf level, > then the leaf page we descend to might also contain a *non*-pivot > tuple with the key value 'c', "right before" the high key with 'c', > which the scan will need to return in _bt_readpage. Lehman & Yao allow > the key before a leaf page's high key to be equal to the high key, but > otherwise forbid all duplicate keys.) > > I find it very hard to know what explanation will be the least > confusing to other people, at least in this area. Since you're > interested in this area, I thought I'd ask what you think. I do not see any contradiction between the comment on _bt_binsrch and the comments at the end of _bt_first. The former explicitly states that it refers to internal (non-leaf) pages, and I understand the latter to describe loading data from a leaf page. That said, we could make this clearer by explicitly mentioning the leaf page in the first sentence, for example: * Now load data from the first leaf page of the scan (usually the *page currently in so->currPos.buf). Regards, Yugo Nagata -- Yugo Nagata