ERROR: operator does not exist: integer !=- integer

Started by William ZHANGalmost 19 years ago6 messages
#1William ZHANG
uniware@zedware.org

Here is the steps to reproduce it in CVS HEAD:

$ uname -a
Linux os-server 2.6.9-11.19AX #1 Fri Aug 5 05:12:07 EDT 2005 i686 i686 i386
GNU/Linux

$ ./postgres --single -D $HOME/pgsql/data postgres

PostgreSQL stand-alone backend 8.3devel
backend> show server_version;
1: server_version (typeid = 25, len = -1, typmod = -1, byval =
f)
----
1: server_version = "8.3devel" (typeid = 25, len = -1, typmod = -1,
byval = f)
----
backend> select -1 != -1;
1: ?column? (typeid = 16, len = 1, typmod = -1, byval = t)
----
1: ?column? = "f" (typeid = 16, len = 1, typmod = -1, byval =
t)
----
backend> select -1 !=-1;
ERROR: operator does not exist: integer !=- integer at character 11
HINT: No operator matches the given name and argument type(s). You might
need to add explicit type casts.
STATEMENT: select -1 !=-1;

A quick hack in scan.l :

*** src/backend/parser/scan.l.old       2007-03-04 11:39:56.831289992 +0800
--- src/backend/parser/scan.l   2007-03-04 11:40:04.142178568 +0800
***************
*** 605,610 ****
--- 605,617 ----
                                        {
                                                int             ic;
+                                               /* filter out operaters end 
with '=' */
+                                               if (yytext[nchars - 2] == 
'=')
+                                               {
+                                                       nchars--;
+                                                       continue;
+                                               }
+
                                                for (ic = nchars-2; ic >= 0; 
ic--)
                                                {
                                                        if 
(strchr("~!@#^&|`?%", yytext[ic]))

Now the result is correct:

backend> select -1 !=-1;
1: ?column? (typeid = 16, len = 1, typmod = -1, byval = t)
----
1: ?column? = "f" (typeid = 16, len = 1, typmod = -1, byval =
t)
----
--
Regards,
William ZHANG

#2Andrew - Supernews
andrew+nonews@supernews.com
In reply to: William ZHANG (#1)
Re: ERROR: operator does not exist: integer !=- integer

On 2007-03-04, William ZHANG <uniware@zedware.org> wrote:

Here is the steps to reproduce it in CVS HEAD:
backend> select -1 !=-1;

This arguably isn't a bug, because != is not a standard SQL operator, and
therefore !=- can legitimately be defined as a single operator by the user.

--
Andrew, Supernews
http://www.supernews.com - individual and corporate NNTP services

#3Shane Ambler
pgsql@Sheeky.Biz
In reply to: Andrew - Supernews (#2)
Re: ERROR: operator does not exist: integer !=- integer

Andrew - Supernews wrote:

On 2007-03-04, William ZHANG <uniware@zedware.org> wrote:

Here is the steps to reproduce it in CVS HEAD:
backend> select -1 !=-1;

This arguably isn't a bug, because != is not a standard SQL operator, and
therefore !=- can legitimately be defined as a single operator by the user.

I missed the first post and can't seem to search for it - so correct me
if I am missing something.

Isn't the problem here a missing space? != is a valid operator and -1 is
the value you are comparing to. !=-1 is not valid but != -1 is correct
and what I assume you are looking to achieve.

The negation operator goes with the int being negated and is not part of
the comparison operator != the space is needed there to separate the two.

--

Shane Ambler
pgSQL@Sheeky.Biz

Get Sheeky @ http://Sheeky.Biz

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: William ZHANG (#1)
Re: ERROR: operator does not exist: integer !=- integer

"William ZHANG" <uniware@zedware.org> writes:

backend> select -1 !=-1;
ERROR: operator does not exist: integer !=- integer at character 11

This is not a bug.

regards, tom lane

#5Joshua D. Drake
jd@commandprompt.com
In reply to: Shane Ambler (#3)
Re: ERROR: operator does not exist: integer !=- integer

I missed the first post and can't seem to search for it - so correct
me if I am missing something.

Isn't the problem here a missing space? != is a valid operator and -1
is the value you are comparing to. !=-1 is not valid but != -1 is
correct and what I assume you are looking to achieve.

Well yes it will work if you add a space, but technically the problem is
the query should be written like this:

1 <>-1 or 1 <> -1

Joshua D. Drake

Show quoted text

The negation operator goes with the int being negated and is not part
of the comparison operator != the space is needed there to separate
the two.

#6William ZHANG
uniware@zedware.org
In reply to: William ZHANG (#1)
Re: ERROR: operator does not exist: integer !=- integer

I get it. scan.l converts '!=' to '<>':

644 /* Convert "!=" operator to "<>" for
compatibility */
645 if (strcmp(yytext, "!=") == 0)
646 yylval.str = pstrdup("<>");
647 else
648 yylval.str = pstrdup(yytext);

""Joshua D. Drake"" <jd@commandprompt.com>

Show quoted text

Well yes it will work if you add a space, but technically the problem is
the query should be written like this:

1 <>-1 or 1 <> -1

Joshua D. Drake