Commit 7c9e2c75 authored by Michael Meskes's avatar Michael Meskes

Fixed error handling in numeric conversion (Joachim).

Further regression cleanup.
parent 8a7a6afe
...@@ -2076,5 +2076,9 @@ Mo Aug 7 14:56:44 CEST 2006 ...@@ -2076,5 +2076,9 @@ Mo Aug 7 14:56:44 CEST 2006
Tu Aug 8 13:26:25 CEST 2006 Tu Aug 8 13:26:25 CEST 2006
- Made parser check for valid copy to/from stdin/stdout combinations. - Made parser check for valid copy to/from stdin/stdout combinations.
We Aug 9 09:28:56 CEST 2006
- Fixed error handling in numeric conversion (Joachim).
- Set ecpg library version to 5.2. - Set ecpg library version to 5.2.
- Set ecpg version to 4.2.1. - Set ecpg version to 4.2.1.
/* $PostgreSQL: pgsql/src/interfaces/ecpg/include/pgtypes_numeric.h,v 1.15 2006/03/11 04:38:39 momjian Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/include/pgtypes_numeric.h,v 1.16 2006/08/09 07:30:56 meskes Exp $ */
#ifndef PGTYPES_NUMERIC #ifndef PGTYPES_NUMERIC
#define PGTYPES_NUMERIC #define PGTYPES_NUMERIC
...@@ -41,7 +41,9 @@ extern "C" ...@@ -41,7 +41,9 @@ extern "C"
#endif #endif
numeric *PGTYPESnumeric_new(void); numeric *PGTYPESnumeric_new(void);
decimal *PGTYPESdecimal_new(void);
void PGTYPESnumeric_free(numeric *); void PGTYPESnumeric_free(numeric *);
void PGTYPESdecimal_free(decimal *);
numeric *PGTYPESnumeric_from_asc(char *, char **); numeric *PGTYPESnumeric_from_asc(char *, char **);
char *PGTYPESnumeric_to_asc(numeric *, int); char *PGTYPESnumeric_to_asc(numeric *, int);
int PGTYPESnumeric_add(numeric *, numeric *, numeric *); int PGTYPESnumeric_add(numeric *, numeric *, numeric *);
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/numeric.c,v 1.28 2006/08/07 13:17:01 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/numeric.c,v 1.29 2006/08/09 07:30:56 meskes Exp $ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include <ctype.h> #include <ctype.h>
...@@ -139,6 +139,18 @@ PGTYPESnumeric_new(void) ...@@ -139,6 +139,18 @@ PGTYPESnumeric_new(void)
return var; return var;
} }
decimal *
PGTYPESdecimal_new(void)
{
decimal *var;
if ((var = (decimal *) pgtypes_alloc(sizeof(decimal))) == NULL)
return NULL;
memset(var, 0, sizeof(decimal));
return var;
}
/* ---------- /* ----------
* set_var_from_str() * set_var_from_str()
* *
...@@ -425,6 +437,12 @@ PGTYPESnumeric_free(numeric *var) ...@@ -425,6 +437,12 @@ PGTYPESnumeric_free(numeric *var)
free(var); free(var);
} }
void
PGTYPESdecimal_free(decimal *var)
{
free(var);
}
/* ---------- /* ----------
* cmp_abs() - * cmp_abs() -
* *
...@@ -1461,12 +1479,13 @@ PGTYPESnumeric_from_double(double d, numeric *dst) ...@@ -1461,12 +1479,13 @@ PGTYPESnumeric_from_double(double d, numeric *dst)
} }
static int static int
numericvar_to_double_no_overflow(numeric *var, double *dp) numericvar_to_double(numeric *var, double *dp)
{ {
char *tmp; char *tmp;
double val; double val;
char *endptr; char *endptr;
numeric *varcopy = PGTYPESnumeric_new(); numeric *varcopy = PGTYPESnumeric_new();
int i;
if (PGTYPESnumeric_copy(var, varcopy) < 0) if (PGTYPESnumeric_copy(var, varcopy) < 0)
return -1; return -1;
...@@ -1474,6 +1493,11 @@ numericvar_to_double_no_overflow(numeric *var, double *dp) ...@@ -1474,6 +1493,11 @@ numericvar_to_double_no_overflow(numeric *var, double *dp)
return -1; return -1;
PGTYPESnumeric_free(varcopy); PGTYPESnumeric_free(varcopy);
/*
* strtod seems to not reset errno to 0 in case of success.
* at least on aome architectures
*/
errno = 0;
val = strtod(tmp, &endptr); val = strtod(tmp, &endptr);
if (errno == ERANGE) if (errno == ERANGE)
{ {
...@@ -1501,7 +1525,7 @@ PGTYPESnumeric_to_double(numeric *nv, double *dp) ...@@ -1501,7 +1525,7 @@ PGTYPESnumeric_to_double(numeric *nv, double *dp)
double tmp; double tmp;
int i; int i;
if ((i = numericvar_to_double_no_overflow(nv, &tmp)) != 0) if ((i = numericvar_to_double(nv, &tmp)) != 0)
return -1; return -1;
*dp = tmp; *dp = tmp;
return 0; return 0;
......
...@@ -24,9 +24,13 @@ ...@@ -24,9 +24,13 @@
#line 7 "num_test2.pgc" #line 7 "num_test2.pgc"
char* nums[] = { "2E394", "-2", ".794", "3.44", "592.49E07", "-32.84e4", char* nums[] = { "2E394", "-2", ".794", "3.44", "592.49E21", "-32.84e4",
"2E-394", ".1E-2", "+.0", "-592.49E-07", "+32.84e-4", "2E-394", ".1E-2", "+.0", "-592.49E-07", "+32.84e-4",
".500001", "-.5000001", ".500001", "-.5000001",
"1234567890123456789012345678.91", /* 30 digits should fit
into decimal */
"1234567890123456789012345678.921", /* 31 digits should NOT
fit into decimal */
NULL}; NULL};
...@@ -39,8 +43,9 @@ main(void) ...@@ -39,8 +43,9 @@ main(void)
char *text="error\n"; char *text="error\n";
char *endptr; char *endptr;
numeric *num, *nin; numeric *num, *nin;
decimal *dec;
long l; long l;
int i, r, k; int i, q, r, k;
double d; double d;
ECPGdebug(1, stderr); ECPGdebug(1, stderr);
...@@ -79,8 +84,9 @@ main(void) ...@@ -79,8 +84,9 @@ main(void)
r = PGTYPESnumeric_from_long(l, nin); r = PGTYPESnumeric_from_long(l, nin);
check_errno(); check_errno();
text = PGTYPESnumeric_to_asc(nin, 2); text = PGTYPESnumeric_to_asc(nin, 2);
r = PGTYPESnumeric_cmp(num, nin); q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,7]: %s (cmp: %d)\n", i, text, r); free(text); printf("num[%d,7]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
} }
r = PGTYPESnumeric_to_int(num, &k); r = PGTYPESnumeric_to_int(num, &k);
...@@ -91,8 +97,9 @@ main(void) ...@@ -91,8 +97,9 @@ main(void)
r = PGTYPESnumeric_from_int(k, nin); r = PGTYPESnumeric_from_int(k, nin);
check_errno(); check_errno();
text = PGTYPESnumeric_to_asc(nin, 2); text = PGTYPESnumeric_to_asc(nin, 2);
r = PGTYPESnumeric_cmp(num, nin); q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,9]: %s (cmp: %d)\n", i, text, r); free(text); printf("num[%d,9]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
} }
r = PGTYPESnumeric_to_double(num, &d); r = PGTYPESnumeric_to_double(num, &d);
...@@ -103,11 +110,28 @@ main(void) ...@@ -103,11 +110,28 @@ main(void)
r = PGTYPESnumeric_from_double(d, nin); r = PGTYPESnumeric_from_double(d, nin);
check_errno(); check_errno();
text = PGTYPESnumeric_to_asc(nin, 2); text = PGTYPESnumeric_to_asc(nin, 2);
r = PGTYPESnumeric_cmp(num, nin); q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,11]: %s (cmp: %d)\n", i, text, r); free(text); printf("num[%d,11]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
} }
/* xxx decimal conversions still missing */ dec = PGTYPESdecimal_new();
r = PGTYPESnumeric_to_decimal(num, dec);
check_errno();
/* we have no special routine for outputting decimal, it would
* convert to a numeric anyway */
printf("num[%d,12]: - (r: %d)\n", i, r);
if (r == 0)
{
r = PGTYPESnumeric_from_decimal(dec, nin);
check_errno();
text = PGTYPESnumeric_to_asc(nin, 2);
q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,13]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
}
PGTYPESdecimal_free(dec);
PGTYPESnumeric_free(nin); PGTYPESnumeric_free(nin);
printf("\n"); printf("\n");
} }
......
...@@ -6,9 +6,13 @@ ...@@ -6,9 +6,13 @@
exec sql include ../regression; exec sql include ../regression;
char* nums[] = { "2E394", "-2", ".794", "3.44", "592.49E07", "-32.84e4", char* nums[] = { "2E394", "-2", ".794", "3.44", "592.49E21", "-32.84e4",
"2E-394", ".1E-2", "+.0", "-592.49E-07", "+32.84e-4", "2E-394", ".1E-2", "+.0", "-592.49E-07", "+32.84e-4",
".500001", "-.5000001", ".500001", "-.5000001",
"1234567890123456789012345678.91", /* 30 digits should fit
into decimal */
"1234567890123456789012345678.921", /* 31 digits should NOT
fit into decimal */
NULL}; NULL};
...@@ -21,8 +25,9 @@ main(void) ...@@ -21,8 +25,9 @@ main(void)
char *text="error\n"; char *text="error\n";
char *endptr; char *endptr;
numeric *num, *nin; numeric *num, *nin;
decimal *dec;
long l; long l;
int i, r, k; int i, q, r, k;
double d; double d;
ECPGdebug(1, stderr); ECPGdebug(1, stderr);
...@@ -61,8 +66,9 @@ main(void) ...@@ -61,8 +66,9 @@ main(void)
r = PGTYPESnumeric_from_long(l, nin); r = PGTYPESnumeric_from_long(l, nin);
check_errno(); check_errno();
text = PGTYPESnumeric_to_asc(nin, 2); text = PGTYPESnumeric_to_asc(nin, 2);
r = PGTYPESnumeric_cmp(num, nin); q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,7]: %s (cmp: %d)\n", i, text, r); free(text); printf("num[%d,7]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
} }
r = PGTYPESnumeric_to_int(num, &k); r = PGTYPESnumeric_to_int(num, &k);
...@@ -73,8 +79,9 @@ main(void) ...@@ -73,8 +79,9 @@ main(void)
r = PGTYPESnumeric_from_int(k, nin); r = PGTYPESnumeric_from_int(k, nin);
check_errno(); check_errno();
text = PGTYPESnumeric_to_asc(nin, 2); text = PGTYPESnumeric_to_asc(nin, 2);
r = PGTYPESnumeric_cmp(num, nin); q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,9]: %s (cmp: %d)\n", i, text, r); free(text); printf("num[%d,9]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
} }
r = PGTYPESnumeric_to_double(num, &d); r = PGTYPESnumeric_to_double(num, &d);
...@@ -85,11 +92,28 @@ main(void) ...@@ -85,11 +92,28 @@ main(void)
r = PGTYPESnumeric_from_double(d, nin); r = PGTYPESnumeric_from_double(d, nin);
check_errno(); check_errno();
text = PGTYPESnumeric_to_asc(nin, 2); text = PGTYPESnumeric_to_asc(nin, 2);
r = PGTYPESnumeric_cmp(num, nin); q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,11]: %s (cmp: %d)\n", i, text, r); free(text); printf("num[%d,11]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
} }
/* xxx decimal conversions still missing */ dec = PGTYPESdecimal_new();
r = PGTYPESnumeric_to_decimal(num, dec);
check_errno();
/* we have no special routine for outputting decimal, it would
* convert to a numeric anyway */
printf("num[%d,12]: - (r: %d)\n", i, r);
if (r == 0)
{
r = PGTYPESnumeric_from_decimal(dec, nin);
check_errno();
text = PGTYPESnumeric_to_asc(nin, 2);
q = PGTYPESnumeric_cmp(num, nin);
printf("num[%d,13]: %s (r: %d - cmp: %d)\n", i, text, r, q);
free(text);
}
PGTYPESdecimal_free(dec);
PGTYPESnumeric_free(nin); PGTYPESnumeric_free(nin);
printf("\n"); printf("\n");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment