Some bugfixes for numerical library.
authorMichael Meskes
Tue, 18 Mar 2003 10:46:39 +0000 (10:46 +0000)
committerMichael Meskes
Tue, 18 Mar 2003 10:46:39 +0000 (10:46 +0000)
src/interfaces/ecpg/ecpglib/execute.c
src/interfaces/ecpg/include/decimal.h [new file with mode: 0644]
src/interfaces/ecpg/include/pgtypes_error.h
src/interfaces/ecpg/pgtypeslib/numeric.c
src/interfaces/ecpg/preproc/Makefile
src/interfaces/ecpg/preproc/ecpg.c
src/interfaces/ecpg/test/num_test.pgc
src/interfaces/ecpg/test/test1.pgc

index 4ed4b8fde46ecbb7395c7b0ca4212f2be691eb0b..3ff5bf886e7ac750f2754ec9245b36829f979b99 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.1 2003/03/16 10:42:53 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.2 2003/03/18 10:46:39 meskes Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
@@ -861,7 +861,7 @@ ECPGstore_input(const struct statement * stmt, const struct variable * var,
                    }
                    else
                    {
-                       *str = PGTYPESnumeric_ntoa((NumericVar *)(var->value));
+                       str = PGTYPESnumeric_ntoa((NumericVar *)(var->value));
                        slen = strlen (str);
                    
                        if (!(mallocedval = ECPGalloc(slen + 1, stmt->lineno)))
diff --git a/src/interfaces/ecpg/include/decimal.h b/src/interfaces/ecpg/include/decimal.h
new file mode 100644 (file)
index 0000000..f307207
--- /dev/null
@@ -0,0 +1,5 @@
+#include 
+
+#ifndef dec_t
+#define dec_t NumericVar
+#endif /* dec_t */
index c04e72e438da7aca45d07b1671a2c1d4130dd649..e997b03ae014b64cd5785a199d96e7d592e90c9f 100644 (file)
@@ -1,3 +1,6 @@
 #define    PGTYPES_OVERFLOW    201
 #define PGTYPES_BAD_NUMERIC    202
 #define PGTYPES_DIVIDE_ZERO    203
+
+#define PGTYPES_BAD_DATE   300
+
index bd6c950d3fd06d04d2487edba17f0a87683eab56..03fa42089aea1aac371bd57f1ed734bee3744c01 100644 (file)
@@ -40,6 +40,7 @@ pgtypes_alloc(long size)
    return (new);
 }
 
+#if 0
 /* ----------
  * apply_typmod() -
  *
@@ -119,6 +120,7 @@ apply_typmod(NumericVar *var, long typmod)
    var->dscale = scale;
    return (0);
 }
+#endif
 
 /* ----------
  *  alloc_var() -
@@ -387,7 +389,9 @@ PGTYPESnumeric_aton(char *str, char **endptr)
 {
    NumericVar *value = (NumericVar *)pgtypes_alloc(sizeof(NumericVar));
    int ret;
+#if 0
    long typmod = -1;
+#endif
    char *realptr;
    char **ptr = (endptr != NULL) ? endptr : &realptr;
    
@@ -398,10 +402,11 @@ PGTYPESnumeric_aton(char *str, char **endptr)
    if (ret)
        return (NULL);
 
+#if 0
    ret = apply_typmod(value, typmod);
    if (ret)
        return (NULL);
-   
+#endif 
    return(value);
 }
 
index 6936d21f33987f5b8f732941790f664af6e2db7d..5941c154fc655f3947fd39f8880375eb5c178713 100644 (file)
@@ -1,4 +1,4 @@
-# $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Makefile,v 1.90 2003/02/14 13:17:13 meskes Exp $
+# $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Makefile,v 1.91 2003/03/18 10:46:39 meskes Exp $
 
 subdir = src/interfaces/ecpg/preproc
 top_builddir = ../../../..
@@ -18,7 +18,7 @@ override CFLAGS += -Wno-error
 endif
 
 OBJS=preproc.o type.o ecpg.o ecpg_keywords.o output.o\
-    keywords.o c_keywords.o ../lib/typename.o descriptor.o variable.o
+    keywords.o c_keywords.o ../ecpglib/typename.o descriptor.o variable.o
 
 
 all: submake-libpgport ecpg
index 7d267b265771e273cb1e437c23026186902fc111..d1545358213d8e18f389cb2b3c0699ff25afa216 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.62 2003/03/16 10:42:54 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.63 2003/03/18 10:46:39 meskes Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes  Feb 5th, 1998 */
@@ -7,6 +7,7 @@
 #include "postgres_fe.h"
 
 #include 
