From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Manuel Rigger <rigger(dot)manuel(at)gmail(dot)com> |
Cc: | PostgreSQL mailing lists <pgsql-bugs(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Issue with CHAR column and "column LIKE column" condition |
Date: | 2019-07-08 01:10:27 |
Message-ID: | 20122.1562548227@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
Manuel Rigger <rigger(dot)manuel(at)gmail(dot)com> writes:
> I was surprised by the behavior of LIKE and the CHAR type. Consider
> the following statements:
> CREATE TABLE t0(c0 CHAR(2)) ;
> INSERT INTO t0(c0) VALUES('a');
> SELECT * FROM t0 WHERE c0 LIKE c0; -- expected: fetches the row,
> actual: does not fetch the row
Yeah. That's because LIKE is not, in fact, symmetric.
The available LIKE operators are
regression=# \do ~~
List of operators
Schema | Name | Left arg type | Right arg type | Result type | Description
------------+------+---------------+----------------+-------------+-------------------------
pg_catalog | ~~ | bytea | bytea | boolean | matches LIKE expression
pg_catalog | ~~ | character | text | boolean | matches LIKE expression
pg_catalog | ~~ | name | text | boolean | matches LIKE expression
pg_catalog | ~~ | text | text | boolean | matches LIKE expression
(4 rows)
of which the first and third aren't relevant here, and we end up
choosing "character ~~ text" ... so the pattern side receives a
coercion to text, which strips its trailing blanks, and then you
have
'a '::char(2) ~~ 'a'::text
which doesn't match.
The semantics of char(N) are a mess generally. It's possible that
this particular case would act less surprisingly if we got rid of
the char ~~ text operator (forcing blank-stripping on both sides),
or adding char ~~ char (preventing any blank-stripping), but
probably somebody out there would complain if we did either,
because it'd break some other case.
Generally speaking, PG developers aren't excited about messing
around with the semantics of char(N) --- we think it's a legacy
datatype that you're best off not using. Trying to make it act
less surprisingly would be a lot of work with, most likely,
negative return. Anyone who *is* using it has probably tweaked
their app until they got acceptable results, and would complain
that we broke it.
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Michael Paquier | 2019-07-08 06:01:18 | Re: ALTER TABLE SET WITH OIDS fails after failed CONCURRENTLY index creation |
Previous Message | Manuel Rigger | 2019-07-07 22:42:24 | Issue with CHAR column and "column LIKE column" condition |