Thread: Numeric to integer Type conversion

Numeric to integer Type conversion

From
"Saravanan Bellan"
Date:
We have database table with the following columns,

     foo
------------------
name VARCHAR(20)
bar  NUMERIC(20,0)

We were running version 7.2.1 until now.

The following SQL used to work fine in 7.2.1,

SELECT name FROM foo WHERE (bar & 64) <> 0;


Now we upgraded to version 8.1.5 and getting the error,

ERROR:  operator does not exist: numeric & integer
HINT:  No operator matches the given name and argument type(s). You may
need to add explicit type casts.

NUMERIC(20,0) is probably not the best way to define a column to be used
for bit arithmetic, but we cant change the column type because of
legacy.

Is there anyway I can get the existing SQL to work without any changes
on the application side.


Thanks,


Re: Numeric to integer Type conversion

From
"A. Kretschmer"
Date:
am  Tue, dem 23.01.2007, um 23:47:08 -0800 mailte Saravanan Bellan folgendes:
> We have database table with the following columns,
>
>      foo
> ------------------
> name VARCHAR(20)
> bar  NUMERIC(20,0)
>
> We were running version 7.2.1 until now.
>
> The following SQL used to work fine in 7.2.1,
>
> SELECT name FROM foo WHERE (bar & 64) <> 0;
>
>
> Now we upgraded to version 8.1.5 and getting the error,
>
> ERROR:  operator does not exist: numeric & integer
> HINT:  No operator matches the given name and argument type(s). You may
> need to add explicit type casts.
>
> NUMERIC(20,0) is probably not the best way to define a column to be used
> for bit arithmetic, but we cant change the column type because of
> legacy.
>
> Is there anyway I can get the existing SQL to work without any changes
> on the application side.

Try to create a now operator like this:

test=# create table foo (name varchar(20), bar NUMERIC(20,0));
CREATE TABLE
test=*# commit;
COMMIT
test=# create function f_foo(numeric, int) returns int as $$ begin return ($1::int) & $2; end; $$ language 'plpgsql';
CREATE FUNCTION
test=*# create operator & (leftarg = numeric, rightarg = int, procedure = f_foo, commutator = & );
CREATE OPERATOR
test=*# SELECT name FROM foo WHERE (bar & 64) <> 0;
 name
------
(0 rows)



Andreas
--
Andreas Kretschmer
Kontakt:  Heynitz: 035242/47150,   D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID:   0x3FFF606C, privat 0x7F4584DA   http://wwwkeys.de.pgp.net