Обсуждение: BUG #10201: Invalid input accepted with IN expression

Поиск
Список
Период
Сортировка

BUG #10201: Invalid input accepted with IN expression

От
dbaston@gmail.com
Дата:
The following bug has been logged on the website:

Bug reference:      10201
Logged by:          Daniel Baston
Email address:      dbaston@gmail.com
PostgreSQL version: 9.2.2
Operating system:   Windows Server 2012
Description:

If two items in an IN expression are separated by a newline instead of a
comma, those items will be ignored with no error.

CREATE TABLE testing (id varchar(1));
INSERT INTO testing VALUES ('1'), ('2'), ('3'), ('4'), ('5');

-- Missing comma produces a syntax error
SELECT * FROM testing WHERE id IN ('1'  '2', '3');

-- Unless there is a newline
SELECT * FROM testing WHERE id IN ('1'
'2', '3');

 id
----
 3
(1 row)

Re: BUG #10201: Invalid input accepted with IN expression

От
Andres Freund
Дата:
Hi,

On 2014-05-02 20:01:27 +0000, dbaston@gmail.com wrote:
> If two items in an IN expression are separated by a newline instead of a
> comma, those items will be ignored with no error.
>
> CREATE TABLE testing (id varchar(1));
> INSERT INTO testing VALUES ('1'), ('2'), ('3'), ('4'), ('5');
>
> -- Missing comma produces a syntax error
> SELECT * FROM testing WHERE id IN ('1'  '2', '3');
>
> -- Unless there is a newline
> SELECT * FROM testing WHERE id IN ('1'
> '2', '3');

Check what
SELECT '1'
'2';
returns. Two string constants separated by a newline are essentially
concatenated. So, what the above means is: id IN ('12', '3')

Check:
http://www.postgresql.org/docs/current/interactive/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS

Greetings,

Andres Freund

--
 Andres Freund                       http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services

Re: BUG #10201: Invalid input accepted with IN expression

От
Tom Lane
Дата:
dbaston@gmail.com writes:
> If two items in an IN expression are separated by a newline instead of a
> comma, those items will be ignored with no error.

> CREATE TABLE testing (id varchar(1));
> INSERT INTO testing VALUES ('1'), ('2'), ('3'), ('4'), ('5');

> -- Missing comma produces a syntax error
> SELECT * FROM testing WHERE id IN ('1'  '2', '3');

> -- Unless there is a newline
> SELECT * FROM testing WHERE id IN ('1'
> '2', '3');

This is not a bug; what you've got there is the SQL-standard way of
breaking a literal across lines.  Compare

select '1'
'2', '3';
 ?column? | ?column?
----------+----------
 12       | 3
(1 row)

            regards, tom lane

Re: BUG #10201: Invalid input accepted with IN expression

От
Daniel Baston
Дата:
Got it.  Apologies for the false positive.


On Fri, May 2, 2014 at 4:07 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

> dbaston@gmail.com writes:
> > If two items in an IN expression are separated by a newline instead of a
> > comma, those items will be ignored with no error.
>
> > CREATE TABLE testing (id varchar(1));
> > INSERT INTO testing VALUES ('1'), ('2'), ('3'), ('4'), ('5');
>
> > -- Missing comma produces a syntax error
> > SELECT * FROM testing WHERE id IN ('1'  '2', '3');
>
> > -- Unless there is a newline
> > SELECT * FROM testing WHERE id IN ('1'
> > '2', '3');
>
> This is not a bug; what you've got there is the SQL-standard way of
> breaking a literal across lines.  Compare
>
> select '1'
> '2', '3';
>  ?column? | ?column?
> ----------+----------
>  12       | 3
> (1 row)
>
>                         regards, tom lane
>