+#include 
 #ifdef HAVE_GETOPT_H
 #include 
 #endif
@@ -69,10 +70,27 @@ static void
 add_preprocessor_define(char *define)
 {
    struct _defines *pd = defines;
-
+   char *ptr, *define_copy = mm_strdup(define);
+   
    defines = mm_alloc(sizeof(struct _defines));
-   defines->old = strdup(define);
-   defines->new = strdup("");
+   
+   /* look for = sign */
+   ptr = strchr(define_copy, '=');
+   if (ptr != NULL)
+   {
+       char *tmp;
+       
+       /* symbol gets a value */
+       for (tmp=ptr-1; *tmp == ' '; tmp--);
+       tmp[1] = '\0';
+       defines->old = define_copy;
+       defines->new = ptr+1;
+   }
+   else
+   {
+       defines->old = define_copy;
+       defines->new = mm_strdup("");
+   }
    defines->pertinent = true;
    defines->next = pd;
 }
@@ -137,7 +155,10 @@ main(int argc, char *const argv[])
                break;
            case 'C':
                if (strcmp(optarg, "INFORMIX") == 0)
+               {
                    compat = ECPG_COMPAT_INFORMIX;
+                   add_preprocessor_define("dec_t=NumericVar");
+               }
                else
                {
                    fprintf(stderr, "Try '%s --help' for more information.\n", argv[0]);
@@ -313,7 +334,7 @@ main(int argc, char *const argv[])
                lex_init();
 
                /* we need several includes */
-               fprintf(yyout, "/* Processed by ecpg (%d.%d.%d) */\n/* These four include files are added by the preprocessor */\n#include \n#include \n#include \n#include \n#include \n#line 1 \"%s\"\n", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL, input_filename);
+               fprintf(yyout, "/* Processed by ecpg (%d.%d.%d) */\n/* These four include files are added by the preprocessor */\n#include \n#include \n#include \n#include \n#line 1 \"%s\"\n", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL, input_filename);
 
                /* add some compatibility headers */
                if (compat == ECPG_COMPAT_INFORMIX)
index 741ae16751e6db526bbc798629478cbb6dec5d34..f81b81b915cb345f0b81613bdce6ca70355df63f 100644 (file)
@@ -1,10 +1,11 @@
 #include 
+#include 
 
 int
 main()
 {
    char *text="error\n";
-       NumericVar *value1, *value2, *res;
+   NumericVar *value1, *value2, *res;
    exec sql begin declare section;
        decimal(14,7) des = {0, 0, 0, 0, 0, NULL, NULL} ;
    exec sql end declare section;
@@ -23,8 +24,8 @@ main()
    text = PGTYPESnumeric_ntoa(value1);
    printf("long = %s\n", text);
        
-   value1 = PGTYPESnumeric_aton("2369.7", -1);
-   value2 = PGTYPESnumeric_aton("10.0", -1);
+   value1 = PGTYPESnumeric_aton("2369.7", NULL);
+   value2 = PGTYPESnumeric_aton("10.0", NULL);
    res = PGTYPESnew();
    decadd(value1, value2, res);
    text = PGTYPESnumeric_ntoa(res);
@@ -37,7 +38,7 @@ main()
    PGTYPESnumeric_copy(res, &des);
    exec sql insert into test (text, num) values ('test', :des);
    
-   value2 = PGTYPESnumeric_aton("2369.7", -1);
+   value2 = PGTYPESnumeric_aton("2369.7", NULL);
    PGTYPESnumeric_mul(value1, value2, res);
 
    exec sql select num into :des from test where text = 'test';
@@ -46,7 +47,7 @@ main()
    text = PGTYPESnumeric_ntoa(res);
    printf("mul = %s\n", text);
 
-   value2 = PGTYPESnumeric_aton("10000", -1);
+   value2 = PGTYPESnumeric_aton("10000", NULL);
    PGTYPESnumeric_div(res, value2, res);
    text = PGTYPESnumeric_ntoa(res);
    PGTYPESnumeric_ntod(res, &d);
index 78771d944d51b8a86fda7179814ec91a0f5f143d..28c33b49545950e76d6dcfbcd61667696b2e08ac 100644 (file)
@@ -53,7 +53,7 @@ exec sql endif;
    char *connection="pm";
    int how_many;
 exec sql end declare section;
-   exec sql var name is string(AMOUNT);
+   exec sql var name is string[AMOUNT];
    char msg[128];
         FILE *dbgs;
         int i,j;