Thread: [HACKERS] float4 confused as int??

[HACKERS] float4 confused as int??

From
Ed Loehr
Date:
Can someone enlighten me why this error is occurring in which a float
value is apparently being interpreted as an integer?  Known
workarounds??

emsdb=>   UPDATE contract_activity_type SET duration = 3.5, updater_id
= 1, last_update = now() WHERE id = 72;
ERROR:  pg_atoi: error in "3.5": can't parse ".5"
emsdb=> \d contract_activity_type
Table    = contract_activity_type
+----------------------------------+----------------------------------+-------+
|              Field               |              Type
| Length|
+----------------------------------+----------------------------------+-------+
| id                               | int4 not null default nextval (
|     4 |
| contract_id                      | int4 not null
|     4 |
| activity_type_id                 | int4 not null
|     4 |
| travel_required                  | int4 not null
|     4 |
| billable                         | int4 not null
|     4 |
| duration                         | float4 not null
|     4 |
...

Thanks in advance.

Cheers,
Ed Loehr


Re: [HACKERS] float4 confused as int??

From
Tom Lane
Date:
Ed Loehr <eloehr@austin.rr.com> writes:
> emsdb=>   UPDATE contract_activity_type SET duration = 3.5, updater_id
> = 1, last_update = now() WHERE id = 72;
> ERROR:  pg_atoi: error in "3.5": can't parse ".5"

?? What version are you running?  I can't reproduce that with either
6.5.3 or current sources.
        regards, tom lane


Re: [HACKERS] float4 confused as int??

From
Ed Loehr
Date:
Tom Lane wrote:
> 
> Ed Loehr <eloehr@austin.rr.com> writes:
> > emsdb=>   UPDATE contract_activity_type SET duration = 3.5, updater_id
> > = 1, last_update = now() WHERE id = 72;
> > ERROR:  pg_atoi: error in "3.5": can't parse ".5"
> 
> ?? What version are you running?  I can't reproduce that with either
> 6.5.3 or current sources.

6.5.2


Re: [HACKERS] float4 confused as int??

From
Ed Loehr
Date:
Ed Loehr wrote:
> 
> Tom Lane wrote:
> >
> > Ed Loehr <eloehr@austin.rr.com> writes:
> > > emsdb=>   UPDATE contract_activity_type SET duration = 3.5, updater_id
> > > = 1, last_update = now() WHERE id = 72;
> > > ERROR:  pg_atoi: error in "3.5": can't parse ".5"
> >
> > ?? What version are you running?  I can't reproduce that with either
> > 6.5.3 or current sources.
> 
> 6.5.2

This happens only via DBI/DBD::Pg.  I can't reproduce via psql.

Cheers,
Ed Loehr


Re: [HACKERS] float4 confused as int??

From
Ed Loehr
Date:
Ed Loehr wrote:
> 
> Ed Loehr wrote:
> >
> > Tom Lane wrote:
> > >
> > > Ed Loehr <eloehr@austin.rr.com> writes:
> > > > emsdb=>   UPDATE contract_activity_type SET duration = 3.5, updater_id
> > > > = 1, last_update = now() WHERE id = 72;
> > > > ERROR:  pg_atoi: error in "3.5": can't parse ".5"
> > >
> > > ?? What version are you running?  I can't reproduce that with either
> > > 6.5.3 or current sources.
> >
> > 6.5.2
> 
> This happens only via DBI/DBD::Pg.  I can't reproduce via psql.

Not getting enough sleep...

Correction:  DBI or not makes no difference.  I can reproduce it on
*this* table via psql, but I cannot reproduce on a newly created table
with a float column.


Re: [HACKERS] float4 confused as int??

From
Ed Loehr
Date:
The problem is occurring with a database that was restored with psql
from a pg_dump (6.5.2).

If I dump the problem table, then drop/recreate it with my original
table creation commands, and then reload with only the insert commands
from the pg_dump'ed file, it reloads and allows updating of the float
field without a problem.  Testing my entire DB to find other problem
float fields is painful; doing this drop/recreate process would be
even more so. 

As you can see below, this makes no sense given '\d' shows the field
is a float4 yet the code is trying to call pg_atoi on the new value...

I'm still looking into this more to understand what hoops I may have
to jump through to salvage/reuse pg_dump output...any tips would be
appreciated.  

Ed Loehr wrote:
> 
> Can someone enlighten me why this error is occurring in which a float
> value is apparently being interpreted as an integer?  Known
> workarounds??
> 
> emsdb=>   UPDATE contract_activity_type SET duration = 3.5, updater_id
> = 1, last_update = now() WHERE id = 72;
> ERROR:  pg_atoi: error in "3.5": can't parse ".5"
> emsdb=> \d contract_activity_type
> Table    = contract_activity_type
> +----------------------------------+----------------------------------+-------+
> |              Field               |              Type
> | Length|
> +----------------------------------+----------------------------------+-------+
> | id                               | int4 not null default nextval (
> |     4 |
> | contract_id                      | int4 not null
> |     4 |
> | activity_type_id                 | int4 not null
> |     4 |
> | travel_required                  | int4 not null
> |     4 |
> | billable                         | int4 not null
> |     4 |
> | duration                         | float4 not null
> |     4 |
> ...
> 
> Thanks in advance.
> 
> Cheers,
> Ed Loehr


Re: [HACKERS] float4 confused as int??

From
Tom Lane
Date:
Ed Loehr <eloehr@austin.rr.com> writes:
> The problem is occurring with a database that was restored with psql
> from a pg_dump (6.5.2).

> If I dump the problem table, then drop/recreate it with my original
> table creation commands, and then reload with only the insert commands
> from the pg_dump'ed file, it reloads and allows updating of the float
> field without a problem.

OK.  Almost certainly, the data in the table is of no consequence;
the table schema is what matters.  What are your original table
creation commands, and what does pg_dump emit?
        regards, tom lane


Re: [HACKERS] float4 confused as int??

From
Ed Loehr
Date:
Tom Lane wrote:
> 
> Ed Loehr <eloehr@austin.rr.com> writes:
> > The problem is occurring with a database that was restored with psql
> > from a pg_dump (6.5.2).
> 
> > If I dump the problem table, then drop/recreate it with my original
> > table creation commands, and then reload with only the insert commands
> > from the pg_dump'ed file, it reloads and allows updating of the float
> > field without a problem.
> 
> OK.  Almost certainly, the data in the table is of no consequence;
> the table schema is what matters.  What are your original table
> creation commands, and what does pg_dump emit?

I'd hoped to spot an erroneous integer type redefinition of the column
in the pg_dump output, but no such luck.

------------ Original table creation commands: ----------------------
CREATE TABLE contract_activity_type (       id              SERIAL,       contract_id     INTEGER NOT NULL, -- default
frequencyfor
 
planning       activity_type_id INTEGER NOT NULL,-- Ex: "Interviews",
"Coaching", ...        travel_required INTEGER NOT NULL, -- bool: yes/no       billable        INTEGER NOT NULL, --
bool:yes/no       duration        FLOAT4 NOT NULL,  -- how long is the activity
 
in days       participants    INTEGER NOT NULL, -- # of expected
participants       frequency_id    INTEGER NOT NULL,  -- default frequency for
planning       cloned          INTEGER NOT NULL DEFAULT 0, -- bool: yes/no       creator_id      INTEGER NOT NULL
DEFAULT0, -- person id        creation_time   DATETIME NOT NULL DEFAULT now(),       updater_id      INTEGER NOT NULL
DEFAULT0, -- person id        last_update     DATETIME NOT NULL DEFAULT now(),       record_status   INTEGER NOT NULL
DEFAULT1,       PRIMARY KEY (contract_id,activity_type_id)
 
);
CREATE INDEX contract_activity_type_aid ON
contract_activity_type(activity_type_id);
CREATE INDEX contract_activity_type_cid ON
contract_activity_type(contract_id);

------------ pg_dump output: -----------------------------------------
CREATE SEQUENCE "contract_activity_type_id_seq" start 214 increment 1
maxvalue 2147483647 minvalue 1  cache 1 ;
SELECT nextval ('contract_activity_type_id_seq');
CREATE SEQUENCE "contract_activity_type_e_id_seq" start 1386 increment
1 maxvalue 2147483647 minvalue 1  cache 1 ;
SELECT nextval ('contract_activity_type_e_id_seq');
CREATE TABLE "contract_activity_type" (       "id" int4 DEFAULT nextval ( '"contract_activity_type_id_seq"'
) NOT NULL,       "contract_id" int4 NOT NULL,       "activity_type_id" int4 NOT NULL,       "travel_required" int4 NOT
NULL,      "billable" int4 NOT NULL,       "duration" float4 NOT NULL,       "participants" int4 NOT NULL,
"frequency_id"int4 NOT NULL,       "cloned" int4 DEFAULT 0 NOT NULL,       "creator_id" int4 DEFAULT 0 NOT NULL,
"creation_time"datetime DEFAULT now ( ) NOT NULL,       "updater_id" int4 DEFAULT 0 NOT NULL,       "last_update"
datetimeDEFAULT now ( ) NOT NULL,       "record_status" int4 DEFAULT 1 NOT NULL);