Subject: Parameter types are inferred from context of first use only.

From: PG Doc comments form <[email-masked]>
Date: Mon, 23 Jul 2018 09:14:48 +0000

The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/10/static/sql-prepare.html
Description:

Background can be found on the bugs list (pgsql-bug #15289). It was
explained that when a prepared statement parameter needs to have its type
inferred then, should the parameter be used more than once, only the first
use is considered. (The example in that report is that the type of $1 can be
inferred from "($1 = col) or ($1 is null)" but not from "($1 is null) or ($1
= col)".)

The documentation as it stands says only that the parameter's type is
inferred from the context in which it is used. The "first use only" proviso
is not mentioned (hence "context" isn't so broad as to consist of all of the
expressions in which the parameter appears).

---

From: Bruce Momjian <[email-masked]>
Date: Wed, 8 Aug 2018 13:24:44 -0400

> expressions in which the parameter appears).

I have developed the attached patch to cover what you found.

-- 
  Bruce Momjian  <[email-masked]>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

+ As you are, so once was I.  As I am, so you will be. +
+                      Ancient Roman grave inscription +
diff --git a/doc/src/sgml/ref/prepare.sgml b/doc/src/sgml/ref/prepare.sgml
index 704fb5e..4fe9ab7 100644
--- a/doc/src/sgml/ref/prepare.sgml
+++ b/doc/src/sgml/ref/prepare.sgml
@@ -52,7 +52,7 @@ PREPARE <replaceable class="parameter">name</replaceable> [ ( <replaceable class
    parameter data types can optionally be specified. When a
    parameter's data type is not specified or is declared as
    <literal>unknown</literal>, the type is inferred from the context
-   in which the parameter is used (if possible). When executing the
+   in which the parameter is first used (if possible). When executing the
    statement, specify the actual values for these parameters in the
    <command>EXECUTE</command> statement.  Refer to <xref
    linkend="sql-execute"/> for more
@@ -104,7 +104,7 @@ PREPARE <replaceable class="parameter">name</replaceable> [ ( <replaceable class
       The data type of a parameter to the prepared statement.  If the
       data type of a particular parameter is unspecified or is
       specified as <literal>unknown</literal>, it will be inferred
-      from the context in which the parameter is used. To refer to the
+      from the context in which the parameter is first used. To refer to the
       parameters in the prepared statement itself, use
       <literal>$1</literal>, <literal>$2</literal>, etc.
      </para>

---

From: Morgan Owens <[email-masked]>
Date: Thu, 9 Aug 2018 12:18:27 +1200

> I have developed the attached patch to cover what you found.

That says it for me. The third mention of context doesn't need anything 
because it's referring specifically to the (single) use of $2 in the 
example. I have to presume the type inference happens before any 
structural changes that might change the meaning of "first occurrence".

Nick

---

From: Bruce Momjian <[email-masked]>
Date: Thu, 9 Aug 2018 10:14:33 -0400

On Thu, Aug  9, 2018 at 12:18:27PM +1200, Morgan Owens wrote:
> example. I have to presume the type inference happens before any structural
> changes that might change the meaning of "first occurrence".

Great, patch applied through 9.3.  I also changed "used" to
"referenced":

	https://git.postgresql.org/pg/commitdiff/b284262e40424daa1c546ad76f365b31304d7944

---

From: Bruce Momjian <[email-masked]>
Date: Thu, 9 Aug 2018 10:15:27 -0400

> 	https://git.postgresql.org/pg/commitdiff/b284262e40424daa1c546ad76f365b31304d7944

Sorry, reporting credit should have gone to Nick Farmer.