Re: [HACKERS] Divide by zero error on SPARC/Linux. - Mailing list pgsql-hackers

From Keith Parks
Subject Re: [HACKERS] Divide by zero error on SPARC/Linux.
Date
Msg-id 199806222252.XAA28886@mtcc.demon.co.uk
Whole thread Raw
Responses Re: [HACKERS] Divide by zero error on SPARC/Linux.  (Bruce Momjian <maillist@candle.pha.pa.us>)
List pgsql-hackers
Bruce,

That's what I would have half expected too but am I actually using
any floating point arithmetic?

The function called is int4div() which simply does a, return (arg1/arg2),
so I would have expected integer arithmetic.

If I cast to float I get:-

postgres=> select 1::float8/0::float8;
ERROR:  float8div: divide by zero error
postgres=>

The error coming courtesy of :-

        if (*arg2 == 0.0)
                elog(ERROR, "float8div: divide by zero error");

in backend/utils/adt/float.c:604

I'm still puzzled but lean towards a signal problem too.

I do get FP exceptions as there's one in the float8.out regression
test, where there shouldn't be one!!

QUERY: SELECT '' AS bad, : (f.f1) from FLOAT8_TBL f;
ERROR:  floating point exception! The last floating point operation either
exceeded legal ranges or was a divide by zero
QUERY: SELECT '' AS bad, f.f1 / '0.0' from FLOAT8_TBL f;
ERROR:  float8div: divide by zero error


Keith.


Bruce Momjian <maillist@candle.pha.pa.us>
> >
> > Hi All,
> >
> > In the latest CVS I can get the backend to terminate quite
> > easily with a divide by 0.
> >
> > postgres=> select 1/0;
> > pqReadData() -- backend closed the channel unexpectedly.
> >         This probably means the backend terminated abnormally before or
while
> > processing the request.
> > We have lost the connection to the backend, so further processing is
impossible.
> >  Terminating.
> > [postgres@sparclinux pgsql]$
> >
> > A bt on the core shows:-
> >
> > I don't know if this is recently introduced behaviour or if
> > it's platform dependant. I can't recall trying this before
> > so maybe it's always happened on S/Linux.
> >
> > My immediate thought is to include a check for divide by 0
> > in the intXXdiv() functions and do something like an elog(WARN,...)
> >
> > Firstly, what do other people get on their platform?
>
> I get:
>
> ttest=> select 1/0;
> ERROR:  floating point exception! The last floating point operation
> either exceeded legal ranges or was a divide by zero
>
> so it looks like the signal.  Check these lines:
>
> #$ gid FloatExceptionHandler
> backend/postmaster/postmaster.c:1247:   pqsignal(SIGFPE,
FloatExceptionHandler);
> backend/tcop/postgres.c:772: FloatExceptionHandler(SIGNAL_ARGS)
> include/tcop/tcopprot.h:37: extern void FloatExceptionHandler(SIGNAL_ARGS);
>


pgsql-hackers by date:

Previous
From: Brett_McMahon@placerdome.com
Date:
Subject: ...
Next
From: De Clarke
Date:
Subject: SQL queries accessing tables in more than one db