regular expressions troubles with char cols

Started by Nonameover 25 years ago3 messages
#1Noname
dbahena@tpv.com.mx

Hi guys !!!!

Just a little question, I'd want to know, if the following situation is
a normal restriction(is should be strange..), or if it's a bug , or maybe
if I'm missing something ...

ventasge2000=# create table t1 (c1 char(10),c2 varchar(10));
CREATE
ventasge2000=# insert into t1 values('XXX666','XXX666');
INSERT 182218 1
ventasge2000=# select * from t1 where c1 ~ '666$';
c1 | c2
----+----
(0 rows)

ventasge2000=# select * from t1 where c2 ~ '666$';
c1 | c2
------------+--------
XXX666 | XXX666
(1 row)

Doesn't regular expressions(in particular the $ metachar) work properly
with char columns????

Thanks in advance

SEYA
Dario Estepario ...

PS: I'm using version 7.02, but I also see this trouble in 7.0

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Noname (#1)
Re: regular expressions troubles with char cols

dbahena@tpv.com.mx writes:

ventasge2000=# create table t1 (c1 char(10),c2 varchar(10));
CREATE
ventasge2000=# insert into t1 values('XXX666','XXX666');
INSERT 182218 1
ventasge2000=# select * from t1 where c1 ~ '666$';
c1 | c2
----+----
(0 rows)
ventasge2000=# select * from t1 where c2 ~ '666$';
c1 | c2
------------+--------
XXX666 | XXX666
(1 row)

Doesn't regular expressions(in particular the $ metachar) work properly
with char columns????

I see no bug there --- you've forgotten about the trailing spaces in
the char(10) column. Try c1 ~ '666 *$' if you want to match against a
variable amount of padding in a char(N) column. But really I'd suggest
using the appropriate datatype to begin with, and evidently char(N) is
not it for your use of this table.

regards, tom lane

#3Zeugswetter Andreas SB
ZeugswetterA@wien.spardat.at
In reply to: Tom Lane (#2)
AW: regular expressions troubles with char cols

dbahena@tpv.com.mx writes:

ventasge2000=# create table t1 (c1 char(10),c2 varchar(10));
CREATE
ventasge2000=# insert into t1 values('XXX666','XXX666');
INSERT 182218 1
ventasge2000=# select * from t1 where c1 ~ '666$';
c1 | c2
----+----
(0 rows)
ventasge2000=# select * from t1 where c2 ~ '666$';
c1 | c2
------------+--------
XXX666 | XXX666
(1 row)

Doesn't regular expressions(in particular the $ metachar)

work properly

with char columns????

I see no bug there --- you've forgotten about the trailing spaces in
the char(10) column. Try c1 ~ '666 *$' if you want to match against a
variable amount of padding in a char(N) column.

No, imho char(n) is defined to return trailing blanks but be insensitive to
the actual amount of trailing spaces. Thus I do see that this behavior can
be interpreted as a bug here.
In char(n) speak 'ab' = 'ab ' is supposed to be true.
Imho a change from char(6) to char(8) should only require more storage
space in a client program, but be otherwise transparent,
which it currently is not.

Imho a similar problem is that char_length does not return the count to
the last non space character, which imho also is a bug.

Andreas