Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1gJKj9-0002eu-ME for pgsql-hackers@arkaria.postgresql.org; Sun, 04 Nov 2018 15:54:15 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1gJKj7-0003M5-NR for pgsql-hackers@arkaria.postgresql.org; Sun, 04 Nov 2018 15:54:13 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1gJKj7-0003Ly-G8 for pgsql-hackers@lists.postgresql.org; Sun, 04 Nov 2018 15:54:13 +0000 Received: from sss.pgh.pa.us ([66.207.139.130]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1gJKj5-0003JT-Tl for pgsql-hackers@postgresql.org; Sun, 04 Nov 2018 15:54:13 +0000 Received: from sss1.sss.pgh.pa.us (localhost [127.0.0.1]) by sss.pgh.pa.us (8.14.4/8.14.4) with ESMTP id wA4Fs5lK007103; Sun, 4 Nov 2018 10:54:05 -0500 From: Tom Lane To: Pavel Stehule cc: Peter Eisentraut , PostgreSQL Hackers Subject: Re: bugfix: BUG #15477: Procedure call with named inout refcursor parameter - "invalid input syntax for type boolean" In-reply-to: References: <1d846492-3822-616b-7246-91b429cc5dbb@2ndquadrant.com> <26116.1541278051@sss.pgh.pa.us> <28551.1541281624@sss.pgh.pa.us> Comments: In-reply-to Pavel Stehule message dated "Sun, 04 Nov 2018 04:44:46 +0100" MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-ID: <7101.1541346845.1@sss.pgh.pa.us> Content-Transfer-Encoding: 8bit Date: Sun, 04 Nov 2018 10:54:05 -0500 Message-ID: <7102.1541346845@sss.pgh.pa.us> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk Pavel Stehule writes: > so 3. 11. 2018 v 22:47 odesílatel Tom Lane napsal: >> So while looking at that ... isn't the behavior for non-writable output >> parameters basically insane? It certainly fails to accord with the >> plpgsql documentation, which shows an example that would throw an error: >> >> CREATE PROCEDURE triple(INOUT x int) >> ... >> CALL triple(5); >> >> It's even weirder that you can get away with not supplying a writable >> target value for an output argument so long as it has a default. >> >> I think the behavior here ought to be "if the actual argument is a plpgsql >> variable, assign the output back to it, otherwise do nothing". That's >> much closer to the behavior of OUT arguments in other old-school >> programming languages. > I don't agree. The constant can be used only for IN parameter. Safe > languages like Ada does copy result to variable used as INOUT parameter. > PL/SQL doesn't allow it too. Well, my main point is that that ISN'T what our current code does, nor does your patch. The reason I'm complaining is that after I rewrote the code to use expand_function_arguments, it started rejecting this existing regression test case: CREATE PROCEDURE test_proc8c(INOUT a int, INOUT b int, INOUT c int DEFAULT 11) ... CALL test_proc8c(_a, _b); I do not think you can argue that that's not broken while simultaneously claiming that this error check promotes safe coding. I looked into SQL:2011 to see what it has to say about this. In 10.4 , syntax rule 9) g) iii) says For each SQL parameter Pi, 1 (one) ≤ i ≤ SRNP, that is an output SQL parameter or both an input SQL parameter and an output SQL parameter, XAi shall be a . The immediately preceding rules make it clear that XAi is the actual argument corresponding to parameter Pi *after* default-insertion and named-argument reordering. So our existing behavior here clearly contradicts the spec: DEFAULT is not a . I couldn't find any really clear statement of what PL/SQL does in this situation, but the docs I did find say that the actual argument for an OUT parameter has to be a variable, with no exceptions mentioned. In short, I think it's a bug that we allow the above. If you want to keep the must-be-a-variable error then it should apply in this case too. regards, tom lane