diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 136a7a75626d3e4977be013b05f8860b3e559c71..77ab60c2b3c0c984cf2eaaa12303cc3d43d3da7a 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -1369,6 +1369,13 @@ Fri Mar 21 15:13:42 CET 2003 - Made sure preprocessor accepts new datatypes. - Do not free prepared statements at the end of a transaction. + + +Thu Mar 27 15:23:58 CET 2003 + + - Some more updates to pgtypeslib. + - Set optimization to -O1 until I find the reason why code is broken + with -O2. - Set ecpg version to 2.12.0. - Set ecpg library to 3.4.2. - Set pgtypes library to 1.0.0 diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c index 81f9d62e691964f94aa8ead5b43735e6a931292d..5d6f31f089bfebed4b872de6888caa7783854dd0 100644 --- a/src/interfaces/ecpg/ecpglib/data.c +++ b/src/interfaces/ecpg/ecpglib/data.c @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.2 2003/03/20 15:56:50 meskes Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.3 2003/03/27 14:29:17 meskes Exp $ */ #include "postgres_fe.h" @@ -13,6 +13,7 @@ #include "pgtypes_numeric.h" #include "pgtypes_date.h" #include "pgtypes_timestamp.h" +#include "pgtypes_interval.h" bool ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, @@ -100,9 +101,10 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, unsigned long ures; double dres; char *scan_length; - NumericVar *nres; + Numeric *nres; Date ddres; Timestamp tres; + Interval *ires; case ECPGt_short: case ECPGt_int: @@ -392,16 +394,39 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, if ((isarray && *scan_length != ',' && *scan_length != '}') || (!isarray && *scan_length != '\0')) /* Garbage left */ { - ECPGraise(lineno, ECPG_FLOAT_FORMAT, pval); + ECPGraise(lineno, ECPG_NUMERIC_FORMAT, pval); return (false); } } else nres = PGTYPESnumeric_aton("0.0", &scan_length); - PGTYPESnumeric_copy(nres, (NumericVar *)(var + offset * act_tuple)); + PGTYPESnumeric_copy(nres, (Numeric *)(var + offset * act_tuple)); break; + case ECPGt_interval: + if (pval) + { + if (isarray && *pval == '"') + ires = PGTYPESinterval_atoi(pval + 1, &scan_length); + else + ires = PGTYPESinterval_atoi(pval, &scan_length); + + if (isarray && *scan_length == '"') + scan_length++; + + if ((isarray && *scan_length != ',' && *scan_length != '}') + || (!isarray && *scan_length != '\0')) /* Garbage left */ + { + ECPGraise(lineno, ECPG_INTERVAL_FORMAT, pval); + return (false); + } + } + else + ires = PGTYPESinterval_atoi("0 seconds", NULL); + + PGTYPESinterval_copy(ires, (Interval *)(var + offset * act_tuple)); + break; case ECPGt_date: if (pval) { @@ -416,7 +441,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, if ((isarray && *scan_length != ',' && *scan_length != '}') || (!isarray && *scan_length != '\0')) /* Garbage left */ { - ECPGraise(lineno, ECPG_FLOAT_FORMAT, pval); + ECPGraise(lineno, ECPG_DATE_FORMAT, pval); return (false); } @@ -438,7 +463,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, if ((isarray && *scan_length != ',' && *scan_length != '}') || (!isarray && *scan_length != '\0')) /* Garbage left */ { - ECPGraise(lineno, ECPG_FLOAT_FORMAT, pval); + ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, pval); return (false); } diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 24a46edc4150da3661e7244c1dfab8f22ce394b6..a1e0f5456b4dfddfdb7d2a0fed0b7f4b3a40f610 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.5 2003/03/25 02:44:36 momjian Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.6 2003/03/27 14:29:17 meskes Exp $ */ /* * The aim is to get a simpler inteface to the database routines. @@ -29,6 +29,7 @@ #include "pgtypes_numeric.h" #include "pgtypes_date.h" #include "pgtypes_timestamp.h" +#include "pgtypes_interval.h" /* variables visible to the programs */ struct sqlca sqlca = @@ -846,7 +847,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var, { for (element = 0; element < var->arrsize; element++) { - str = PGTYPESnumeric_ntoa((NumericVar *)((var + var->offset * element)->value)); + str = PGTYPESnumeric_ntoa((Numeric *)((var + var->offset * element)->value)); slen = strlen (str); if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + 5, stmt->lineno))) @@ -862,7 +863,48 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var, } else { - str = PGTYPESnumeric_ntoa((NumericVar *)(var->value)); + str = PGTYPESnumeric_ntoa((Numeric *)(var->value)); + slen = strlen (str); + + if (!(mallocedval = ECPGalloc(slen + 1, stmt->lineno))) + return false; + + strncpy(mallocedval, str , slen); + mallocedval[slen] = '\0'; + } + + *tobeinserted_p = mallocedval; + *malloced_p = true; + free(str); + } + break; + + case ECPGt_interval: + { + char *str = NULL; + int slen; + + if (var->arrsize > 1) + { + for (element = 0; element < var->arrsize; element++) + { + str = PGTYPESinterval_itoa((Interval *)((var + var->offset * element)->value)); + slen = strlen (str); + + if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + 5, stmt->lineno))) + return false; + + if (!element) + strcpy(mallocedval, "'{"); + + strncpy(mallocedval + strlen(mallocedval), str , slen + 1); + strcpy(mallocedval + strlen(mallocedval), ","); + } + strcpy(mallocedval + strlen(mallocedval) - 1, "}'"); + } + else + { + str = PGTYPESinterval_itoa((Interval *)(var->value)); slen = strlen (str); if (!(mallocedval = ECPGalloc(slen + 1, stmt->lineno))) diff --git a/src/interfaces/ecpg/ecpglib/typename.c b/src/interfaces/ecpg/ecpglib/typename.c index 6ae846c38128e1d8ddc97dd20e051e3e218dcd1d..684aa9cfc8a01d505879cb3f4bb8bde533ccd5da 100644 --- a/src/interfaces/ecpg/ecpglib/typename.c +++ b/src/interfaces/ecpg/ecpglib/typename.c @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.2 2003/03/20 15:56:50 meskes Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/typename.c,v 1.3 2003/03/27 14:29:17 meskes Exp $ */ #include "postgres_fe.h" @@ -53,6 +53,8 @@ ECPGtype_name(enum ECPGttype typ) return "date"; case ECPGt_timestamp: return "timestamp"; + case ECPGt_interval: + return "interval"; default: abort(); } diff --git a/src/interfaces/ecpg/include/datetime.h b/src/interfaces/ecpg/include/datetime.h index dc029e038e415c7485a4e1bad3d46e52f6cd5b6c..94ef5d28ad4ee4e81086a08cfba38ec49df953fb 100644 --- a/src/interfaces/ecpg/include/datetime.h +++ b/src/interfaces/ecpg/include/datetime.h @@ -1,11 +1,12 @@ #include <pgtypes_timestamp.h> +#include <pgtypes_interval.h> #ifndef dtime_t #define dtime_t Timestamp #endif /* dtime_t */ #ifndef intrvl_t -#define intrvl_t Timestamp +#define intrvl_t Interval #endif /* intrvl_t */ extern void dtcurrent (dtime_t *); diff --git a/src/interfaces/ecpg/include/decimal.h b/src/interfaces/ecpg/include/decimal.h index ce0eedc3d95423143c17247359fc32d5dac1315d..10c8f3b179a417c1f4fc5fc1049b40c5a4d04054 100644 --- a/src/interfaces/ecpg/include/decimal.h +++ b/src/interfaces/ecpg/include/decimal.h @@ -1,19 +1,19 @@ #include <pgtypes_numeric.h> #ifndef dec_t -#define dec_t NumericVar +#define dec_t Numeric #endif /* dec_t */ -int decadd(dec_t *, NumericVar *, NumericVar *); -int deccmp(dec_t *, NumericVar *); -void deccopy(dec_t *, NumericVar *); +int decadd(dec_t *, Numeric *, Numeric *); +int deccmp(dec_t *, Numeric *); +void deccopy(dec_t *, Numeric *); int deccvasc(char *, int, dec_t *); int deccvdbl(double, dec_t *); int deccvint(int, dec_t *); int deccvlong(long, dec_t *); -int decdiv(dec_t *, NumericVar *, NumericVar *); -int decmul(dec_t *, NumericVar *, NumericVar *); -int decsub(dec_t *, NumericVar *, NumericVar *); +int decdiv(dec_t *, Numeric *, Numeric *); +int decmul(dec_t *, Numeric *, Numeric *); +int decsub(dec_t *, Numeric *, Numeric *); int dectoasc(dec_t *, char *, int, int); int dectodbl(dec_t *, double *); int dectoint(dec_t *, int *); diff --git a/src/interfaces/ecpg/include/ecpgerrno.h b/src/interfaces/ecpg/include/ecpgerrno.h index 2106e3dd54d3fbb39be9e3c6f4494abb9764d557..05a1a592eb452521d04d3202a97d449ed4b182a8 100644 --- a/src/interfaces/ecpg/include/ecpgerrno.h +++ b/src/interfaces/ecpg/include/ecpgerrno.h @@ -20,12 +20,16 @@ #define ECPG_INT_FORMAT -204 #define ECPG_UINT_FORMAT -205 #define ECPG_FLOAT_FORMAT -206 -#define ECPG_CONVERT_BOOL -207 -#define ECPG_EMPTY -208 -#define ECPG_MISSING_INDICATOR -209 -#define ECPG_NO_ARRAY -210 -#define ECPG_DATA_NOT_ARRAY -211 -#define ECPG_ARRAY_INSERT -212 +#define ECPG_NUMERIC_FORMAT -207 +#define ECPG_INTERVAL_FORMAT -208 +#define ECPG_DATE_FORMAT -209 +#define ECPG_TIMESTAMP_FORMAT -210 +#define ECPG_CONVERT_BOOL -211 +#define ECPG_EMPTY -212 +#define ECPG_MISSING_INDICATOR -213 +#define ECPG_NO_ARRAY -214 +#define ECPG_DATA_NOT_ARRAY -215 +#define ECPG_ARRAY_INSERT -216 #define ECPG_NO_CONN -220 #define ECPG_NOT_CONN -221 diff --git a/src/interfaces/ecpg/include/ecpgtype.h b/src/interfaces/ecpg/include/ecpgtype.h index 31738d421f1406f5a1deeccf08a6b3c646f17d84..32dd84aafc025ff525a53192a171e78e3afbef67 100644 --- a/src/interfaces/ecpg/include/ecpgtype.h +++ b/src/interfaces/ecpg/include/ecpgtype.h @@ -54,7 +54,8 @@ enum ECPGttype ECPGt_descriptor, /* sql descriptor, no C variable */ ECPGt_numeric, ECPGt_date, - ECPGt_timestamp + ECPGt_timestamp, + ECPGt_interval }; /* descriptor items */ diff --git a/src/interfaces/ecpg/include/pgtypes_interval.h b/src/interfaces/ecpg/include/pgtypes_interval.h new file mode 100644 index 0000000000000000000000000000000000000000..b3c71b0597052d2cb25b1804527931936021a6b6 --- /dev/null +++ b/src/interfaces/ecpg/include/pgtypes_interval.h @@ -0,0 +1,20 @@ +#ifndef PGTYPES_INTERVAL +#define PGTYPES_INTERVAL + +#include <pgtypes_timestamp.h> + +typedef struct +{ +#ifdef HAVE_INT64_TIMESTAMP + int64 time; /* all time units other than months and years */ +#else + double time; /* all time units other than months and years */ +#endif + long month; /* months and years, after time for alignment */ +} Interval; + +extern Interval *PGTYPESinterval_atoi(char *, char **); +extern char *PGTYPESinterval_itoa(Interval *); +extern int PGTYPESinterval_copy(Interval *, Interval *); + +#endif /* PGTYPES_INTERVAL */ diff --git a/src/interfaces/ecpg/include/pgtypes_numeric.h b/src/interfaces/ecpg/include/pgtypes_numeric.h index 7ac4c1cb065c71551fd000b2d35a54407b26088e..3fe849a3ad9730e76428b24f87f857c5ef91ecd7 100644 --- a/src/interfaces/ecpg/include/pgtypes_numeric.h +++ b/src/interfaces/ecpg/include/pgtypes_numeric.h @@ -1,8 +1,15 @@ #ifndef PGTYPES_NUMERIC #define PGTYPES_NUMERIC +#define NUMERIC_POS 0x0000 +#define NUMERIC_NEG 0x4000 +#define NUMERIC_MAX_PRECISION 1000 +#define NUMERIC_MAX_DISPLAY_SCALE NUMERIC_MAX_PRECISION +#define NUMERIC_MIN_DISPLAY_SCALE 0 +#define NUMERIC_MIN_SIG_DIGITS 16 + typedef unsigned char NumericDigit; -typedef struct NumericVar +typedef struct { int ndigits; /* number of digits in digits[] - can be 0! */ int weight; /* weight of first digit */ @@ -11,23 +18,23 @@ typedef struct NumericVar int sign; /* NUMERIC_POS, NUMERIC_NEG, or NUMERIC_NAN */ NumericDigit *buf; /* start of alloc'd space for digits[] */ NumericDigit *digits; /* decimal digits */ -} NumericVar; +} Numeric; -NumericVar *PGTYPESnew(void); -void PGTYPESnumeric_free(NumericVar *); -NumericVar *PGTYPESnumeric_aton(char *, char **); -char *PGTYPESnumeric_ntoa(NumericVar *); -int PGTYPESnumeric_add(NumericVar *, NumericVar *, NumericVar *); -int PGTYPESnumeric_sub(NumericVar *, NumericVar *, NumericVar *); -int PGTYPESnumeric_mul(NumericVar *, NumericVar *, NumericVar *); -int PGTYPESnumeric_div(NumericVar *, NumericVar *, NumericVar *); -int PGTYPESnumeric_cmp(NumericVar *, NumericVar *); -int PGTYPESnumeric_iton(signed int, NumericVar *); -int PGTYPESnumeric_lton(signed long int, NumericVar *); -int PGTYPESnumeric_copy(NumericVar *, NumericVar *); -int PGTYPESnumeric_dton(double, NumericVar *); -int PGTYPESnumeric_ntod(NumericVar *, double *); -int PGTYPESnumeric_ntoi(NumericVar *, int *); -int PGTYPESnumeric_ntol(NumericVar *, long *); +Numeric *PGTYPESnew(void); +void PGTYPESnumeric_free(Numeric *); +Numeric *PGTYPESnumeric_aton(char *, char **); +char *PGTYPESnumeric_ntoa(Numeric *); +int PGTYPESnumeric_add(Numeric *, Numeric *, Numeric *); +int PGTYPESnumeric_sub(Numeric *, Numeric *, Numeric *); +int PGTYPESnumeric_mul(Numeric *, Numeric *, Numeric *); +int PGTYPESnumeric_div(Numeric *, Numeric *, Numeric *); +int PGTYPESnumeric_cmp(Numeric *, Numeric *); +int PGTYPESnumeric_iton(signed int, Numeric *); +int PGTYPESnumeric_lton(signed long int, Numeric *); +int PGTYPESnumeric_copy(Numeric *, Numeric *); +int PGTYPESnumeric_dton(double, Numeric *); +int PGTYPESnumeric_ntod(Numeric *, double *); +int PGTYPESnumeric_ntoi(Numeric *, int *); +int PGTYPESnumeric_ntol(Numeric *, long *); #endif /* PGTYPES_NUMERIC */ diff --git a/src/interfaces/ecpg/pgtypeslib/Makefile b/src/interfaces/ecpg/pgtypeslib/Makefile index ae691c7d21d632379e96249b14881c91f6e6e0c9..97d8cbb24ea91f69af2a44423df06de73d825287 100644 --- a/src/interfaces/ecpg/pgtypeslib/Makefile +++ b/src/interfaces/ecpg/pgtypeslib/Makefile @@ -4,7 +4,7 @@ # # Copyright (c) 1994, Regents of the University of California # -# $Header: /cvsroot/pgsql/src/interfaces/ecpg/pgtypeslib/Makefile,v 1.2 2003/03/20 15:56:50 meskes Exp $ +# $Header: /cvsroot/pgsql/src/interfaces/ecpg/pgtypeslib/Makefile,v 1.3 2003/03/27 14:29:17 meskes Exp $ # #------------------------------------------------------------------------- @@ -16,7 +16,7 @@ NAME= pgtypes SO_MAJOR_VERSION= 1 SO_MINOR_VERSION= 0.0 -override CPPFLAGS := -g -I$(top_srcdir)/src/interfaces/ecpg/include -I$(top_srcdir)/src/include/utils $(CPPFLAGS) +override CPPFLAGS := -O1 -g -I$(top_srcdir)/src/interfaces/ecpg/include -I$(top_srcdir)/src/include/utils $(CPPFLAGS) OBJS= numeric.o datetime.o common.o dt_common.o timestamp.o diff --git a/src/interfaces/ecpg/pgtypeslib/common.c b/src/interfaces/ecpg/pgtypeslib/common.c index 719b18b0290697b1e3d00bb83f02ac51e1e39191..b91bedcd581f536c03f19c3eb42b567426165896 100644 --- a/src/interfaces/ecpg/pgtypeslib/common.c +++ b/src/interfaces/ecpg/pgtypeslib/common.c @@ -1,5 +1,4 @@ #include <errno.h> -#include <stdlib.h> #include "extern.h" diff --git a/src/interfaces/ecpg/pgtypeslib/numeric.c b/src/interfaces/ecpg/pgtypeslib/numeric.c index 1dc2e1b63810b160fd861f442096b902a8a1d59d..9b0a1f2e14e9b0b7c62bf80c5e026287ee00cfe1 100644 --- a/src/interfaces/ecpg/pgtypeslib/numeric.c +++ b/src/interfaces/ecpg/pgtypeslib/numeric.c @@ -8,14 +8,13 @@ #include "c.h" #include "extern.h" -#include "numeric.h" #include "pgtypes_error.h" #include "decimal.h" #define Max(x, y) ((x) > (y) ? (x) : (y)) #define Min(x, y) ((x) < (y) ? (x) : (y)) -#define init_var(v) memset(v,0,sizeof(NumericVar)) +#define init_var(v) memset(v,0,sizeof(Numeric)) #define digitbuf_alloc(size) ((NumericDigit *) pgtypes_alloc(size)) #define digitbuf_free(buf) \ @@ -35,7 +34,7 @@ * ---------- */ static int -apply_typmod(NumericVar *var, long typmod) +apply_typmod(Numeric *var, long typmod) { int precision; int scale; @@ -115,7 +114,7 @@ apply_typmod(NumericVar *var, long typmod) * ---------- */ static int -alloc_var(NumericVar *var, int ndigits) +alloc_var(Numeric *var, int ndigits) { digitbuf_free(var->buf); var->buf = digitbuf_alloc(ndigits + 1); @@ -127,12 +126,12 @@ alloc_var(NumericVar *var, int ndigits) return 0; } -NumericVar * +Numeric * PGTYPESnew(void) { - NumericVar *var; + Numeric *var; - if ((var = (NumericVar *)pgtypes_alloc(sizeof(NumericVar))) == NULL) + if ((var = (Numeric *)pgtypes_alloc(sizeof(Numeric))) == NULL) return NULL; if (alloc_var(var, 0) < 0) { @@ -149,7 +148,7 @@ PGTYPESnew(void) * ---------- */ static int -set_var_from_str(char *str, char **ptr, NumericVar *dest) +set_var_from_str(char *str, char **ptr, Numeric *dest) { bool have_dp = FALSE; int i = 0; @@ -278,7 +277,7 @@ set_var_from_str(char *str, char **ptr, NumericVar *dest) * ---------- */ static char * -get_str_from_var(NumericVar *var, int dscale) +get_str_from_var(Numeric *var, int dscale) { char *str; char *cp; @@ -370,10 +369,10 @@ get_str_from_var(NumericVar *var, int dscale) * Input function for numeric data type * ---------- */ -NumericVar * +Numeric * PGTYPESnumeric_aton(char *str, char **endptr) { - NumericVar *value = (NumericVar *)pgtypes_alloc(sizeof(NumericVar)); + Numeric *value = (Numeric *)pgtypes_alloc(sizeof(Numeric)); int ret; #if 0 long typmod = -1; @@ -403,7 +402,7 @@ PGTYPESnumeric_aton(char *str, char **endptr) * ---------- */ char * -PGTYPESnumeric_ntoa(NumericVar *num) +PGTYPESnumeric_ntoa(Numeric *num) { return(get_str_from_var(num, num->dscale)); } @@ -416,7 +415,7 @@ PGTYPESnumeric_ntoa(NumericVar *num) * ---------- */ static void -zero_var(NumericVar *var) +zero_var(Numeric *var) { digitbuf_free(var->buf); var->buf = NULL; @@ -427,7 +426,7 @@ zero_var(NumericVar *var) } void -PGTYPESnumeric_free(NumericVar *var) +PGTYPESnumeric_free(Numeric *var) { digitbuf_free(var->buf); free(var); @@ -443,7 +442,7 @@ PGTYPESnumeric_free(NumericVar *var) * ---------- */ static int -cmp_abs(NumericVar *var1, NumericVar *var2) +cmp_abs(Numeric *var1, Numeric *var2) { int i1 = 0; int i2 = 0; @@ -501,7 +500,7 @@ cmp_abs(NumericVar *var1, NumericVar *var2) * ---------- */ static int -add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) +add_abs(Numeric *var1, Numeric *var2, Numeric *result) { NumericDigit *res_buf; NumericDigit *res_digits; @@ -589,7 +588,7 @@ add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ static int -sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) +sub_abs(Numeric *var1, Numeric *var2, Numeric *result) { NumericDigit *res_buf; NumericDigit *res_digits; @@ -673,7 +672,7 @@ sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ int -PGTYPESnumeric_add(NumericVar *var1, NumericVar *var2, NumericVar *result) +PGTYPESnumeric_add(Numeric *var1, Numeric *var2, Numeric *result) { /* * Decide on the signs of the two variables what to do @@ -802,7 +801,7 @@ PGTYPESnumeric_add(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ int -PGTYPESnumeric_sub(NumericVar *var1, NumericVar *var2, NumericVar *result) +PGTYPESnumeric_sub(Numeric *var1, Numeric *var2, Numeric *result) { /* * Decide on the signs of the two variables what to do @@ -933,7 +932,7 @@ PGTYPESnumeric_sub(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ int -PGTYPESnumeric_mul(NumericVar *var1, NumericVar *var2, NumericVar *result) +PGTYPESnumeric_mul(Numeric *var1, Numeric *var2, Numeric *result) { NumericDigit *res_buf; NumericDigit *res_digits; @@ -1024,7 +1023,7 @@ PGTYPESnumeric_mul(NumericVar *var1, NumericVar *var2, NumericVar *result) * Note that this must be called before div_var. */ static int -select_div_scale(NumericVar *var1, NumericVar *var2, int *rscale) +select_div_scale(Numeric *var1, Numeric *var2, int *rscale) { int weight1, weight2, @@ -1091,14 +1090,14 @@ select_div_scale(NumericVar *var1, NumericVar *var2, int *rscale) } int -PGTYPESnumeric_div(NumericVar *var1, NumericVar *var2, NumericVar *result) +PGTYPESnumeric_div(Numeric *var1, Numeric *var2, Numeric *result) { NumericDigit *res_digits; int res_ndigits; int res_sign; int res_weight; - NumericVar dividend; - NumericVar divisor[10]; + Numeric dividend; + Numeric divisor[10]; int ndigits_tmp; int weight_tmp; int rscale_tmp; @@ -1214,7 +1213,7 @@ PGTYPESnumeric_div(NumericVar *var1, NumericVar *var2, NumericVar *result) int i; long sum = 0; - memcpy(&divisor[guess], &divisor[1], sizeof(NumericVar)); + memcpy(&divisor[guess], &divisor[1], sizeof(Numeric)); divisor[guess].buf = digitbuf_alloc(divisor[guess].ndigits); divisor[guess].digits = divisor[guess].buf; for (i = divisor[1].ndigits - 1; i >= 0; i--) @@ -1297,7 +1296,7 @@ PGTYPESnumeric_div(NumericVar *var1, NumericVar *var2, NumericVar *result) int -PGTYPESnumeric_cmp(NumericVar *var1, NumericVar *var2) { +PGTYPESnumeric_cmp(Numeric *var1, Numeric *var2) { /* use cmp_abs function to calculate the result */ @@ -1327,14 +1326,14 @@ PGTYPESnumeric_cmp(NumericVar *var1, NumericVar *var2) { } int -PGTYPESnumeric_iton(signed int int_val, NumericVar *var) { +PGTYPESnumeric_iton(signed int int_val, Numeric *var) { /* implicit conversion */ signed long int long_int = int_val; return PGTYPESnumeric_lton(long_int, var); } int -PGTYPESnumeric_lton(signed long int long_val, NumericVar *var) { +PGTYPESnumeric_lton(signed long int long_val, Numeric *var) { /* calculate the size of the long int number */ /* a number n needs log_10 n digits */ /* however we multiply by 10 each time and compare instead of @@ -1386,7 +1385,7 @@ PGTYPESnumeric_lton(signed long int long_val, NumericVar *var) { } int -PGTYPESnumeric_copy(NumericVar *src, NumericVar *dst) { +PGTYPESnumeric_copy(Numeric *src, Numeric *dst) { int i; zero_var(dst); @@ -1407,10 +1406,10 @@ PGTYPESnumeric_copy(NumericVar *src, NumericVar *dst) { } int -PGTYPESnumeric_dton(double d, NumericVar *dst) +PGTYPESnumeric_dton(double d, Numeric *dst) { char buffer[100]; - NumericVar *tmp; + Numeric *tmp; if (sprintf(buffer, "%f", d) == 0) return -1; @@ -1424,7 +1423,7 @@ PGTYPESnumeric_dton(double d, NumericVar *dst) } static int -numericvar_to_double_no_overflow(NumericVar *var, double *dp) +numericvar_to_double_no_overflow(Numeric *var, double *dp) { char *tmp; double val; @@ -1448,7 +1447,7 @@ numericvar_to_double_no_overflow(NumericVar *var, double *dp) } int -PGTYPESnumeric_ntod(NumericVar* nv, double* dp) { +PGTYPESnumeric_ntod(Numeric* nv, double* dp) { double tmp; int i; @@ -1459,7 +1458,7 @@ PGTYPESnumeric_ntod(NumericVar* nv, double* dp) { } int -PGTYPESnumeric_ntoi(NumericVar* nv, int* ip) { +PGTYPESnumeric_ntoi(Numeric* nv, int* ip) { long l; int i; @@ -1476,7 +1475,7 @@ PGTYPESnumeric_ntoi(NumericVar* nv, int* ip) { } int -PGTYPESnumeric_ntol(NumericVar* nv, long* lp) { +PGTYPESnumeric_ntol(Numeric* nv, long* lp) { int i; long l = 0; @@ -1502,7 +1501,7 @@ PGTYPESnumeric_ntol(NumericVar* nv, long* lp) { /* Finally we need some wrappers for the INFORMIX functions */ int -decadd(NumericVar *arg1, NumericVar *arg2, NumericVar *sum) +decadd(Numeric *arg1, Numeric *arg2, Numeric *sum) { int i = PGTYPESnumeric_add(arg1, arg2, sum); @@ -1515,7 +1514,7 @@ decadd(NumericVar *arg1, NumericVar *arg2, NumericVar *sum) } int -deccmp(NumericVar *arg1, NumericVar *arg2) +deccmp(Numeric *arg1, Numeric *arg2) { int i = PGTYPESnumeric_cmp(arg1, arg2); @@ -1524,7 +1523,7 @@ deccmp(NumericVar *arg1, NumericVar *arg2) } void -deccopy(NumericVar *src, NumericVar *target) +deccopy(Numeric *src, Numeric *target) { PGTYPESnumeric_copy(src, target); } @@ -1547,7 +1546,7 @@ strndup(char *str, int len) } int -deccvasc(char *cp, int len, NumericVar *np) +deccvasc(char *cp, int len, Numeric *np) { char *str = strndup(cp, len); /* Numeric_in always converts the complete string */ int ret = 0; @@ -1575,25 +1574,25 @@ deccvasc(char *cp, int len, NumericVar *np) } int -deccvdbl(double dbl, NumericVar *np) +deccvdbl(double dbl, Numeric *np) { return(PGTYPESnumeric_dton(dbl, np)); } int -deccvint(int in, NumericVar *np) +deccvint(int in, Numeric *np) { return(PGTYPESnumeric_iton(in, np)); } int -deccvlong(long lng, NumericVar *np) +deccvlong(long lng, Numeric *np) { return(PGTYPESnumeric_lton(lng, np)); } int -decdiv(NumericVar *n1, NumericVar *n2, NumericVar *n3) +decdiv(Numeric *n1, Numeric *n2, Numeric *n3) { int i = PGTYPESnumeric_div(n1, n2, n3), ret = 0; @@ -1612,7 +1611,7 @@ decdiv(NumericVar *n1, NumericVar *n2, NumericVar *n3) } int -decmul(NumericVar *n1, NumericVar *n2, NumericVar *n3) +decmul(Numeric *n1, Numeric *n2, Numeric *n3) { int i = PGTYPESnumeric_mul(n1, n2, n3), ret = 0; @@ -1629,7 +1628,7 @@ decmul(NumericVar *n1, NumericVar *n2, NumericVar *n3) } int -decsub(NumericVar *n1, NumericVar *n2, NumericVar *n3) +decsub(Numeric *n1, Numeric *n2, Numeric *n3) { int i = PGTYPESnumeric_sub(n1, n2, n3), ret = 0; @@ -1646,7 +1645,7 @@ decsub(NumericVar *n1, NumericVar *n2, NumericVar *n3) } int -dectoasc(NumericVar *np, char *cp, int len, int right) +dectoasc(Numeric *np, char *cp, int len, int right) { char *str; @@ -1666,13 +1665,13 @@ dectoasc(NumericVar *np, char *cp, int len, int right) } int -dectodbl(NumericVar *np, double *dblp) +dectodbl(Numeric *np, double *dblp) { return(PGTYPESnumeric_ntod(np, dblp)); } int -dectoint(NumericVar *np, int *ip) +dectoint(Numeric *np, int *ip) { int ret = PGTYPESnumeric_ntoi(np, ip); @@ -1683,7 +1682,7 @@ dectoint(NumericVar *np, int *ip) } int -dectolong(NumericVar *np, long *lngp) +dectolong(Numeric *np, long *lngp) { int ret = PGTYPESnumeric_ntol(np, lngp); diff --git a/src/interfaces/ecpg/pgtypeslib/timestamp.c b/src/interfaces/ecpg/pgtypeslib/timestamp.c index 892092037c39027351561e24936a4573a1e9918d..bf1ca57c6ef4fc4e8569994913dcf5452fe4ab34 100644 --- a/src/interfaces/ecpg/pgtypeslib/timestamp.c +++ b/src/interfaces/ecpg/pgtypeslib/timestamp.c @@ -13,6 +13,7 @@ #include "extern.h" #include "pgtypes_error.h" #include "pgtypes_timestamp.h" +#include "pgtypes_interval.h" #include "datetime.h" #ifdef HAVE_INT64_TIMESTAMP @@ -368,7 +369,7 @@ dtcvasc (char *str, Timestamp *ts) } int -dtsub (Timestamp *ts1, Timestamp *ts2, Timestamp *iv) +dtsub (Timestamp *ts1, Timestamp *ts2, Interval *iv) { return 0; } @@ -386,8 +387,30 @@ dttofmtasc (Timestamp *ts, char *output, int str_len, char *fmtstr) } int -intoasc(Timestamp *i, char *str) +intoasc(Interval *i, char *str) { return 0; } +Interval * +PGTYPESinterval_atoi(char *str, char **endptr) +{ + Interval *result = NULL; + + return result; +} + +char * +PGTYPESinterval_itoa(Interval *intvl) +{ + char buf[MAXDATELEN + 1]; + + return pgtypes_strdup(buf); +} + +int +PGTYPESinterval_copy(Interval *intvlsrc, Interval *intrcldest) +{ + return 0; +} + diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c index d1545358213d8e18f389cb2b3c0699ff25afa216..d3b61525dd82fa65695f6bb6800599392c8799bb 100644 --- a/src/interfaces/ecpg/preproc/ecpg.c +++ b/src/interfaces/ecpg/preproc/ecpg.c @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.63 2003/03/18 10:46:39 meskes Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.64 2003/03/27 14:29:17 meskes Exp $ */ /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */ /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */ @@ -157,7 +157,8 @@ main(int argc, char *const argv[]) if (strcmp(optarg, "INFORMIX") == 0) { compat = ECPG_COMPAT_INFORMIX; - add_preprocessor_define("dec_t=NumericVar"); + add_preprocessor_define("dec_t=Numeric"); + add_preprocessor_define("intrvl_t=Interval"); } else { diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index e926e60fbbebbf67bc9bcc40e8403bf0510457b5..3b474a40e7559ded78dbb77cb2f4518d6a4b2bd4 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -1,4 +1,4 @@ -/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.214 2003/03/21 14:17:47 meskes Exp $ */ +/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.215 2003/03/27 14:29:17 meskes Exp $ */ /* Copyright comment */ %{ @@ -4258,8 +4258,8 @@ single_vt_type: common_type } else if (strcmp($1, "interval") == 0) { - $$.type_enum = ECPGt_timestamp; - $$.type_str = make_str("Timestamp"); + $$.type_enum = ECPGt_interval; + $$.type_str = EMPTY; $$.type_dimension = -1; $$.type_index = -1; $$.type_sizeof = NULL; @@ -4526,8 +4526,8 @@ var_type: common_type } else if (strcmp($1, "interval") == 0) { - $$.type_enum = ECPGt_timestamp; - $$.type_str = make_str("Timestamp"); + $$.type_enum = ECPGt_interval; + $$.type_str = EMPTY; $$.type_dimension = -1; $$.type_index = -1; $$.type_sizeof = NULL; @@ -4732,9 +4732,21 @@ variable: opt_pointer ECPGColLabelCommon opt_array_bounds opt_initializer type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension); if (dimension < 0) - $$ = cat_str(4, mm_strdup(actual_storage[struct_level]), make_str("NumericVar"), mm_strdup($2), $4); + $$ = cat_str(4, mm_strdup(actual_storage[struct_level]), make_str("Numeric"), mm_strdup($2), $4); + else + $$ = cat_str(5, mm_strdup(actual_storage[struct_level]), make_str("Numeric"), mm_strdup($2), mm_strdup(dim), $4); + break; + + case ECPGt_interval: + if (dimension < 0) + type = ECPGmake_simple_type(actual_type[struct_level].type_enum, length); + else + type = ECPGmake_array_type(ECPGmake_simple_type(actual_type[struct_level].type_enum, length), dimension); + + if (dimension < 0) + $$ = cat_str(4, mm_strdup(actual_storage[struct_level]), make_str("Interval"), mm_strdup($2), $4); else - $$ = cat_str(5, mm_strdup(actual_storage[struct_level]), make_str("NumericVar"), mm_strdup($2), mm_strdup(dim), $4); + $$ = cat_str(5, mm_strdup(actual_storage[struct_level]), make_str("Interval"), mm_strdup($2), mm_strdup(dim), $4); break; default: diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c index c55244fb1c4cfc279f007c7a367b5e0881ea5d18..fe0c76b95728b9e9e9645fe32dc6fd6fbd31ea9a 100644 --- a/src/interfaces/ecpg/preproc/type.c +++ b/src/interfaces/ecpg/preproc/type.c @@ -172,6 +172,9 @@ get_type(enum ECPGttype type) case ECPGt_numeric: return ("ECPGt_numeric"); break; + case ECPGt_interval: + return ("ECPGt_interval"); + break; case ECPGt_descriptor: return ("ECPGt_descriptor"); break; @@ -334,7 +337,15 @@ ECPGdump_a_simple(FILE *o, const char *name, enum ECPGttype type, * we have to use a pointer here */ sprintf(variable, "&(%s%s)", prefix ? prefix : "", name); - sprintf(offset, "sizeof(struct NumericVar)"); + sprintf(offset, "sizeof(Numeric)"); + break; + case ECPGt_interval: + + /* + * we have to use a pointer here + */ + sprintf(variable, "&(%s%s)", prefix ? prefix : "", name); + sprintf(offset, "sizeof(Interval)"); break; case ECPGt_date: diff --git a/src/interfaces/ecpg/test/num_test.pgc b/src/interfaces/ecpg/test/num_test.pgc index f534df5da25458103f0d40772b763a22b6199f00..42eb66d9a04cdcc6ed231a19dc029b4a1e6a1d94 100644 --- a/src/interfaces/ecpg/test/num_test.pgc +++ b/src/interfaces/ecpg/test/num_test.pgc @@ -1,14 +1,14 @@ #include <stdio.h> #include <pgtypes_numeric.h> +#include <decimal.h> int main() { char *text="error\n"; - NumericVar *value1, *value2, *res; + Numeric *value1, *value2, *res; exec sql begin declare section; decimal(14,7) des = {0, 0, 0, 0, 0, NULL, NULL} ; - numeric num; exec sql end declare section; double d; FILE *dbgs;