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 1wQSgS-001ZZa-0I for pgsql-hackers@arkaria.postgresql.org; Fri, 22 May 2026 16:25:12 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wQSgQ-00Dh7D-08 for pgsql-hackers@arkaria.postgresql.org; Fri, 22 May 2026 16:25:10 +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 1wQSgP-00Dh74-25 for pgsql-hackers@lists.postgresql.org; Fri, 22 May 2026 16:25:10 +0000 Received: from mail-australiaeastazolkn190120002.outbound.protection.outlook.com ([2a01:111:f403:d40d::2] helo=SY5PR01CU010.outbound.protection.outlook.com) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wQSgO-00000000ut0-2LMy for pgsql-hackers@postgresql.org; Fri, 22 May 2026 16:25:10 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bBIyV3RqmIAJipPKaP21luzQQ1ocFLT662z/CM3hM4+dfUazX7sYV66zU3iEDWqVn7+44OTsGRsKnPcbetBfMd1PR+I95CJ2q1HklwHeAC2F9q9rpZ2abZw4cv2mhKe/cxiH1w5Jy+M9o63zbpOzk/IYJzXQZYrT2Rq9jtwIJMfO+6Wjoy/jimObMj7CGJTe+boDvSMaGiqLEwWj1ECJ0rnbxO+p81yJg3DspYR6mjxe8NrZPV1QnMukOxzC29M9jPLSBh41vhPTERnK3HKx+28xp9uTyKwVoQMUx4UTzuyvo5eh06rM5szUlcws1IIiJwaNJo20gjU7b+lmr1jwPA== 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=S1SEI6GjpuyKISq4fBO2B+ry6xjCzniK/5IQviceSrg=; b=CaXypCsPUqT7j8Ezm2BB3n4w0ugU0PoVvHvuSX6SLXlQ7jvI5ky8MwqP5LhFTtlKAf0YXwuZIwxsRKz1Txz9/dVWxe65DoOoVB6ACkVhilVfujb5x5QycDleFeR4avCYC7viJoi9O94dOg67QPiwHJTJj8ubr3OgZLy2Ymy9uF06T/B4VbsyOA2i0UNQZAFX4QLNnj+h5Cyf/qqAATRTjcZTcPs4dWWLzF+7CWHKK0vj343rshU0754oPxRrv4s/E3jdvrF+ScFQiVzjUAndtOCah7wEoY5CZClEKQo8iEQlA66oJDcdUzsx+CrUzWvUHeYo7DNSPXpKn7/xui13Jw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=S1SEI6GjpuyKISq4fBO2B+ry6xjCzniK/5IQviceSrg=; b=jImdgAF3JAbwZOdE672R20ssB9Sbp0dDdkWwd3vXR+qUMWFr7eMPZRxCJ9HJvGIpJynS/qZO11wltf7pbe5z66YSAaHjMC8yieSA8wkGqRKleqRFwsJe/lyqZ0hW6hU3n4gfZQDEZtKUZg/QxH7ElUzT9SPRUWJ9Dn7bhhgkrIIjIbG8lFsqTUmoWJKmZLeGLYTpdyGfuvut7l9I7p6KZ4WP2j3Z43HD6CAfm0vNqgHA2Mt7b5DO/omxrYARJ9E8SoLOzRb94Ml4w+FJtdQGfTowCDnk7tqRBRLUVXFuBhS/kOiHJe9ZeAO1wMaBvaEHMMpeLpSWG5P54EoZJd6RxA== Received: from SY7PR01MB10921.ausprd01.prod.outlook.com (2603:10c6:10:334::16) by SY0PR01MB9310.ausprd01.prod.outlook.com (2603:10c6:10:252::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.48.17; Fri, 22 May 2026 16:24:59 +0000 Received: from SY7PR01MB10921.ausprd01.prod.outlook.com ([fe80::7908:e00:4ab1:d120]) by SY7PR01MB10921.ausprd01.prod.outlook.com ([fe80::7908:e00:4ab1:d120%5]) with mapi id 15.21.0048.013; Fri, 22 May 2026 16:24:59 +0000 From: Japin Li To: Akshay Joshi Cc: jian he , Marcos Pegoraro , Mark Wong , =?utf-8?Q?=C3=81lva?= =?utf-8?Q?ro?= Herrera , pgsql-hackers Subject: Re: [PATCH] Add pg_get_policy_ddl() function to reconstruct CREATE POLICY statement In-Reply-To: (Akshay Joshi's message of "Fri, 22 May 2026 19:02:46 +0530") References: <202510151529.s3fpwsgben57@alvherre.pgsql> User-Agent: mu4e 1.14.1; emacs 30.2 Date: Sat, 23 May 2026 00:24:54 +0800 Message-ID: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4PR01CA0048.jpnprd01.prod.outlook.com (2603:1096:405:372::13) To SY7PR01MB10921.ausprd01.prod.outlook.com (2603:10c6:10:334::16) X-Microsoft-Original-Message-ID: <871pf3fm3t.fsf@hotmail.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SY7PR01MB10921:EE_|SY0PR01MB9310:EE_ X-MS-Office365-Filtering-Correlation-Id: 3fca9e18-03a6-4097-5601-08deb81eaa84 X-Microsoft-Antispam: BCL:0;ARA:14566002|6090799003|55001999006|24021099003|24121999003|22091999003|23021999003|11091999009|12121999013|15080799012|19110799012|5072599009|41001999006|8060799015|52005399003|40105399003|26121999007|3412199025|440099028; X-Microsoft-Antispam-Message-Info: =?utf-8?B?UW5FSUVQRVBSYUJIbXF3czZhZ0krNnR6Mml1WTBDVVhIWm01NUNlVitRQ1k5?= =?utf-8?B?c2ZVcG5uNzFZTlNGMzNkOTFzUlZGdzR2WmIwR0NLSVU5TjlZaXpSN2g5V1VR?= =?utf-8?B?SlplQlJ0S2xta0w2OE5OTWIvWDN0TkYxaTFTaXNVa2ExNjk4L3JyTXRlck5q?= =?utf-8?B?cmV5dm54TFgzQzlxdEhYY29QWk1VUWlwckxQUHEzVjFEU0JiR1JiZG5wcEEy?= =?utf-8?B?YzRFNFJrcTZWZHNqRmhKdjBRYXdIL3F5d0ZURTRPbUdqamtjZi8zaHZaR0Yw?= =?utf-8?B?YnM1bWIxcFBFa2dtb2lFMElycTlRNGEwbWNXL0NIcitTTlh4T05GS2RaNUtw?= =?utf-8?B?a1J6NGZGaU11VEV3enQwRHJrMFNGMlU0MnNtN2ZIZk1Nbjg0L2MvcmRsSFJZ?= =?utf-8?B?WkVYTDlEY05ESndwUTBEQXh5ekZaSlVWeDArdkR4OThlSEVOakZzVnhzMHU3?= =?utf-8?B?OEJ2NjRHNDUyMWJGSjFJRmwwR2NVTVNUVFRwTDVGWU1UTUxyUFBmaU8vQW1T?= =?utf-8?B?Rm80bkR5V1FGWlczKzFjNE8rbmdkWEl1bzhpanNySmZwS0ZsbjNmWnB3bmEr?= =?utf-8?B?eUV2SzA4N1FObDErSUJWOTRhLzg1aU5iQzBKZ2IremdZMy9qQmhHQndzSGlt?= =?utf-8?B?c0wrK3R0RmJUdnV5ZGxOWEJqOU8rWHpjUXgzNlhZZjFlQnBvWU1yaFJOUDEr?= =?utf-8?B?a0tOODNyUTJDdFRFbjdIVHQ0b0Z3dWN5NHNRUXVzNmVYNXB6aGdvZHhuYzBp?= =?utf-8?B?OFo3Q2pqbC91OHpLSlorMHZkN3ZwMUNIMnFjUlZyTklwZEZCUFFtYklINFlq?= =?utf-8?B?NVR1S1pvcXdvcjNPRDJZNmc5UlhvSnloUzY3b0dSdWVXWm5FOEh2dVRLcUlG?= =?utf-8?B?WXc4bWkyaHBpMzBnWUNQMjlkdlFCcm56Z1FjLzM0TkhkL0dEMEFiYkl0T0pk?= =?utf-8?B?alVMUzNTNFpjOFJRUVFSclcxVWlaZGFZbjFkZE96YUV1ekg5Vk5YVjJ3VTcz?= =?utf-8?B?WmdtSW1PWnh2RUk0MVd2SVpzMHZLeEg3aDJISnIrRzlCeEg3NWp3U24zQ1FO?= =?utf-8?B?c25zZTE4SUx4SzhGY0NYK21QMnRQSU15amgyRDhwZE1oQXU2Z3NTYTlaWXpp?= =?utf-8?B?WkhMZWxpWmZZRHpvV2dCRk44ZjYveDd4N3dsMUJKcUVGdzZJNkdpWU03MUpR?= =?utf-8?B?dlk4OGNNZ29XRm1HRHF4S2lBblBZc1FpemhnVG04bGQ1cHd1RGdZS01PN213?= =?utf-8?B?RndIbHNTZEpqSVVHaU15NTZFVHJPMkJramRjWU1YV1d4RUo0UUcweWgzT2FJ?= =?utf-8?B?VU4zZXJiazRZQVBiTG5GMGR4VGRybmVDVDBiTDgxSmlCdTdINk9VMVptV3pF?= =?utf-8?B?emxaRkkzcWlZUk5panJ3NzhFZ2xzVjRPZVpsakZWaFF5aW9vMlh5TmpjeFhQ?= =?utf-8?B?TjlGb0tWamFCU3crRFpFdk9JR1B1dHVJTHYrNVc0UyswQng4NjZkRFFoYm80?= =?utf-8?B?YitwV0dkUzR6elZLQkg3QXhuYlB3dWdPeCtDU01xek92ejczMVFKQ3NzRTI0?= =?utf-8?Q?8tUwGg2Hxummhjq7nqoa3+zUBXI5cPfr4BDc+tg23XPoyo?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?KzBFZkgzcktZdVZxeWxOclVMYm42c0JmSTdhM3FBL2hrVzNVdTJRM24rNkFB?= =?utf-8?B?azRhMnFwbDJlRWN0NVFYSXlKSmdvdmpPYlBtbXJkQXZMbU1KNU14YnJYYjJP?= =?utf-8?B?MkE3SENOc01VM2twSWo4WE0wMkRzVGRYQUNGdEVOdzg1V0NVN1l2Q1BpWmg1?= =?utf-8?B?c0F1U1RFK05MRkU0RU9NUkVWQmV2dEdORTIvcjFtc3NTTU4vWExyT2J3UU9r?= =?utf-8?B?WkEvNktna1BYZTdwV3lJM0tRYklRejVsMkRRVkIrdUEyVG81bVY3S25pMXZB?= =?utf-8?B?YlVOTlE1bU1QRTcrYktZV2oxUXczbnErMVptTDVGeEc2ZnFMMkJyU0J4V2Rw?= =?utf-8?B?eWFrejZmcThYQ3g1UHFXeXhJc0xXZWxjRmhQOGpqbTlKdkRxOXRRcm42ZVR3?= =?utf-8?B?K2dkN2hiaHh3UWhFa2EzSklwUjBLWk5NUkhRaHhWZWRtMHlTSDNzaGdMZUND?= =?utf-8?B?KytSR0I2bWRHdWZNWlZXSmJMQW9lWjF3RStGa09kSVJrSXBZZGk4QUVZZWNL?= =?utf-8?B?dVBPTjNMUTcxTDFVUEJsaGM4NVhsaktWY1pzOVVGRDFPWStSenA0eDg3R1ZB?= =?utf-8?B?UkRCSVNiQlp2cTl4L3p0bjdIRHduWW5PVmpoQzlVVi84OFVLQmRaNUpLMUZB?= =?utf-8?B?QS9pa3NqYUpMc0l3bzBBbW5rUGY2QnlzTVpneHVFWGowdHhtTGx3MmY0UWhk?= =?utf-8?B?K3RnSi93ZzNGa3EyekphZ29zM05kemJmRzVWalZkQU5tQUJZeDAvNkZNc1E0?= =?utf-8?B?dEJZZ05TY01QY3NpWEhPNmFFbFNZczA4Y3AzQXg4RGRGSFNLYU1FaWIvNWJM?= =?utf-8?B?SHViZjNxSE53ZFExQmtzYk1MTVhUaVM2UWxUblR6bDk5OWlnL1pqL003M05V?= =?utf-8?B?aTNOeGN5cWttNVpyVlkyd1VpbDJhSlIrcWhud1F2ZFBSMjV3U2xUcVM5ejQy?= =?utf-8?B?MVovbWIydDl2WG9VRzRxTVZIemNDeUtHNmZSb1ZEaFJrUUJtZnNOend2dFYy?= =?utf-8?B?RXlKOGFNdUIwSkJkQktPSTBXYmtwTkR2WkNNZlJ4QUl1ajk5MUlha2RaaHZy?= =?utf-8?B?SlpBQ3BNMVBSQjJBbkxLRlA4eHlRVXF2L3NvbklGZWVKRlZLcXBmWmFRWEpZ?= =?utf-8?B?NGZKQTRTVkFjS05XWnV5eHI4M2ZDNzJJVlFXeWxCd1pqcE56RThCdVFTcXNZ?= =?utf-8?B?S05Ud0c3clVxbHBlc092T0FqSC9TMExsc2lidnRjWEdYZmJJRFpIdkpYdFNU?= =?utf-8?B?VzIwaWxmdVBRS1FldDFObCtWYWNtZ1YyY0lMcjE4SEs0VUd4MHBWR21IcW5k?= =?utf-8?B?N3Z4bGpYWlRmeTBlN2xyeWYwblA4eExXeDNaVzRDeFlSTVUrUC9JeW42SEs5?= =?utf-8?B?TGNBMWpxUGdYemo0dVdNaTNCVjJsNFIxSnBjclVtVUs2R2ZRSkM4TkNXMEd3?= =?utf-8?B?c0dKcG44d0cyRjdSZFVlVkp3MTVrT3YyVUdoRE9sU1VnUDBrTWhCRUVJZlFT?= =?utf-8?B?ekUxUGdtQ1FwZXpmRkVYUUttdkRkRFJaWWQ3amRSekx0ZE1NcDFiNDRwWURF?= =?utf-8?B?Qk9TQzJqMFNuQ0FqSFVCTE9wVkt3ZmFVWlJMcEMyc1JuaGpaNFNra3AzL3Fq?= =?utf-8?B?VWVYc1pDLysrMzlZNkxWZW9jejhmUGtObTRxUW9Ec2FUelM4dktpR1dYSHNG?= =?utf-8?B?Tlk4aithOFBvTGFzdmRrMnRQSTF0Zyt5N3dIVWZBSlNmWUdFZkRzeHo0MnNC?= =?utf-8?B?c0d5R24xVk5DMmx3KzM0MXdIZHBrM1ZjSlM0OFV4VmxOSU1vUWZhUlpZd3JK?= =?utf-8?B?dENSU1ZTRjM0cFdpbmZndkZnVko4Wk9JWG5pdFV0YzNmVXpjQlNvNFlBR2Ra?= =?utf-8?Q?byQxukTrL4RXn?= X-OriginatorOrg: sct-15-20-9412-4-msonline-outlook-feddd.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: 3fca9e18-03a6-4097-5601-08deb81eaa84 X-MS-Exchange-CrossTenant-AuthSource: SY7PR01MB10921.ausprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 May 2026 16:24:58.8549 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SY0PR01MB9310 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hi, Akshay On Fri, 22 May 2026 at 19:02, Akshay Joshi = wrote: > Hi hackers, = =20 > =20 > > Following the recently committed pg_get_database_ddl(), which adopted a V= ARIADIC options text[] style for > DDL-reconstruction functions, here is a patch in the same spirit for row-= level security policies. > > The new function: > pg_get_policy_ddl(table regclass, policy_name name, VARIADIC options = text[]) RETURNS setof text=20 > > Reconstructs the CREATE POLICY statement for the named policy on the give= n table, returning the result as a single row. > > The currently supported option is pretty (boolean) for formatted output. = =20 > =20 > SELECT * FROM pg_get_policy_ddl('rls_table', 'pol1'); > SELECT * FROM pg_get_policy_ddl('rls_table', 'pol1', 'pretty', 'true'= ); > > NULL inputs for table or policy_name return no rows. Unknown option names= , invalid boolean values, and duplicate options > are reported as errors consistent with the pattern established by pg_get_= database_ddl().=20 > > The patch includes documentation updates in func-info.sgml and regression= tests in rowsecurity.sql covering > PERMISSIVE/RESTRICTIVE, each command type (ALL/SELECT/INSERT/UPDATE/DELET= E), TO role lists, both USING and WITH CHECK > clauses, pretty/non-pretty output, and the error paths above. > > Patch is ready for review. > > On Mon, Jan 5, 2026 at 8:00=E2=80=AFPM jian he wrote: > > On Thu, Nov 20, 2025 at 5:27=E2=80=AFPM Akshay Joshi > wrote: > > > > Attached is the v8 patch for your review, with updated variable names = and a rebase applied. > > > hi. > > + > + > + > + > + pg_get_policy_ddl > + > + pg_get_policy_ddl > + ( table regclass, > policy_name name, > pretty boolean ) > + text > + > + > + Reconstructs the CREATE POLICY statement fro= m the > + system catalogs for a specified table and policy name. The resu= lt is a > + comprehensive CREATE POLICY statement. > + > + > + > > ( table regclass ... > this line is way too long, we can split it into several lines, it > won't affect the appearance. > > like: > pg_get_policy_ddl > ( table regclass, > policy_name name, > pretty > boolean ) > text > > Also, the explanation does not mention that the default value of > pretty is false. > > index 2d946d6d9e9..a5e22374668 100644 > --- a/src/backend/catalog/system_functions.sql > +++ b/src/backend/catalog/system_functions.sql > @@ -657,6 +657,12 @@ LANGUAGE INTERNAL > STRICT VOLATILE PARALLEL UNSAFE > AS 'pg_replication_origin_session_setup'; > > +CREATE OR REPLACE FUNCTION > + pg_get_policy_ddl(tableID regclass, policyName name, pretty bool > DEFAULT false) > +RETURNS text > +LANGUAGE INTERNAL > +AS 'pg_get_policy_ddl'; > + > > The partial upper casing above has no effect; it's the same as > ``pg_get_policy_ddl(tableid regclass, policyname name, pretty bool > DEFAULT false)`` > Thanks for updating the patch. Just one nitpick below. + append_ddl_option(&buf, pretty, 4, "USING (%s)", + TextDatumGetCString(expr)); The expression string already contains the parentheses, so we can omit them here, as well as in the WITH CHECK clause. --=20 Regards, Japin Li ChengDu WenWu Information Technology Co., Ltd.