diff --git a/contrib/seg/expected/seg.out b/contrib/seg/expected/seg.out index cfa8171e68..49f4f7dee5 100644 --- a/contrib/seg/expected/seg.out +++ b/contrib/seg/expected/seg.out @@ -418,8 +418,7 @@ SELECT '1 e7'::seg AS seg; ERROR: bad seg representation DETAIL: syntax error at or near "e" SELECT '1e700'::seg AS seg; -ERROR: syntax error -DETAIL: numeric value 1e700 unrepresentable +ERROR: "1e700" is out of range for type real -- -- testing the operators -- diff --git a/contrib/seg/segparse.y b/contrib/seg/segparse.y index d0c2f188bc..8a3b0b0160 100644 --- a/contrib/seg/segparse.y +++ b/contrib/seg/segparse.y @@ -5,6 +5,8 @@ #include +#include "fmgr.h" +#include "utils/builtins.h" #include "segdata.h" #undef yylex /* failure to redefine yylex will result in calling the */ @@ -129,22 +131,13 @@ deviation: %% -float seg_atof ( char *value ) { - float result; - char *buf = (char *) palloc(256); +float +seg_atof(char *value) +{ + Datum datum; - errno = 0; - sscanf(value, "%f", &result); - - if ( errno ) { - snprintf(buf, 256, "numeric value %s unrepresentable", value); - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("syntax error"), - errdetail("%s", buf))); - } - - return result; + datum = DirectFunctionCall1(float4in, CStringGetDatum(value)); + return DatumGetFloat4(datum); }