On Wed, 2021-05-26 at 17:15 +0800, 张元超 wrote:
> I encountered a problem when using PostgreSQL's comparison operators. The 
> problem is as follows:
> Problem Description:
> When I use the comparison operator "!=" as the query condition, such as 
> "select * from t1 where c1 !=-1", the database returns an error: "!=-operator 
> does not exist". Because there is no space
> between ‘=’ and ‘-’, if you enter a space between them, the sql can be 
> executed normally. Therefore, although we can make sql execute normally by 
> adding spaces, its behavior is different from other
> comparison operators (such as ">,<,>=,<=,=,<>"). Other comparisons Operators 
> will not have such problems.
> 
> I guess that this should be because the database did not correctly handle the 
> "!=" operator during sql parsing, so I think this should be a bug. This 
> problem exists in the 11, 12, and 13 versions of
> PostgreSQL.
> 
> At the same time, I tried other databases, such as Oracle, but did not find 
> the same problem.
> Looking forward to your reply.

See this comment in "scan.l":

 /*
  * For SQL compatibility, '+' and '-' cannot be the
  * last char of a multi-char operator unless the operator
  * contains chars that are not in SQL operators.
  * The idea is to lex '=-' as two operators, but not
  * to forbid operator names like '?-' that could not be
  * sequences of SQL operators.
  */

That means that a training minus is only treated as not belonging to
the operator name if the preceding characters belong to a standard SQL
operator name.  Now "<" and ">" are standard operator characters, so
"<>-" is treated as two tokens.
But "!" does not appear in SQL standard operators, so there is no special
processing.

This is a hack to allow constructs like 1<>-2, which are required to
comply with the SQL standard.

If you want this behavior, sitch to standard SQL operator names and
don't use !=.

Yours,
Laurenz Albe
-- 
Cybertec | https://www.cybertec-postgresql.com



Reply via email to