1- /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.90 2010/01/29 15:57:01 meskes Exp $ */
1+ /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.91 2010/02/02 16:09:11 meskes Exp $ */
22
33/*
44 * The aim is to get a simpler inteface to the database routines.
1717#include "postgres_fe.h"
1818
1919#include <locale.h>
20+ #include <math.h>
2021
2122#include "pg_type.h"
2223
@@ -463,6 +464,38 @@ ecpg_store_result(const PGresult *results, int act_field,
463464 return status ;
464465}
465466
467+ static void
468+ sprintf_double_value (char * ptr , double value , const char * delim )
469+ {
470+ if (isinf (value ))
471+ {
472+ if (value < 0 )
473+ sprintf (ptr , "%s%s" , "-Infinity" , delim );
474+ else
475+ sprintf (ptr , "%s%s" , "Infinity" , delim );
476+ }
477+ else if (isnan (value ))
478+ sprintf (ptr , "%s%s" , "NaN" , delim );
479+ else
480+ sprintf (ptr , "%.14g%s" , value , delim );
481+ }
482+
483+ static void
484+ sprintf_float_value (char * ptr , float value , const char * delim )
485+ {
486+ if (isinf (value ))
487+ {
488+ if (value < 0 )
489+ sprintf (ptr , "%s%s" , "-Infinity" , delim );
490+ else
491+ sprintf (ptr , "%s%s" , "Infinity" , delim );
492+ }
493+ else if (isnan (value ))
494+ sprintf (ptr , "%s%s" , "NaN" , delim );
495+ else
496+ sprintf (ptr , "%.14g%s" , value , delim );
497+ }
498+
466499bool
467500ecpg_store_input (const int lineno , const bool force_indicator , const struct variable * var ,
468501 char * * tobeinserted_p , bool quote )
@@ -693,12 +726,12 @@ ecpg_store_input(const int lineno, const bool force_indicator, const struct vari
693726 strcpy (mallocedval , "array [" );
694727
695728 for (element = 0 ; element < asize ; element ++ )
696- sprintf (mallocedval + strlen (mallocedval ), "%.14g," , ((float * ) var -> value )[element ]);
729+ sprintf_float_value (mallocedval + strlen (mallocedval ), ((float * ) var -> value )[element ], "," );
697730
698731 strcpy (mallocedval + strlen (mallocedval ) - 1 , "]" );
699732 }
700733 else
701- sprintf (mallocedval , "%.14g" , * ((float * ) var -> value ));
734+ sprintf_float_value (mallocedval , * ((float * ) var -> value ), "" );
702735
703736 * tobeinserted_p = mallocedval ;
704737 break ;
@@ -712,12 +745,12 @@ ecpg_store_input(const int lineno, const bool force_indicator, const struct vari
712745 strcpy (mallocedval , "array [" );
713746
714747 for (element = 0 ; element < asize ; element ++ )
715- sprintf (mallocedval + strlen (mallocedval ), "%.14g," , ((double * ) var -> value )[element ]);
748+ sprintf_double_value (mallocedval + strlen (mallocedval ), ((double * ) var -> value )[element ], "," );
716749
717750 strcpy (mallocedval + strlen (mallocedval ) - 1 , "]" );
718751 }
719752 else
720- sprintf (mallocedval , "%.14g" , * ((double * ) var -> value ));
753+ sprintf_double_value (mallocedval , * ((double * ) var -> value ), "" );
721754
722755 * tobeinserted_p = mallocedval ;
723756 break ;
0 commit comments