Use ISO dates in pgtypeslib by default.
Applied patch by Philip Yarra to fix some thread issues. Added a new data type "decimal" which is mostly the same as our "numeric" but uses a fixed length array to store the digits. This is for compatibility with Informix and maybe others.
This commit is contained in:
parent
f973b74583
commit
2bdd2e5dcf
@ -1533,6 +1533,14 @@ Sun Jun 29 11:22:48 CEST 2003
|
|||||||
around. PostgreSQL numeric type remains the same.
|
around. PostgreSQL numeric type remains the same.
|
||||||
- In INFORMIX_SE mode with autcommit set, make all cursors be "with
|
- In INFORMIX_SE mode with autcommit set, make all cursors be "with
|
||||||
hold". Is this really they way SE behaves?
|
hold". Is this really they way SE behaves?
|
||||||
|
|
||||||
|
Tue Jul 1 11:57:56 CEST 2003
|
||||||
|
|
||||||
|
- Use ISO dates in pgtypeslib by default.
|
||||||
|
- Applied patch by Philip Yarra to fix some thread issues.
|
||||||
|
- Added a new data type "decimal" which is mostly the same as our
|
||||||
|
"numeric" but uses a fixed length array to store the digits. This is
|
||||||
|
for compatibility with Informix and maybe others.
|
||||||
- Set ecpg version to 3.0.0
|
- Set ecpg version to 3.0.0
|
||||||
- Set ecpg library to 4.0.0
|
- Set ecpg library to 4.0.0
|
||||||
- Set pgtypes library to 1.0.0
|
- Set pgtypes library to 1.0.0
|
||||||
|
@ -11,50 +11,115 @@
|
|||||||
|
|
||||||
char * ECPGalloc(long, int);
|
char * ECPGalloc(long, int);
|
||||||
|
|
||||||
/* we start with the numeric functions */
|
static int
|
||||||
int
|
deccall2(Decimal *arg1, Decimal *arg2, int (*ptr)(Numeric *, Numeric *))
|
||||||
decadd(Numeric *arg1, Numeric *arg2, Numeric *sum)
|
|
||||||
{
|
{
|
||||||
Numeric *temp_sum = malloc(sizeof(Numeric)) ;
|
Numeric *a1, *a2;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (temp_sum == NULL)
|
if ((a1 = PGTYPESnumeric_new()) == NULL)
|
||||||
return -1211;
|
return -1211;
|
||||||
|
|
||||||
i = PGTYPESnumeric_add(arg1, arg2, temp_sum);
|
if ((a2 = PGTYPESnumeric_new()) == NULL)
|
||||||
|
|
||||||
if (i == 0) /* No error */
|
|
||||||
{
|
{
|
||||||
|
PGTYPESnumeric_free(a1);
|
||||||
if (PGTYPESnumeric_copy(temp_sum, sum) !=0)
|
|
||||||
return -1211;
|
return -1211;
|
||||||
|
|
||||||
free(temp_sum);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (PGTYPESnumeric_from_decimal(arg1, a1) != 0)
|
||||||
{
|
{
|
||||||
free(temp_sum);
|
PGTYPESnumeric_free(a1);
|
||||||
|
PGTYPESnumeric_free(a2);
|
||||||
if (errno == PGTYPES_NUM_OVERFLOW)
|
return -1211;
|
||||||
return -1200;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1201;
|
if (PGTYPESnumeric_from_decimal(arg2, a2) != 0)
|
||||||
}
|
{
|
||||||
|
PGTYPESnumeric_free(a1);
|
||||||
|
PGTYPESnumeric_free(a2);
|
||||||
|
return -1211;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
i = (*ptr)(a1, a2);
|
||||||
deccmp(Numeric *arg1, Numeric *arg2)
|
|
||||||
{
|
PGTYPESnumeric_free(a1);
|
||||||
int i = PGTYPESnumeric_cmp(arg1, arg2);
|
PGTYPESnumeric_free(a2);
|
||||||
|
|
||||||
return (i);
|
return (i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static int
|
||||||
deccopy(Numeric *src, Numeric *target)
|
deccall3(Decimal *arg1, Decimal *arg2, Decimal *result, int (*ptr)(Numeric *, Numeric *, Numeric *))
|
||||||
{
|
{
|
||||||
PGTYPESnumeric_copy(src, target);
|
Numeric *a1, *a2, *nres;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ((a1 = PGTYPESnumeric_new()) == NULL)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
if ((a2 = PGTYPESnumeric_new()) == NULL)
|
||||||
|
{
|
||||||
|
PGTYPESnumeric_free(a1);
|
||||||
|
return -1211;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nres = PGTYPESnumeric_new()) == NULL)
|
||||||
|
{
|
||||||
|
PGTYPESnumeric_free(a1);
|
||||||
|
PGTYPESnumeric_free(a2);
|
||||||
|
return -1211;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PGTYPESnumeric_from_decimal(arg1, a1) != 0)
|
||||||
|
{
|
||||||
|
PGTYPESnumeric_free(a1);
|
||||||
|
PGTYPESnumeric_free(a2);
|
||||||
|
PGTYPESnumeric_free(nres);
|
||||||
|
return -1211;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PGTYPESnumeric_from_decimal(arg2, a2) != 0)
|
||||||
|
{
|
||||||
|
PGTYPESnumeric_free(a1);
|
||||||
|
PGTYPESnumeric_free(a2);
|
||||||
|
PGTYPESnumeric_free(nres);
|
||||||
|
return -1211;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = (*ptr)(a1, a2, nres);
|
||||||
|
|
||||||
|
if (i == 0) /* No error */
|
||||||
|
PGTYPESnumeric_to_decimal(nres, result);
|
||||||
|
|
||||||
|
PGTYPESnumeric_free(nres);
|
||||||
|
PGTYPESnumeric_free(a1);
|
||||||
|
PGTYPESnumeric_free(a2);
|
||||||
|
|
||||||
|
return (i);
|
||||||
|
}
|
||||||
|
/* we start with the numeric functions */
|
||||||
|
int
|
||||||
|
decadd(Decimal *arg1, Decimal *arg2, Decimal *sum)
|
||||||
|
{
|
||||||
|
deccall3(arg1, arg2, sum, PGTYPESnumeric_add);
|
||||||
|
|
||||||
|
if (errno == PGTYPES_NUM_OVERFLOW)
|
||||||
|
return -1200;
|
||||||
|
else if (errno != 0)
|
||||||
|
return -1201;
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
deccmp(Decimal *arg1, Decimal *arg2)
|
||||||
|
{
|
||||||
|
return(deccall2(arg1, arg2, PGTYPESnumeric_cmp));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
deccopy(Decimal *src, Decimal *target)
|
||||||
|
{
|
||||||
|
memcpy(target, src, sizeof(Decimal));
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
@ -77,12 +142,13 @@ strndup(const char *str, size_t len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
deccvasc(char *cp, int len, Numeric *np)
|
deccvasc(char *cp, int len, Decimal *np)
|
||||||
{
|
{
|
||||||
char *str = strndup(cp, len); /* Numeric_in always converts the complete string */
|
char *str = strndup(cp, len); /* Decimal_in always converts the complete string */
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
Numeric *result;
|
Numeric *result;
|
||||||
|
|
||||||
|
|
||||||
if (!str)
|
if (!str)
|
||||||
ret = -1201;
|
ret = -1201;
|
||||||
else
|
else
|
||||||
@ -102,129 +168,136 @@ deccvasc(char *cp, int len, Numeric *np)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (PGTYPESnumeric_copy(result, np) !=0)
|
if (PGTYPESnumeric_to_decimal(result, np) !=0)
|
||||||
ret = -1211;
|
ret = -1200;
|
||||||
|
|
||||||
free(result);
|
free(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(str);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
deccvdbl(double dbl, Numeric *np)
|
deccvdbl(double dbl, Decimal *np)
|
||||||
{
|
{
|
||||||
return(PGTYPESnumeric_from_double(dbl, np));
|
Numeric *nres = PGTYPESnumeric_new();
|
||||||
}
|
int result = 1;
|
||||||
|
|
||||||
int
|
if (nres == NULL)
|
||||||
deccvint(int in, Numeric *np)
|
|
||||||
{
|
|
||||||
return(PGTYPESnumeric_from_int(in, np));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
deccvlong(long lng, Numeric *np)
|
|
||||||
{
|
|
||||||
return(PGTYPESnumeric_from_long(lng, np));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
decdiv(Numeric *n1, Numeric *n2, Numeric *n3)
|
|
||||||
{
|
|
||||||
Numeric *temp = malloc(sizeof(Numeric));
|
|
||||||
int i, ret = 0;
|
|
||||||
|
|
||||||
if (temp == NULL)
|
|
||||||
return -1211;
|
return -1211;
|
||||||
|
|
||||||
i = PGTYPESnumeric_div(n1, n2, temp);
|
result = PGTYPESnumeric_from_double(dbl, nres);
|
||||||
|
if (result == 0)
|
||||||
|
result = PGTYPESnumeric_to_decimal(nres, np);
|
||||||
|
|
||||||
|
PGTYPESnumeric_free(nres);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
deccvint(int in, Decimal *np)
|
||||||
|
{
|
||||||
|
Numeric *nres = PGTYPESnumeric_new();
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
if (nres == NULL)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
result = PGTYPESnumeric_from_int(in, nres);
|
||||||
|
if (result == 0)
|
||||||
|
result = PGTYPESnumeric_to_decimal(nres, np);
|
||||||
|
|
||||||
|
PGTYPESnumeric_free(nres);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
deccvlong(long lng, Decimal *np)
|
||||||
|
{
|
||||||
|
Numeric *nres = PGTYPESnumeric_new();
|
||||||
|
int result = 1;
|
||||||
|
|
||||||
|
if (nres == NULL)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
result = PGTYPESnumeric_from_long(lng, nres);
|
||||||
|
if (result == 0)
|
||||||
|
result = PGTYPESnumeric_to_decimal(nres, np);
|
||||||
|
|
||||||
|
PGTYPESnumeric_free(nres);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
decdiv(Decimal *n1, Decimal *n2, Decimal *n3)
|
||||||
|
{
|
||||||
|
int i = deccall3(n1, n2, n3, PGTYPESnumeric_div);
|
||||||
|
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
switch (errno)
|
switch (errno)
|
||||||
{
|
{
|
||||||
case PGTYPES_NUM_DIVIDE_ZERO: ret = -1202;
|
case PGTYPES_NUM_DIVIDE_ZERO: return -1202;
|
||||||
break;
|
break;
|
||||||
case PGTYPES_NUM_OVERFLOW: ret = -1200;
|
case PGTYPES_NUM_OVERFLOW: return -1200;
|
||||||
break;
|
break;
|
||||||
default: ret = -1201;
|
default: return -1201;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
if (PGTYPESnumeric_copy(temp, n3) !=0)
|
|
||||||
ret = -1211;
|
|
||||||
|
|
||||||
free(temp);
|
return 0;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
decmul(Numeric *n1, Numeric *n2, Numeric *n3)
|
decmul(Decimal *n1, Decimal *n2, Decimal *n3)
|
||||||
{
|
{
|
||||||
Numeric *temp = malloc(sizeof(Numeric));
|
int i = deccall3(n1, n2, n3, PGTYPESnumeric_mul);
|
||||||
int i, ret = 0;
|
|
||||||
|
|
||||||
if (temp == NULL)
|
|
||||||
return -1211;
|
|
||||||
|
|
||||||
i = PGTYPESnumeric_mul(n1, n2, temp);
|
|
||||||
|
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
switch (errno)
|
switch (errno)
|
||||||
{
|
{
|
||||||
case PGTYPES_NUM_OVERFLOW: ret = -1200;
|
case PGTYPES_NUM_OVERFLOW: return -1200;
|
||||||
break;
|
break;
|
||||||
default: ret = -1201;
|
default: return -1201;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
if (PGTYPESnumeric_copy(temp, n3) !=0)
|
|
||||||
ret = -1211;
|
|
||||||
|
|
||||||
free(temp);
|
return 0;
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
decsub(Numeric *n1, Numeric *n2, Numeric *n3)
|
decsub(Decimal *n1, Decimal *n2, Decimal *n3)
|
||||||
{
|
{
|
||||||
Numeric *temp = malloc(sizeof(Numeric));
|
int i = deccall3(n1, n2, n3, PGTYPESnumeric_sub);
|
||||||
int i, ret = 0;
|
|
||||||
|
|
||||||
if (temp == NULL)
|
|
||||||
return -1211;
|
|
||||||
|
|
||||||
i = PGTYPESnumeric_sub(n1, n2, temp);
|
|
||||||
|
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
switch (errno)
|
switch (errno)
|
||||||
{
|
{
|
||||||
case PGTYPES_NUM_OVERFLOW: ret = -1200;
|
case PGTYPES_NUM_OVERFLOW: return -1200;
|
||||||
break;
|
break;
|
||||||
default: ret = -1201;
|
default: return -1201;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
if (PGTYPESnumeric_copy(temp, n3) !=0)
|
|
||||||
ret = -1211;
|
|
||||||
|
|
||||||
free(temp);
|
return 0;
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
dectoasc(Numeric *np, char *cp, int len, int right)
|
dectoasc(Decimal *np, char *cp, int len, int right)
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
Numeric *nres;
|
||||||
|
|
||||||
|
if (PGTYPESnumeric_from_decimal(np, nres) != 0)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
if (right >= 0)
|
if (right >= 0)
|
||||||
str = PGTYPESnumeric_to_asc(np, right);
|
str = PGTYPESnumeric_to_asc(nres, right);
|
||||||
else
|
else
|
||||||
str = PGTYPESnumeric_to_asc(np, 0);
|
str = PGTYPESnumeric_to_asc(nres, 0);
|
||||||
|
|
||||||
|
PGTYPESnumeric_free(nres);
|
||||||
if (!str)
|
if (!str)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -236,15 +309,36 @@ dectoasc(Numeric *np, char *cp, int len, int right)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
dectodbl(Numeric *np, double *dblp)
|
dectodbl(Decimal *np, double *dblp)
|
||||||
{
|
{
|
||||||
return(PGTYPESnumeric_to_double(np, dblp));
|
Numeric *nres = PGTYPESnumeric_new();;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (nres == NULL)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
if (PGTYPESnumeric_from_decimal(np, nres) != 0)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
i = PGTYPESnumeric_to_double(nres, dblp);
|
||||||
|
PGTYPESnumeric_free(nres);
|
||||||
|
|
||||||
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
dectoint(Numeric *np, int *ip)
|
dectoint(Decimal *np, int *ip)
|
||||||
{
|
{
|
||||||
int ret = PGTYPESnumeric_to_int(np, ip);
|
int ret;
|
||||||
|
Numeric *nres = PGTYPESnumeric_new();
|
||||||
|
|
||||||
|
if (nres == NULL)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
if (PGTYPESnumeric_from_decimal(np, nres) != 0)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
ret = PGTYPESnumeric_to_int(nres, ip);
|
||||||
|
|
||||||
if (ret == PGTYPES_NUM_OVERFLOW)
|
if (ret == PGTYPES_NUM_OVERFLOW)
|
||||||
ret = -1200;
|
ret = -1200;
|
||||||
@ -253,9 +347,18 @@ dectoint(Numeric *np, int *ip)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
dectolong(Numeric *np, long *lngp)
|
dectolong(Decimal *np, long *lngp)
|
||||||
{
|
{
|
||||||
int ret = PGTYPESnumeric_to_long(np, lngp);
|
int ret;
|
||||||
|
Numeric *nres = PGTYPESnumeric_new();;
|
||||||
|
|
||||||
|
if (nres == NULL)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
if (PGTYPESnumeric_from_decimal(np, nres) != 0)
|
||||||
|
return -1211;
|
||||||
|
|
||||||
|
ret = PGTYPESnumeric_to_long(nres, lngp);
|
||||||
|
|
||||||
if (ret == PGTYPES_NUM_OVERFLOW)
|
if (ret == PGTYPES_NUM_OVERFLOW)
|
||||||
ret = -1200;
|
ret = -1200;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.9 2003/06/26 11:37:05 meskes Exp $ */
|
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.10 2003/07/01 12:40:51 meskes Exp $ */
|
||||||
|
|
||||||
#define POSTGRES_ECPG_INTERNAL
|
#define POSTGRES_ECPG_INTERNAL
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
@ -18,15 +18,11 @@ static pthread_mutex_t connections_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|||||||
static struct connection *all_connections = NULL;
|
static struct connection *all_connections = NULL;
|
||||||
static struct connection *actual_connection = NULL;
|
static struct connection *actual_connection = NULL;
|
||||||
|
|
||||||
struct connection *
|
static struct connection *
|
||||||
ECPGget_connection(const char *connection_name)
|
ecpg_get_connection_nr(const char *connection_name)
|
||||||
{
|
{
|
||||||
struct connection *ret = NULL;
|
struct connection *ret = NULL;
|
||||||
|
|
||||||
#ifdef USE_THREADS
|
|
||||||
pthread_mutex_lock(&connections_mutex);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if( (connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0) )
|
if( (connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0) )
|
||||||
{
|
{
|
||||||
ret = actual_connection;
|
ret = actual_connection;
|
||||||
@ -43,11 +39,25 @@ ECPGget_connection(const char *connection_name)
|
|||||||
ret = con;
|
ret = con;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
|
struct connection *
|
||||||
|
ECPGget_connection(const char *connection_name)
|
||||||
|
{
|
||||||
|
struct connection *ret = NULL;
|
||||||
|
#ifdef USE_THREADS
|
||||||
|
pthread_mutex_lock(&connections_mutex);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ret = ecpg_get_connection_nr(connection_name);
|
||||||
|
|
||||||
#ifdef USE_THREADS
|
#ifdef USE_THREADS
|
||||||
pthread_mutex_unlock(&connections_mutex);
|
pthread_mutex_unlock(&connections_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return( ret );
|
return (ret);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -546,7 +556,7 @@ ECPGdisconnect(int lineno, const char *connection_name)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
con = ECPGget_connection(connection_name);
|
con = ecpg_get_connection_nr(connection_name);
|
||||||
|
|
||||||
if (!ECPGinit(con, connection_name, lineno))
|
if (!ECPGinit(con, connection_name, lineno))
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.9 2003/06/26 11:37:05 meskes Exp $ */
|
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.10 2003/07/01 12:40:51 meskes Exp $ */
|
||||||
|
|
||||||
#define POSTGRES_ECPG_INTERNAL
|
#define POSTGRES_ECPG_INTERNAL
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
@ -398,6 +398,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ECPGt_decimal:
|
||||||
case ECPGt_numeric:
|
case ECPGt_numeric:
|
||||||
if (pval)
|
if (pval)
|
||||||
{
|
{
|
||||||
@ -419,7 +420,10 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
|
|||||||
else
|
else
|
||||||
nres = PGTYPESnumeric_from_asc("0.0", &scan_length);
|
nres = PGTYPESnumeric_from_asc("0.0", &scan_length);
|
||||||
|
|
||||||
|
if (type == ECPGt_numeric)
|
||||||
PGTYPESnumeric_copy(nres, (Numeric *)(var + offset * act_tuple));
|
PGTYPESnumeric_copy(nres, (Numeric *)(var + offset * act_tuple));
|
||||||
|
else
|
||||||
|
PGTYPESnumeric_to_decimal(nres, (Decimal *)(var + offset * act_tuple));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_interval:
|
case ECPGt_interval:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.13 2003/06/26 11:37:05 meskes Exp $ */
|
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.14 2003/07/01 12:40:51 meskes Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The aim is to get a simpler inteface to the database routines.
|
* The aim is to get a simpler inteface to the database routines.
|
||||||
@ -820,16 +820,24 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ECPGt_decimal:
|
||||||
case ECPGt_numeric:
|
case ECPGt_numeric:
|
||||||
{
|
{
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
int slen;
|
int slen;
|
||||||
|
Numeric *nval = PGTYPESnumeric_new();
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (var->arrsize > 1)
|
||||||
{
|
{
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < var->arrsize; element++)
|
||||||
{
|
{
|
||||||
str = PGTYPESnumeric_to_asc((Numeric *)((var + var->offset * element)->value), 0);
|
if (var->type == ECPGt_numeric)
|
||||||
|
PGTYPESnumeric_copy((Numeric *)((var + var->offset * element)->value), nval);
|
||||||
|
else
|
||||||
|
PGTYPESnumeric_from_decimal((Decimal *)((var + var->offset * element)->value), nval);
|
||||||
|
|
||||||
|
str = PGTYPESnumeric_to_asc(nval, 0);
|
||||||
|
PGTYPESnumeric_free(nval);
|
||||||
slen = strlen (str);
|
slen = strlen (str);
|
||||||
|
|
||||||
if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + 5, stmt->lineno)))
|
if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + 5, stmt->lineno)))
|
||||||
@ -845,7 +853,14 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
str = PGTYPESnumeric_to_asc((Numeric *)(var->value), 0);
|
if (var->type == ECPGt_numeric)
|
||||||
|
PGTYPESnumeric_copy((Numeric *)(var->value), nval);
|
||||||
|
else
|
||||||
|
PGTYPESnumeric_from_decimal((Decimal *)(var->value), nval);
|
||||||
|
|
||||||
|
str = PGTYPESnumeric_to_asc(nval, 0);
|
||||||
|
|
||||||
|
PGTYPESnumeric_free(nval);
|
||||||
slen = strlen (str);
|
slen = strlen (str);
|
||||||
|
|
||||||
if (!(mallocedval = ECPGalloc(slen + 1, stmt->lineno)))
|
if (!(mallocedval = ECPGalloc(slen + 1, stmt->lineno)))
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.8 2003/06/26 01:45:04 momjian Exp $ */
|
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/misc.c,v 1.9 2003/07/01 12:40:51 meskes Exp $ */
|
||||||
|
|
||||||
#define POSTGRES_ECPG_INTERNAL
|
#define POSTGRES_ECPG_INTERNAL
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
@ -85,6 +85,7 @@ static struct sqlca_t sqlca =
|
|||||||
|
|
||||||
#ifdef USE_THREADS
|
#ifdef USE_THREADS
|
||||||
static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER;
|
static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
static pthread_mutex_t debug_init_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
#endif
|
#endif
|
||||||
static int simple_debug = 0;
|
static int simple_debug = 0;
|
||||||
static FILE *debugstream = NULL;
|
static FILE *debugstream = NULL;
|
||||||
@ -204,7 +205,7 @@ void
|
|||||||
ECPGdebug(int n, FILE *dbgs)
|
ECPGdebug(int n, FILE *dbgs)
|
||||||
{
|
{
|
||||||
#ifdef USE_THREADS
|
#ifdef USE_THREADS
|
||||||
pthread_mutex_lock(&debug_mutex);
|
pthread_mutex_lock(&debug_init_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
simple_debug = n;
|
simple_debug = n;
|
||||||
@ -212,7 +213,7 @@ ECPGdebug(int n, FILE *dbgs)
|
|||||||
ECPGlog("ECPGdebug: set to %d\n", simple_debug);
|
ECPGlog("ECPGdebug: set to %d\n", simple_debug);
|
||||||
|
|
||||||
#ifdef USE_THREADS
|
#ifdef USE_THREADS
|
||||||
pthread_mutex_unlock(&debug_mutex);
|
pthread_mutex_unlock(&debug_init_mutex);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,6 +242,7 @@ ECPGlog(const char *format,...)
|
|||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vfprintf(debugstream, f, ap);
|
vfprintf(debugstream, f, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
fflush(debugstream);
|
||||||
|
|
||||||
ECPGfree(f);
|
ECPGfree(f);
|
||||||
}
|
}
|
||||||
@ -287,6 +289,9 @@ ECPGset_informix_null(enum ECPGttype type, void *ptr)
|
|||||||
case ECPGt_varchar:
|
case ECPGt_varchar:
|
||||||
*(((struct ECPGgeneric_varchar *) ptr)->arr) = 0x00;
|
*(((struct ECPGgeneric_varchar *) ptr)->arr) = 0x00;
|
||||||
break;
|
break;
|
||||||
|
case ECPGt_decimal:
|
||||||
|
((Decimal *) ptr)->sign = NUMERIC_NAN;
|
||||||
|
break;
|
||||||
case ECPGt_numeric:
|
case ECPGt_numeric:
|
||||||
((Numeric *) ptr)->sign = NUMERIC_NAN;
|
((Numeric *) ptr)->sign = NUMERIC_NAN;
|
||||||
break;
|
break;
|
||||||
@ -345,6 +350,9 @@ ECPGis_informix_null(enum ECPGttype type, void *ptr)
|
|||||||
case ECPGt_varchar:
|
case ECPGt_varchar:
|
||||||
if (*(((struct ECPGgeneric_varchar *) ptr)->arr) == 0x00) return true;
|
if (*(((struct ECPGgeneric_varchar *) ptr)->arr) == 0x00) return true;
|
||||||
break;
|
break;
|
||||||
|
case ECPGt_decimal:
|
||||||
|
if (((Decimal *) ptr)->sign == NUMERIC_NAN) return true;
|
||||||
|
break;
|
||||||
case ECPGt_numeric:
|
case ECPGt_numeric:
|
||||||
if (((Numeric *) ptr)->sign == NUMERIC_NAN) return true;
|
if (((Numeric *) ptr)->sign == NUMERIC_NAN) return true;
|
||||||
break;
|
break;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.7 2003/06/20 12:01:46 meskes Exp $ */
|
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.8 2003/07/01 12:40:51 meskes Exp $ */
|
||||||
|
|
||||||
#define POSTGRES_ECPG_INTERNAL
|
#define POSTGRES_ECPG_INTERNAL
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
@ -48,6 +48,8 @@ ECPGtype_name(enum ECPGttype typ)
|
|||||||
return "varchar";
|
return "varchar";
|
||||||
case ECPGt_char_variable:
|
case ECPGt_char_variable:
|
||||||
return "char";
|
return "char";
|
||||||
|
case ECPGt_decimal:
|
||||||
|
return "Decimal";
|
||||||
case ECPGt_numeric:
|
case ECPGt_numeric:
|
||||||
return "Numeric";
|
return "Numeric";
|
||||||
case ECPGt_date:
|
case ECPGt_date:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include <pgtypes_numeric.h>
|
#include <pgtypes_numeric.h>
|
||||||
|
|
||||||
#ifndef dec_t
|
#ifndef dec_t
|
||||||
#define dec_t Numeric
|
#define dec_t Decimal
|
||||||
#endif /* dec_t */
|
#endif /* dec_t */
|
||||||
|
|
||||||
int decadd(dec_t *, dec_t *, dec_t *);
|
int decadd(dec_t *, dec_t *, dec_t *);
|
||||||
|
@ -44,8 +44,8 @@ enum ECPGttype
|
|||||||
ECPGt_bool,
|
ECPGt_bool,
|
||||||
ECPGt_float, ECPGt_double,
|
ECPGt_float, ECPGt_double,
|
||||||
ECPGt_varchar, ECPGt_varchar2,
|
ECPGt_varchar, ECPGt_varchar2,
|
||||||
ECPGt_numeric,
|
ECPGt_numeric, /* this is a decimal that stores its digits in a malloced array */
|
||||||
ECPGt_decimal, /* only used internally */
|
ECPGt_decimal, /* this is a decimal that stores its digits in a fixed array */
|
||||||
ECPGt_date,
|
ECPGt_date,
|
||||||
ECPGt_timestamp,
|
ECPGt_timestamp,
|
||||||
ECPGt_interval,
|
ECPGt_interval,
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
#define NUMERIC_MIN_DISPLAY_SCALE 0
|
#define NUMERIC_MIN_DISPLAY_SCALE 0
|
||||||
#define NUMERIC_MIN_SIG_DIGITS 16
|
#define NUMERIC_MIN_SIG_DIGITS 16
|
||||||
|
|
||||||
|
#define DECSIZE 30
|
||||||
|
|
||||||
typedef unsigned char NumericDigit;
|
typedef unsigned char NumericDigit;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -21,7 +23,17 @@ typedef struct
|
|||||||
NumericDigit *digits; /* decimal digits */
|
NumericDigit *digits; /* decimal digits */
|
||||||
} Numeric;
|
} Numeric;
|
||||||
|
|
||||||
Numeric *PGTYPESnew(void);
|
typedef struct
|
||||||
|
{
|
||||||
|
int ndigits; /* number of digits in digits[] - can be 0! */
|
||||||
|
int weight; /* weight of first digit */
|
||||||
|
int rscale; /* result scale */
|
||||||
|
int dscale; /* display scale */
|
||||||
|
int sign; /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */
|
||||||
|
NumericDigit digits[DECSIZE]; /* decimal digits */
|
||||||
|
} Decimal;
|
||||||
|
|
||||||
|
Numeric *PGTYPESnumeric_new(void);
|
||||||
void PGTYPESnumeric_free(Numeric *);
|
void PGTYPESnumeric_free(Numeric *);
|
||||||
Numeric *PGTYPESnumeric_from_asc(char *, char **);
|
Numeric *PGTYPESnumeric_from_asc(char *, char **);
|
||||||
char *PGTYPESnumeric_to_asc(Numeric *, int);
|
char *PGTYPESnumeric_to_asc(Numeric *, int);
|
||||||
@ -37,5 +49,7 @@ int PGTYPESnumeric_from_double(double, Numeric *);
|
|||||||
int PGTYPESnumeric_to_double(Numeric *, double *);
|
int PGTYPESnumeric_to_double(Numeric *, double *);
|
||||||
int PGTYPESnumeric_to_int(Numeric *, int *);
|
int PGTYPESnumeric_to_int(Numeric *, int *);
|
||||||
int PGTYPESnumeric_to_long(Numeric *, long *);
|
int PGTYPESnumeric_to_long(Numeric *, long *);
|
||||||
|
int PGTYPESnumeric_to_decimal(Numeric *, Decimal *);
|
||||||
|
int PGTYPESnumeric_from_decimal(Decimal *, Numeric *);
|
||||||
|
|
||||||
#endif /* PGTYPES_NUMERIC */
|
#endif /* PGTYPES_NUMERIC */
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#define CLONGTYPE ECPGt_long
|
#define CLONGTYPE ECPGt_long
|
||||||
#define CFLOATTYPE ECPGt_float
|
#define CFLOATTYPE ECPGt_float
|
||||||
#define CDOUBLETYPE ECPGt_double
|
#define CDOUBLETYPE ECPGt_double
|
||||||
#define CDECIMALTYPE ECPGt_numeric
|
#define CDECIMALTYPE ECPGt_decimal
|
||||||
#define CFIXCHARTYPE 108
|
#define CFIXCHARTYPE 108
|
||||||
#define CSTRINGTYPE ECPGt_char
|
#define CSTRINGTYPE ECPGt_char
|
||||||
#define CDATETYPE ECPGt_date
|
#define CDATETYPE ECPGt_date
|
||||||
|
@ -126,7 +126,7 @@ alloc_var(Numeric *var, int ndigits)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Numeric *
|
Numeric *
|
||||||
PGTYPESnew(void)
|
PGTYPESnumeric_new(void)
|
||||||
{
|
{
|
||||||
Numeric *var;
|
Numeric *var;
|
||||||
|
|
||||||
@ -1489,3 +1489,45 @@ PGTYPESnumeric_to_long(Numeric* nv, long* lp) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
PGTYPESnumeric_to_decimal(Numeric *src, Decimal *dst) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (src->ndigits > DECSIZE) {
|
||||||
|
errno = PGTYPES_NUM_OVERFLOW;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dst->weight = src->weight;
|
||||||
|
dst->rscale = src->rscale;
|
||||||
|
dst->dscale = src->dscale;
|
||||||
|
dst->sign = src->sign;
|
||||||
|
dst->ndigits = src->ndigits;
|
||||||
|
|
||||||
|
for (i = 0; i < src->ndigits; i++) {
|
||||||
|
dst->digits[i] = src->digits[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
PGTYPESnumeric_from_decimal(Decimal *src, Numeric *dst) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
zero_var(dst);
|
||||||
|
|
||||||
|
dst->weight = src->weight;
|
||||||
|
dst->rscale = src->rscale;
|
||||||
|
dst->dscale = src->dscale;
|
||||||
|
dst->sign = src->sign;
|
||||||
|
|
||||||
|
if (alloc_var(dst, src->ndigits) != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (i = 0; i < src->ndigits; i++) {
|
||||||
|
dst->digits[i] = src->digits[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -341,7 +341,7 @@ PGTYPEStimestamp_to_asc(Timestamp tstamp)
|
|||||||
char buf[MAXDATELEN + 1];
|
char buf[MAXDATELEN + 1];
|
||||||
char *tzn = NULL;
|
char *tzn = NULL;
|
||||||
fsec_t fsec;
|
fsec_t fsec;
|
||||||
int DateStyle = 0;
|
int DateStyle = 1; /* this defaults to ISO_DATES, shall we make it an option? */
|
||||||
|
|
||||||
if (TIMESTAMP_NOT_FINITE(tstamp))
|
if (TIMESTAMP_NOT_FINITE(tstamp))
|
||||||
EncodeSpecialTimestamp(tstamp, buf);
|
EncodeSpecialTimestamp(tstamp, buf);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.243 2003/06/29 16:52:58 meskes Exp $ */
|
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.244 2003/07/01 12:40:51 meskes Exp $ */
|
||||||
|
|
||||||
/* Copyright comment */
|
/* Copyright comment */
|
||||||
%{
|
%{
|
||||||
@ -4453,7 +4453,7 @@ single_vt_type: common_type
|
|||||||
else if (strcmp($1, "decimal") == 0)
|
else if (strcmp($1, "decimal") == 0)
|
||||||
{
|
{
|
||||||
$$.type_enum = ECPGt_decimal;
|
$$.type_enum = ECPGt_decimal;
|
||||||
$$.type_str = make_str("Numeric");
|
$$.type_str = make_str("Decimal");
|
||||||
$$.type_dimension = make_str("-1");
|
$$.type_dimension = make_str("-1");
|
||||||
$$.type_index = make_str("-1");
|
$$.type_index = make_str("-1");
|
||||||
$$.type_sizeof = NULL;
|
$$.type_sizeof = NULL;
|
||||||
@ -4751,11 +4751,19 @@ common_type: simple_type
|
|||||||
}
|
}
|
||||||
| ECPGColLabelCommon '(' precision opt_scale ')'
|
| ECPGColLabelCommon '(' precision opt_scale ')'
|
||||||
{
|
{
|
||||||
if (strcmp($1, "numeric") != 0 && strcmp($1, "decimal") != 0)
|
if (strcmp($1, "numeric") == 0)
|
||||||
|
{
|
||||||
|
$$.type_enum = ECPGt_numeric;
|
||||||
|
$$.type_str = make_str("Numeric");
|
||||||
|
}
|
||||||
|
else if (strcmp($1, "decimal") == 0)
|
||||||
|
{
|
||||||
|
$$.type_enum = ECPGt_decimal;
|
||||||
|
$$.type_str = make_str("Decimal");
|
||||||
|
}
|
||||||
|
else
|
||||||
mmerror(PARSE_ERROR, ET_ERROR, "Only numeric/decimal have precision/scale argument");
|
mmerror(PARSE_ERROR, ET_ERROR, "Only numeric/decimal have precision/scale argument");
|
||||||
|
|
||||||
$$.type_enum = (strcmp($1, "numeric") != 0) ? ECPGt_decimal : ECPGt_numeric;
|
|
||||||
$$.type_str = make_str("Numeric");
|
|
||||||
$$.type_dimension = make_str("-1");
|
$$.type_dimension = make_str("-1");
|
||||||
$$.type_index = make_str("-1");
|
$$.type_index = make_str("-1");
|
||||||
$$.type_sizeof = NULL;
|
$$.type_sizeof = NULL;
|
||||||
@ -4807,7 +4815,7 @@ var_type: common_type
|
|||||||
else if (strcmp($1, "decimal") == 0)
|
else if (strcmp($1, "decimal") == 0)
|
||||||
{
|
{
|
||||||
$$.type_enum = ECPGt_decimal;
|
$$.type_enum = ECPGt_decimal;
|
||||||
$$.type_str = make_str("Numeric");
|
$$.type_str = make_str("Deciaml");
|
||||||
$$.type_dimension = make_str("-1");
|
$$.type_dimension = make_str("-1");
|
||||||
$$.type_index = make_str("-1");
|
$$.type_index = make_str("-1");
|
||||||
$$.type_sizeof = NULL;
|
$$.type_sizeof = NULL;
|
||||||
@ -5076,21 +5084,6 @@ variable: opt_pointer ECPGColLabelCommon opt_array_bounds opt_initializer
|
|||||||
$$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
|
$$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_decimal: /* this is used by informix and need to be initialized */
|
|
||||||
if (atoi(dimension) < 0)
|
|
||||||
type = ECPGmake_simple_type(ECPGt_numeric, make_str("1"));
|
|
||||||
else
|
|
||||||
type = ECPGmake_array_type(ECPGmake_simple_type(ECPGt_numeric, make_str("1")), dimension);
|
|
||||||
|
|
||||||
if (strlen($4) == 0)
|
|
||||||
{
|
|
||||||
$4 = mm_alloc(sizeof(" = {0, 0, 0, 0, 0, NULL, NULL}"));
|
|
||||||
strcpy($4, " = {0, 0, 0, 0, 0, NULL, NULL}");
|
|
||||||
}
|
|
||||||
|
|
||||||
$$ = cat_str(4, $1, mm_strdup($2), $3.str, $4);
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
if (atoi(dimension) < 0)
|
if (atoi(dimension) < 0)
|
||||||
type = ECPGmake_simple_type(actual_type[struct_level].type_enum, make_str("1"));
|
type = ECPGmake_simple_type(actual_type[struct_level].type_enum, make_str("1"));
|
||||||
|
@ -172,6 +172,9 @@ get_type(enum ECPGttype type)
|
|||||||
case ECPGt_const: /* constant string quoted */
|
case ECPGt_const: /* constant string quoted */
|
||||||
return ("ECPGt_const");
|
return ("ECPGt_const");
|
||||||
break;
|
break;
|
||||||
|
case ECPGt_decimal:
|
||||||
|
return ("ECPGt_decimal");
|
||||||
|
break;
|
||||||
case ECPGt_numeric:
|
case ECPGt_numeric:
|
||||||
return ("ECPGt_numeric");
|
return ("ECPGt_numeric");
|
||||||
break;
|
break;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Makefile,v 1.37 2003/06/25 10:44:21 meskes Exp $
|
# $Header: /cvsroot/pgsql/src/interfaces/ecpg/test/Makefile,v 1.38 2003/07/01 12:40:52 meskes Exp $
|
||||||
|
|
||||||
subdir = src/interfaces/ecpg/test
|
subdir = src/interfaces/ecpg/test
|
||||||
top_builddir = ../../../..
|
top_builddir = ../../../..
|
||||||
@ -22,7 +22,7 @@ test_informix: test_informix.o
|
|||||||
$(ECPG) $<
|
$(ECPG) $<
|
||||||
|
|
||||||
test_informix.c: test_informix.pgc
|
test_informix.c: test_informix.pgc
|
||||||
$(ECPG) -C INFORMIX $<
|
$(ECPG) -C INFORMIX -r no_indicator $<
|
||||||
clean:
|
clean:
|
||||||
rm -f $(TESTS) $(TESTS:%=%.o) $(TESTS:%=%.c) log
|
rm -f $(TESTS) $(TESTS:%=%.o) $(TESTS:%=%.c) log
|
||||||
|
|
||||||
|
@ -18,16 +18,16 @@ main()
|
|||||||
exec sql whenever sqlerror do sqlprint();
|
exec sql whenever sqlerror do sqlprint();
|
||||||
|
|
||||||
exec sql connect to mm;
|
exec sql connect to mm;
|
||||||
exec sql create table test (text char(5), num decimal(14,7));
|
exec sql create table test (text char(5), num numeric(14,7));
|
||||||
|
|
||||||
value1 = PGTYPESnew();
|
value1 = PGTYPESnumeric_new();
|
||||||
PGTYPESnumeric_from_int(1407, value1);
|
PGTYPESnumeric_from_int(1407, value1);
|
||||||
text = PGTYPESnumeric_to_asc(value1, 0);
|
text = PGTYPESnumeric_to_asc(value1, 0);
|
||||||
printf("long = %s\n", text);
|
printf("long = %s\n", text);
|
||||||
|
|
||||||
value1 = PGTYPESnumeric_from_asc("2369.7", NULL);
|
value1 = PGTYPESnumeric_from_asc("2369.7", NULL);
|
||||||
value2 = PGTYPESnumeric_from_asc("10.0", NULL);
|
value2 = PGTYPESnumeric_from_asc("10.0", NULL);
|
||||||
res = PGTYPESnew();
|
res = PGTYPESnumeric_new();
|
||||||
PGTYPESnumeric_add(value1, value2, res);
|
PGTYPESnumeric_add(value1, value2, res);
|
||||||
text = PGTYPESnumeric_to_asc(res, 0);
|
text = PGTYPESnumeric_to_asc(res, 0);
|
||||||
printf("add = %s\n", text);
|
printf("add = %s\n", text);
|
||||||
|
@ -5,7 +5,7 @@ void openit(void);
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
$int i = 14;
|
$int i = 14;
|
||||||
$decimal j;
|
$decimal j, m, n;
|
||||||
FILE *dbgs;
|
FILE *dbgs;
|
||||||
|
|
||||||
if ((dbgs = fopen("log", "w")) != NULL)
|
if ((dbgs = fopen("log", "w")) != NULL)
|
||||||
@ -41,7 +41,10 @@ int main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$delete from test where i=87;
|
deccvint(7, &j);
|
||||||
|
deccvint(14, &m);
|
||||||
|
decadd(&j, &m, &n);
|
||||||
|
$delete from test where i=:n;
|
||||||
printf("delete: %ld\n", sqlca.sqlcode);
|
printf("delete: %ld\n", sqlca.sqlcode);
|
||||||
|
|
||||||
$commit;
|
$commit;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user