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.94.2) (envelope-from ) id 1rup4Q-007r0M-DW for pgsql-general@arkaria.postgresql.org; Thu, 11 Apr 2024 07:42:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rup4P-00Edtt-JQ for pgsql-general@arkaria.postgresql.org; Thu, 11 Apr 2024 07:42:05 +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.94.2) (envelope-from ) id 1rup4P-00EdtS-5K for pgsql-general@lists.postgresql.org; Thu, 11 Apr 2024 07:42:05 +0000 Received: from mail-ve1eur01on2094.outbound.protection.outlook.com ([40.107.14.94] helo=EUR01-VE1-obe.outbound.protection.outlook.com) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rup4M-000Kzq-I5 for pgsql-general@lists.postgresql.org; Thu, 11 Apr 2024 07:42:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=O45sJZWwo7swO8Un94Avm/4z1bbZ6S1CnI9RZSS5OkSQvO3vLAAVq9yCrrvX/yivGbyS4rik0+ukwGORc6KC2M39CepUKKq0Ft6L0/0agZyWt+m+f1s+v8t0a8q7e3jcrTzNrjrlDwJkrmKVhqvgPSKq7HCuYG9fZI1XI4g/juTeZTuMJytYai9ZCVuyx1HE+MXOVfQbsCwGeMJsW/lFjyRdkGqxtJoZY666JUmdhv9t8HkuJnIIwi9Sui6/xwgiFyEJmL44nJJqEdt8ph4it/jXJIXL7fBeKmYm7NpPOSI2Lvf9ewgx7LmJFf3dFyqHAqeBb75Wr58119J5M8yjPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=SUTqeJto50sGh07YtUvlJaBVKKuDyrPSV7w26CzgmaQ=; b=cWLpcM9LbtqwLIWeCVhgvNi0RTryZSyk6yRybXupsHFserGzwI//hummmeIobhF02P8VHDQZ9BPgADw37KnWCkAXGr6PbMAYoAx9JwLSkhHPzxS6nW38rFTducDVA4up/itdEDkCDsD0kdFkhzQIgnc/cbbSfN9OPbQWG/Dz96bIwiG1kikg27HzlDnlQ44zf5pcmuRVx7uJAinWLUxCbSEzy1mkiyf8WxAP0sa8fzSDQFMMcyGxTyr5nXOy5ZTTWbhwO6OWV1XSH5Ru/wmfSBDRiMderVSBLhSsRX2OPhUkGzoN+980AhMI5Bvikolf0mqO/FpLFwb/f2CgEi3pFg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aqsacom.com; dmarc=pass action=none header.from=aqsacom.com; dkim=pass header.d=aqsacom.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aqsacom2.onmicrosoft.com; s=selector2-aqsacom2-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SUTqeJto50sGh07YtUvlJaBVKKuDyrPSV7w26CzgmaQ=; b=gECtWI32MMzEQUu9Dr/2A9HXbNbwUZwNFvQWZ8gbfGGmO+AwqPEHguPArwLPASX4WHkDM9UWRpUVmAUgfP+IknYJvTLUoqp4iiPTMCu/HE1Y8Fj3YQNlPjXT+lH/AHerFbOdpXVuEKyvDTKHxdZ+T+LPEr/2yX03/tq+07nNKHM= Received: from DUZPR05MB11021.eurprd05.prod.outlook.com (2603:10a6:10:4ad::11) by DU0PR05MB9986.eurprd05.prod.outlook.com (2603:10a6:10:465::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Thu, 11 Apr 2024 07:41:56 +0000 Received: from DUZPR05MB11021.eurprd05.prod.outlook.com ([fe80::182a:5724:453e:8e02]) by DUZPR05MB11021.eurprd05.prod.outlook.com ([fe80::182a:5724:453e:8e02%3]) with mapi id 15.20.7409.053; Thu, 11 Apr 2024 07:41:56 +0000 From: Patrick FICHE To: Jan Behrens , "pgsql-general@lists.postgresql.org" Subject: RE: (When) can a single SQL statement return multiple result sets? Thread-Topic: (When) can a single SQL statement return multiple result sets? Thread-Index: AQHai41BUJdFDY/YcEmbUOeSnse5xrFir5lQ Date: Thu, 11 Apr 2024 07:41:56 +0000 Message-ID: References: <20240410232247.b48cdf2677f87d37b167e140@magnetkern.de> In-Reply-To: <20240410232247.b48cdf2677f87d37b167e140@magnetkern.de> Accept-Language: en-US, fr-FR Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aqsacom.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: DUZPR05MB11021:EE_|DU0PR05MB9986:EE_ x-ms-office365-filtering-correlation-id: 2d80ce41-f4e0-4274-14b0-08dc59fadd35 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: A3+LSvZi9CD2gj7cTEXvKXYHDY6V9u1e517YDXko2CHAnKWvHxiam+8z7Sg8YSz6tTnggKNf8FI1uLJNEjxUOZIuuZWA91mz+LaDgwJYehGkryuhOhrE7o5WL+7R+8hn43YXpwvP91a4io71pCFs4rLQ6LicBHiIsKI1DKjp1rx4ni/Dl7itRRTUObrDxwlmjFpY3T1bo3XRs3fmYq+GF8paxM9nC7QHwOyz4nwevvwbcABu9UVF6meXUNC/HpkBNHgyj0iSqQP7yOYfkUDSSmtTake0TOTzguPuEBSLo2JJY+G2iUqHS+9S5sCDvkepFFE5uzDKXLLph+K4aFRy3nxKZd9JT4IOSjr3T+hOpr7LdchEOAv4f30EHjlG/pWIQXd2fMBBu3i6SXnvc9n9EVkWhVOB2eKimIyotV4b4bz6IPlOtyAHKUaZXYrbJxNh2dZgkLJ8j5WQ8NXQaJFD4AjSyfAHBHPfo+dJRHzhPf/EQKIOHzWM1QT1V8QGTO2RcHy2Bl4T6YrGy85A109L6i+WLUuY1pOGHnL6VyUIovahQaGDMsRHAWUVOFwGiIDo6C2GHSokmd7rY32zz4t+0XiNFGAQHRFGaX26a8LypcrrpjB2MY+z974+sNxHyl4yZyT7Ke6R43tI9vHW36B1iSavIjiUMSN+wUyNEQ9gF1+7anc6nyTW5TQ4Q73nkLQjeUNFzSKcx3klEzYMOWywBg== x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DUZPR05MB11021.eurprd05.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366007)(1800799015)(376005)(38070700009);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?vfZHQKwDCPCEI2VlTBti9TGOFA+NJcgDBtv8mfDaVcJKzKTFVH38TghRup4K?= =?us-ascii?Q?OnbyxWTwNIoWXT1rOuHC4YpoXH7jpywuq5/bbXbf+K1+dFjAYTXgXBBBhvyb?= =?us-ascii?Q?SET1eFclWBOFrRPg8P3PdPMwLNljixj/dKNWfNQRdmoSr84uK7mV5eLpIlT2?= =?us-ascii?Q?v0jwyjAUMQE4EflfnGcFDEafj/Ib/pqsp4nFHfDv55GGs9IxnJh9tf9LzGwh?= =?us-ascii?Q?9DTq6HmsU66LLChUGDWbMj4vyMcP13TZxSG/MC7YG0vWqrAQAPaAtXlETubi?= =?us-ascii?Q?NyKRaoW4x6TZ5PKGZ9VPSDNpSLRWQjh4+OpAMont7xq0owvpNriCL2cMMFO6?= =?us-ascii?Q?1URwBfCDyLov/n16AXSCeLyEFdEVX54buTFZZQ8xOYpBYLMgxUrYJi/28cMQ?= =?us-ascii?Q?OjqFvJ1Upbs8JTvNC9V+8qMo5eXY5QxzQWQodkszVwbi/wQGcHgLrwp55xfN?= =?us-ascii?Q?5VXKDV67+1qTusT0Kq9zLiUzIe3SfyYdIe7e+4aXmT3t1rpVUfXdY3SnfFqB?= =?us-ascii?Q?03vCcit1XiCbhKc61uVTRNvnDlWF6e0/5NnuAk6LhYaiYjyf4J0yOkeX9kb8?= =?us-ascii?Q?vAEjeLwoYGfi4yF69ZxZyP31mwN8oCZwwEnBHqVhvegToY+6+qR0nvr37nEo?= =?us-ascii?Q?pPTdjTQEP3Kno8rzDnbSbZj6ToZMI5jXZE1zbqMZ0MMChAZiuHye/9nc8BYk?= =?us-ascii?Q?yJ06pouiFzzdiYjUi0s7WtjJD7Vrz7VtOXvk0Xk2Qwq4x5X5ttrT9m/lKwH5?= =?us-ascii?Q?pj1YczMkJSalGvc4K7SjfffgraBm59sjm7cvFEuQZemeRePe5uZKh+itYD0O?= =?us-ascii?Q?fNPGRTHUCFg10b/UP/HhRM6ROTBWRndRDcZZjXL5/Cnt1uisgk+pAbOFppE2?= =?us-ascii?Q?i2MrlByMSrCUzMisq1vFweYUgblP99pe/35zN/tDIOdB9XzDrwKiZa9+jJeG?= =?us-ascii?Q?oDQELFklWIBEYlXBSKhAKg1/DIOipims1jEcxDcueh3V14oYdSl/Z3g8lmwk?= =?us-ascii?Q?7EUi5xGhZiV+R8XyhKACwN+fELkjMaXThh6IKc0pBuFBbn6YIjt0z8whPvos?= =?us-ascii?Q?uXnmRjV7UZGh2VCQTxYUCDlXvMeDqY/7FQwn3bTbriMbOe7i6YOCv/5AtkXq?= =?us-ascii?Q?zABC5p6BSMGZHrYqszKL0sDz/WrUNU6YGVZ8nPv1n52f6FgSg2m+qvJvy0Qk?= =?us-ascii?Q?2dAX0Gf60Ttf2Cvp6n9+gDqz4uaKI9UfcKbjHxMofu9JPfWbJ3B0l77QLqdw?= =?us-ascii?Q?I/it8u3mnj83sP39h3mokM9Y/zD7uEMozL5pOobZFFQzJhcXG49+BynB+8l1?= =?us-ascii?Q?1wDvYkxA9bn5hItFqKBPn2NbAqfTwwDfUqKc6O0ZQPD4PUUY6Z+pNy/4siD7?= =?us-ascii?Q?w+CDz1cYV6GUYurC69GWLI9sSNwpVad46G73M8VbYWV70SfKmxRY3jHd0CmV?= =?us-ascii?Q?/I5DPBrnmz1+LHfQWHEs3Fk9/FwvJHNd7SbknYmFkNbLRzH8vv1LBELCKk72?= =?us-ascii?Q?n+O4OIo+sBU3Q0csLOa0pU0w3IRMlExuPLTo8+GIy70D5W7bVTv5cw3ixLa1?= =?us-ascii?Q?UkwGfD4D3h5cf0fCZrOuQD+Rav3dAUdwm7WCS52i?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: aqsacom.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DUZPR05MB11021.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2d80ce41-f4e0-4274-14b0-08dc59fadd35 X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Apr 2024 07:41:56.7657 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 91f6be4c-f21e-43f0-9149-3a24dbb5c188 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 5ywhwfv4iGND6IIU1Oebjum9erXOeR4U8bcXyubBKdmH6HiPfZVEJ61p4dsfFtqcTF1zMq1kH/8PDnFPiAIbHg0+cX2rkNeRPdgNfK3pJyA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR05MB9986 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk -----Original Message----- From: Jan Behrens =20 Sent: Wednesday, April 10, 2024 11:23 PM To: pgsql-general@lists.postgresql.org Subject: (When) can a single SQL statement return multiple result sets? Hello, While writing a PostgreSQL client library for Lua supporting Pipelining (us= ing PQsendQueryParams), I have been wondering if there are any single SQL c= ommands that return multiple result sets. It is indeed possible to create s= uch a case by using the RULE system: db=3D> CREATE VIEW magic AS SELECT; CREATE VIEW db=3D> CREATE RULE r1 AS ON DELETE TO magic db-> DO INSTEAD SELECT 42 AS "answer"; CREATE RULE db=3D> CREATE RULE r2 AS ON DELETE TO magic db-> DO ALSO SELECT 'Hello' AS "col1", 'World!' AS "col2"; CREATE RULE db=3D> DELETE FROM magic; -- single SQL statement! answer -------- 42 (1 row) col1 | col2 =20 -------+-------- Hello | World! (1 row) DELETE 0 Here, "DELETE FROM magic" returns multiple result sets, even though it is o= nly a single SQL statement. (Note that this isn't possible with rules ON SELECT because it is only allo= wed to create a single SELECT rule on a view.) The case outlined above seems to be a somewhat special case. I haven't foun= d any other way to return multiple results (other than sending several semi= colon-separated statements, which is not supported by PQsendQueryParams). S= o is there any (other) case where I reasonably should expect several result= sets returned by PQgetResult (before PQgetResult returns NULL)? Wouldn't i= t make sense to disallow such behavior altogether? And if not, why can't I = write a stored procedure or function that returns multiple result sets? These questions are relevant to me because it may have an effect on the API= design if a statement can return several result sets. Kind regards, Jan Behrens -----Original Message----- Hi, you can declare a function which returns multiple CURSORS... RETURNS SETOF REFCURSOR Then, in your function, you have to write something like this DECLARE rc_1 refcursor; rc_2 refcursor; rc_3 refcursor; ... OPEN rc_1 FOR SELECT ... OPEN rc_2 FOR SELECT ... OPEN rc_3 FOR SELECT ... RETURN NEXT rc_1; RETURN NEXT rc_2; RETURN NEXT rc_3; Regards,