Numeric Datatype

From: "Terence Ingram" <terence(at)socialchange(dot)net(dot)au>
To: <pgsql-bugs(at)postgresql(dot)org>
Subject: Numeric Datatype
Date: 2002-05-23 06:52:19
Message-ID: 045e01c20226$62ca67c0$ab020a0a@socialchange.net.au
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

============================================================================
POSTGRESQL BUG REPORT TEMPLATE
============================================================================

Your name : Terence Ingram
Your email address : terence(at)socialchange(dot)net(dot)au

System Configuration
---------------------
Architecture (example: Intel Pentium) :

Operating System (example: Linux 2.0.26 ELF) : SunOS 5.8
Generic_108528-13 sun4u sparc SUNW,Ultra-4

PostgreSQL version (example: PostgreSQL-7.0): PostgreSQL-7.1

Compiler used (example: gcc 2.8.0) :

Please enter a FULL description of your problem:
------------------------------------------------
I have created a database full of Agency details. The primary table being
agency. Each agency has an id called agency_uid. The datatype of the
agency_uid is numeric(20,0). An extract of the table schema:

Attribute | Type | Modifier
-------------------------------+-------------------------+----------
agency_uid | numeric(20,0) | not null
ou_organization | character varying(255) | not null
other_names | character varying(255) |
.....
.....

The problem occurs when I perform this query:
=> select * from agency where agency_uid = 1018929909863;
=> ERROR: Unable to identify an operator '=' for types 'numeric' and
'float8'
You will have to retype this query using an explicit cast

HOWEVER if I perform this query:
=> select * from agency where agency_uid = 200203210308178296;

I get a response and the relevant agency details are returned.

Some more background data. Currently in my agency table the agency_uid value
basically has either a length of 18 or 13 characters. The above example
testifies to that. The first query with agency_uid = 1018929909863 (13
characters long) fails while the query with agency_uid = 200203210308178296
(18 characters long) succeeds.

I became curious WHY one would succeed and the other generate an error. I
then tested various SELECT statements where the agency_uid had varying
lengths i.e.

select * from agency where agency_uid = 1
select * from agency where agency_uid = 12
select * from agency where agency_uid = 123
....
...
...
select * from agency where agency_uid = 123456789012345678

I discovered an interesting bug.

Basically where the agency_uid [numeric(20,0)] contains say a value with up
to 10 characters it works perfectly. It then fails and produces the error
(Unable to identify an operator '=' for types 'numeric' and 'float8' ...)
when the value contains 11 - 17 characters. Then suprisingly it starts
working again when the value has 18 or more characters in length. I didn't
bother to test past 20.

Why is this so?

Please describe a way to repeat the problem. Please try to provide a
concise reproducible example, if at all possible:
----------------------------------------------------------------------

1) Create the following table:

CREATE TABLE "agency" (
"agency_uid" numeric(20,0) NOT NULL,
"ou_organization" character varying(255) NOT NULL,
"other_names" character varying(255)
);

2) Populate it with some data:

Bear in mind the varying lengths of the agency_uid. So create 20 rows with
varying lengths of digits for the agency_uid. At least create one row with
each agency_uid equaling the length of: 1 - 10 characters, 11 - 17
characters, 18+ characters i.e.

insert into agency values ("12345", "blah blah", "blah blah");
insert into agency values ("1234567890123", "blah blah", "blah blah");
insert into agency values ("12345678901234567890", "blah blah", "blah
blah");

3) Run some simple select queries i.e.

select * from agency where agency_uid = 12345;
select * from agency where agency_uid = 1234567890123;
select * from agency where agency_uid = 12345678901234567890;

The findings should be the same as above.

If you know how this problem might be fixed, list the solution below:
---------------------------------------------------------------------

I have found some work-arounds but no solution that fixes Postgres:

1) When performing a select quote the value i.e. select * from agency
where agency_uid = '12345';

However not an option as we use the same code for accessing Sybase and
Postgres. Sybase doesn't like quoting of integers.

2) I changed the datatype from numeric to bigint and that solved it.

However the solutions are really work arounds and I was hoping to keep the
numeric datatype.

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message krishna 2002-05-23 08:56:18 Problem with Create Database
Previous Message Edwin Groothuis 2002-05-23 04:43:15 Re: Bug #670: netmask displayed for a /32