Thread: BUG #5273: Unexpected function behavior/failure

BUG #5273: Unexpected function behavior/failure

From
"Vee"
Date:
The following bug has been logged online:

Bug reference:      5273
Logged by:          Vee
Email address:      sefer@hotmail.com
PostgreSQL version: 8.4.2
Operating system:   Linux
Description:        Unexpected function behavior/failure
Details:

Hi,

I have an odd problem using certain regular expressions (as opposed to any
other function) with PostgreSql 8.4.2, I was hoping you could enlighten me
as to what am I doing wrong.

-- Create the table and populate it.
create table test ( data text );
insert into test
values ('hello'), ('world'), ('bridge');

-- Test query.
select data, upper(data)
from test;

> hello    HELLO
> world    WORLD
> bridge    BRIDGE

-- The problem query
select data, regexp_matches(data, '(h..l)')
from test;

> hello    {hell}

Since I have no "where" clause, I would expect to see all the rows in the
result of the second case, with possibly a NULL value for the non-matched
rows.
But I would not expect a "select" clause to effectively filter out results
for me.

I'd appreciate your input on the matter.

Thanks,
   Vee.

Re: BUG #5273: Unexpected function behavior/failure

From
Tom Lane
Date:
"Vee" <sefer@hotmail.com> writes:
> -- The problem query
> select data, regexp_matches(data, '(h..l)')
> from test;

>> hello    {hell}

> Since I have no "where" clause, I would expect to see all the rows in the
> result of the second case, with possibly a NULL value for the non-matched
> rows.

No.  regexp_matches() returns setof something, meaning a row per match.
When you have no match, you get no rows.  And that in turn means that
the calling select produces no rows --- just as it could also produce
more than one row from a given table row.

I think the behavior you are after is probably more like that of
substring().

            regards, tom lane

Re: BUG #5273: Unexpected function behavior/failure

From
Robert Haas
Date:
On Tue, Jan 12, 2010 at 7:45 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> "Vee" <sefer@hotmail.com> writes:
>> -- The problem query
>> select data, regexp_matches(data, '(h..l)')
>> from test;
>
>>> hello =A0 =A0 =A0 =A0{hell}
>
>> Since I have no "where" clause, I would expect to see all the rows in the
>> result of the second case, with possibly a NULL value for the non-matched
>> rows.
>
> No. =A0regexp_matches() returns setof something, meaning a row per match.
> When you have no match, you get no rows. =A0And that in turn means that
> the calling select produces no rows --- just as it could also produce
> more than one row from a given table row.
>
> I think the behavior you are after is probably more like that of
> substring().

Or maybe the ~ operator.

...Robert