Parameter types are inferred from context of first use only.

Started by PG Bug reporting formalmost 8 years ago5 messagesdocs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

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).

#2Bruce Momjian
bruce@momjian.us
In reply to: PG Bug reporting form (#1)
Re: Parameter types are inferred from context of first use only.

On Mon, Jul 23, 2018 at 09:14:48AM +0000, PG Doc comments form wrote:

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).

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

--
Bruce Momjian <bruce@momjian.us> 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 +

Attachments:

prepare.difftext/x-diff; charset=us-asciiDownload+2-2
#3Morgan Owens
packrat@varteg.nz
In reply to: Bruce Momjian (#2)
Re: Parameter types are inferred from context of first use only.

On 2018-08-09 05:24, Bruce Momjian wrote:

On Mon, Jul 23, 2018 at 09:14:48AM +0000, PG Doc comments form wrote:

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).

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

#4Bruce Momjian
bruce@momjian.us
In reply to: Morgan Owens (#3)
Re: Parameter types are inferred from context of first use only.

On Thu, Aug 9, 2018 at 12:18:27PM +1200, Morgan Owens wrote:

On 2018-08-09 05:24, Bruce Momjian wrote:

On Mon, Jul 23, 2018 at 09:14:48AM +0000, PG Doc comments form wrote:

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).

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".

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

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

--
Bruce Momjian <bruce@momjian.us> 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 +
#5Bruce Momjian
bruce@momjian.us
In reply to: Bruce Momjian (#4)
Re: Parameter types are inferred from context of first use only.

On Thu, Aug 9, 2018 at 10:14:33AM -0400, Bruce Momjian wrote:

On Thu, Aug 9, 2018 at 12:18:27PM +1200, Morgan Owens wrote:

On 2018-08-09 05:24, Bruce Momjian wrote:

On Mon, Jul 23, 2018 at 09:14:48AM +0000, PG Doc comments form wrote:

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).

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".

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

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

Sorry, reporting credit should have gone to Nick Farmer.

--
Bruce Momjian <bruce@momjian.us> 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 +