]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Added fixes from the coverity report send in by Joachim Wieland <joe@mcknight.de>
authorMichael Meskes <meskes@postgresql.org>
Wed, 21 Jun 2006 10:31:45 +0000 (10:31 +0000)
committerMichael Meskes <meskes@postgresql.org>
Wed, 21 Jun 2006 10:31:45 +0000 (10:31 +0000)
Added missing error handling in a few functions in ecpglib.

src/interfaces/ecpg/compatlib/informix.c
src/interfaces/ecpg/ecpglib/connect.c
src/interfaces/ecpg/ecpglib/data.c
src/interfaces/ecpg/ecpglib/descriptor.c
src/interfaces/ecpg/ecpglib/execute.c
src/interfaces/ecpg/ecpglib/extern.h
src/interfaces/ecpg/pgtypeslib/datetime.c
src/interfaces/ecpg/pgtypeslib/dt_common.c
src/interfaces/ecpg/pgtypeslib/numeric.c
src/interfaces/ecpg/pgtypeslib/timestamp.c
src/interfaces/ecpg/test/dt_test.pgc

index f9af0247653b41f68cba5e28fdc2bb141a6ce66d..f45655b6f3e579e7c09dffeb7831d01c9a688f89 100644 (file)
@@ -209,13 +209,14 @@ deccvasc(char *cp, int len, decimal *np)
 int
 deccvdbl(double dbl, decimal *np)
 {
-       numeric    *nres = PGTYPESnumeric_new();
+       numeric    *nres;
        int                     result = 1;
 
        rsetnull(CDECIMALTYPE, (char *) np);
        if (risnull(CDOUBLETYPE, (char *) &dbl))
                return 0;
 
+       nres = PGTYPESnumeric_new();
        if (nres == NULL)
                return ECPG_INFORMIX_OUT_OF_MEMORY;
 
@@ -230,13 +231,14 @@ deccvdbl(double dbl, decimal *np)
 int
 deccvint(int in, decimal *np)
 {
-       numeric    *nres = PGTYPESnumeric_new();
+       numeric    *nres;
        int                     result = 1;
 
        rsetnull(CDECIMALTYPE, (char *) np);
        if (risnull(CINTTYPE, (char *) &in))
                return 0;
 
+       nres = PGTYPESnumeric_new();
        if (nres == NULL)
                return ECPG_INFORMIX_OUT_OF_MEMORY;
 
@@ -251,13 +253,14 @@ deccvint(int in, decimal *np)
 int
 deccvlong(long lng, decimal *np)
 {
-       numeric    *nres = PGTYPESnumeric_new();
+       numeric    *nres;
        int                     result = 1;
 
        rsetnull(CDECIMALTYPE, (char *) np);
        if (risnull(CLONGTYPE, (char *) &lng))
                return 0;
 
+       nres = PGTYPESnumeric_new();
        if (nres == NULL)
                return ECPG_INFORMIX_OUT_OF_MEMORY;
 
@@ -340,17 +343,21 @@ int
 dectoasc(decimal *np, char *cp, int len, int right)
 {
        char       *str;
-       numeric    *nres = PGTYPESnumeric_new();
-
-       if (nres == NULL)
-               return ECPG_INFORMIX_OUT_OF_MEMORY;
+       numeric    *nres;
 
        rsetnull(CSTRINGTYPE, (char *) cp);
        if (risnull(CDECIMALTYPE, (char *) np))
                return 0;
 
+       nres = PGTYPESnumeric_new();
+       if (nres == NULL)
+               return ECPG_INFORMIX_OUT_OF_MEMORY;
+
        if (PGTYPESnumeric_from_decimal(np, nres) != 0)
+       {
+               PGTYPESnumeric_free(nres);
                return ECPG_INFORMIX_OUT_OF_MEMORY;
+       }
 
        if (right >= 0)
                str = PGTYPESnumeric_to_asc(nres, right);
@@ -374,14 +381,17 @@ dectoasc(decimal *np, char *cp, int len, int right)
 int
 dectodbl(decimal *np, double *dblp)
 {
-       numeric    *nres = PGTYPESnumeric_new();
        int                     i;
+       numeric    *nres = PGTYPESnumeric_new();
 
        if (nres == NULL)
                return ECPG_INFORMIX_OUT_OF_MEMORY;
 
        if (PGTYPESnumeric_from_decimal(np, nres) != 0)
+       {
+               PGTYPESnumeric_free(nres);
                return ECPG_INFORMIX_OUT_OF_MEMORY;
+       }
 
        i = PGTYPESnumeric_to_double(nres, dblp);
        PGTYPESnumeric_free(nres);
@@ -399,7 +409,10 @@ dectoint(decimal *np, int *ip)
                return ECPG_INFORMIX_OUT_OF_MEMORY;
 
        if (PGTYPESnumeric_from_decimal(np, nres) != 0)
+       {
+               PGTYPESnumeric_free(nres);
                return ECPG_INFORMIX_OUT_OF_MEMORY;
+       }
 
        ret = PGTYPESnumeric_to_int(nres, ip);
 
@@ -413,15 +426,19 @@ int
 dectolong(decimal *np, long *lngp)
 {
        int                     ret;
-       numeric    *nres = PGTYPESnumeric_new();;
+       numeric    *nres = PGTYPESnumeric_new();
 
        if (nres == NULL)
                return ECPG_INFORMIX_OUT_OF_MEMORY;
 
        if (PGTYPESnumeric_from_decimal(np, nres) != 0)
+       {
+               PGTYPESnumeric_free(nres);
                return ECPG_INFORMIX_OUT_OF_MEMORY;
+       }
 
        ret = PGTYPESnumeric_to_long(nres, lngp);
+       PGTYPESnumeric_free(nres);
 
        if (ret == PGTYPES_NUM_OVERFLOW)
                ret = ECPG_INFORMIX_NUM_OVERFLOW;
index 94acd32656d61bddc2a066e87a02e363420cc702..985b18d311afa77bfe1ae0872aeb510bb9fdfbb5 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.24.4.3 2006/06/19 09:20:22 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/connect.c,v 1.24.4.4 2006/06/21 10:31:45 meskes Exp $ */
 
 #define POSTGRES_ECPG_INTERNAL
 #include "postgres_fe.h"
@@ -398,6 +398,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p
                                                        ECPGfree(realname);
                                                if (dbname)
                                                        ECPGfree(dbname);
+                                               ecpg_finish(this);
                                                return false;
                                        }
                                }
index a9592bca20854a2fa6fdd21c569a16327b1580b0..8ad8aceaf59e161b34dad2fce5b838f414ca4ecb 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.27.4.2 2006/06/06 11:36:12 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.27.4.3 2006/06/21 10:31:45 meskes Exp $ */
 
 #define POSTGRES_ECPG_INTERNAL
 #include "postgres_fe.h"
@@ -92,13 +92,17 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                }
                                else
                                {
-                                       ECPGraise(lineno, ECPG_MISSING_INDICATOR, ECPG_SQLSTATE_NULL_VALUE_NO_INDICATOR_PARAMETER, NULL);
+                                       ECPGraise(lineno, ECPG_MISSING_INDICATOR,
+                                                         ECPG_SQLSTATE_NULL_VALUE_NO_INDICATOR_PARAMETER,
+                                                         NULL);
                                        return (false);
                                }
                        }
                        break;
                default:
-                       ECPGraise(lineno, ECPG_UNSUPPORTED, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, ECPGtype_name(ind_type));
+                       ECPGraise(lineno, ECPG_UNSUPPORTED,
+                                         ECPG_SQLSTATE_ECPG_INTERNAL_ERROR,
+                                         ECPGtype_name(ind_type));
                        return (false);
                        break;
        }
@@ -110,9 +114,10 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
        /* let's check if it really is an array if it should be one */
        if (isarray == ECPG_ARRAY_ARRAY)
        {
-               if (*pval != '{')
+               if (!pval || *pval != '{')
                {
-                       ECPGraise(lineno, ECPG_DATA_NOT_ARRAY, ECPG_SQLSTATE_DATATYPE_MISMATCH, NULL);
+                       ECPGraise(lineno, ECPG_DATA_NOT_ARRAY,
+                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, NULL);
                        return (false);
                }
 
@@ -150,7 +155,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                        res = strtol(pval, &scan_length, 10);
                                        if (garbage_left(isarray, scan_length, compat))
                                        {
-                                               ECPGraise(lineno, ECPG_INT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                               ECPGraise(lineno, ECPG_INT_FORMAT,
+                                                                 ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                return (false);
                                        }
                                        pval = scan_length;
@@ -183,7 +189,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                        ures = strtoul(pval, &scan_length, 10);
                                        if (garbage_left(isarray, scan_length, compat))
                                        {
-                                               ECPGraise(lineno, ECPG_UINT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                               ECPGraise(lineno, ECPG_UINT_FORMAT,
+                                                                 ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                return (false);
                                        }
                                        pval = scan_length;
@@ -260,7 +267,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 
                                        if (garbage_left(isarray, scan_length, compat))
                                        {
-                                               ECPGraise(lineno, ECPG_FLOAT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                               ECPGraise(lineno, ECPG_FLOAT_FORMAT,
+                                                                 ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                return (false);
                                        }
                                        pval = scan_length;
@@ -292,7 +300,9 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                else if (offset == sizeof(int))
                                                        *((int *) (var + offset * act_tuple)) = false;
                                                else
-                                                       ECPGraise(lineno, ECPG_CONVERT_BOOL, ECPG_SQLSTATE_DATATYPE_MISMATCH, "different size");
+                                                       ECPGraise(lineno, ECPG_CONVERT_BOOL,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH,
+                                                                         "different size");
                                                break;
                                        }
                                        else if (pval[0] == 't' && pval[1] == '\0')
@@ -302,7 +312,9 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                else if (offset == sizeof(int))
                                                        *((int *) (var + offset * act_tuple)) = true;
                                                else
-                                                       ECPGraise(lineno, ECPG_CONVERT_BOOL, ECPG_SQLSTATE_DATATYPE_MISMATCH, "different size");
+                                                       ECPGraise(lineno, ECPG_CONVERT_BOOL,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH,
+                                                                         "different size");
                                                break;
                                        }
                                        else if (pval[0] == '\0' && PQgetisnull(results, act_tuple, act_field))
@@ -312,7 +324,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                        }
                                }
 
-                               ECPGraise(lineno, ECPG_CONVERT_BOOL, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                               ECPGraise(lineno, ECPG_CONVERT_BOOL,
+                                                 ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                return (false);
                                break;
 
@@ -419,7 +432,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                        /* did we get an error? */
                                        if (errno != 0)
                                        {
-                                               ECPGlog("ECPGget_data line %d: RESULT: %s errno %d\n", lineno, pval ? pval : "", errno);
+                                               ECPGlog("ECPGget_data line %d: RESULT: %s errno %d\n",
+                                                               lineno, pval ? pval : "", errno);
 
                                                if (INFORMIX_MODE(compat))
                                                {
@@ -427,11 +441,20 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                         * Informix wants its own NULL value here
                                                         * instead of an error
                                                         */
-                                                       ECPGset_noind_null(ECPGt_numeric, nres);
+                                                       nres = PGTYPESnumeric_new();
+                                                       if (nres)
+                                                               ECPGset_noind_null(ECPGt_numeric, nres);
+                                                       else
+                                                       {
+                                                               ECPGraise(lineno, ECPG_OUT_OF_MEMORY,
+                                                                       ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL);
+                                                               return (false);
+                                                       }
                                                }
                                                else
                                                {
-                                                       ECPGraise(lineno, ECPG_NUMERIC_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                                       ECPGraise(lineno, ECPG_NUMERIC_FORMAT,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
                                                }
                                        }
@@ -443,7 +466,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                if (garbage_left(isarray, scan_length, compat))
                                                {
                                                        free(nres);
-                                                       ECPGraise(lineno, ECPG_NUMERIC_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                                       ECPGraise(lineno, ECPG_NUMERIC_FORMAT,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
                                                }
                                        }
@@ -477,11 +501,16 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                         * Informix wants its own NULL value here
                                                         * instead of an error
                                                         */
+                                                       ires = (interval *) ECPGalloc(sizeof(interval), lineno);
+                                                       if (!ires)
+                                                               return (false);
+
                                                        ECPGset_noind_null(ECPGt_interval, ires);
                                                }
                                                else
                                                {
-                                                       ECPGraise(lineno, ECPG_INTERVAL_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                                       ECPGraise(lineno, ECPG_INTERVAL_FORMAT,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
                                                }
                                        }
@@ -493,7 +522,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                if (garbage_left(isarray, scan_length, compat))
                                                {
                                                        free(ires);
-                                                       ECPGraise(lineno, ECPG_INTERVAL_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                                       ECPGraise(lineno, ECPG_INTERVAL_FORMAT,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
                                                }
                                        }
@@ -526,7 +556,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                }
                                                else
                                                {
-                                                       ECPGraise(lineno, ECPG_DATE_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                                       ECPGraise(lineno, ECPG_DATE_FORMAT,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
                                                }
                                        }
@@ -537,7 +568,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 
                                                if (garbage_left(isarray, scan_length, compat))
                                                {
-                                                       ECPGraise(lineno, ECPG_DATE_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                                       ECPGraise(lineno, ECPG_DATE_FORMAT,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
                                                }
                                        }
@@ -568,7 +600,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                                }
                                                else
                                                {
-                                                       ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                                       ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
                                                }
                                        }
@@ -579,7 +612,8 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 
                                                if (garbage_left(isarray, scan_length, compat))
                                                {
-                                                       ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
+                                                       ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT,
+                                                                         ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);
                                                        return (false);
                                                }
                                        }
@@ -590,7 +624,9 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
                                break;
 
                        default:
-                               ECPGraise(lineno, ECPG_UNSUPPORTED, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, ECPGtype_name(type));
+                               ECPGraise(lineno, ECPG_UNSUPPORTED,
+                                                 ECPG_SQLSTATE_ECPG_INTERNAL_ERROR,
+                                                 ECPGtype_name(type));
                                return (false);
                                break;
                }
index 2a3978b7c466ec87fff57b8b33da1df2b802ce45..1ec9371f6c21587be77f640aa54e28ffd9fb84ea 100644 (file)
@@ -1,6 +1,6 @@
 /* dynamic SQL support routines
  *
- * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.12.4.2 2006/01/15 22:47:21 neilc Exp $
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.12.4.3 2006/06/21 10:31:45 meskes Exp $
  */
 
 #define POSTGRES_ECPG_INTERNAL
@@ -351,8 +351,9 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
                                /* allocate storage if needed */
                                if (arrsize == 0 && var != NULL && *(void **) var == NULL)
                                {
-                                       void       *mem = (void *) ECPGalloc(offset * ntuples, lineno);
-
+                                       void *mem = (void *) ECPGalloc(offset * ntuples, lineno);
+                                       if (!mem)
+                                               return false;
                                        *(void **) var = mem;
                                        ECPGadd_mem(mem, lineno);
                                        var = mem;
@@ -412,8 +413,9 @@ ECPGget_desc(int lineno, const char *desc_name, int index,...)
                /* allocate storage if needed */
                if (data_var.ind_arrsize == 0 && data_var.ind_pointer != NULL && data_var.ind_value == NULL)
                {
-                       void       *mem = (void *) ECPGalloc(data_var.ind_offset * ntuples, lineno);
-
+                       void *mem = (void *) ECPGalloc(data_var.ind_offset * ntuples, lineno);
+                       if (!mem)
+                               return false;
                        *(void **) data_var.ind_pointer = mem;
                        ECPGadd_mem(mem, lineno);
                        data_var.ind_value = mem;
@@ -480,6 +482,8 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...)
        if (desc_item == NULL)
        {
                desc_item = (struct descriptor_item *) ECPGalloc(sizeof(*desc_item), lineno);
+               if (!desc_item)
+                       return false;
                desc_item->num = index;
                desc_item->next = desc->items;
                desc->items = desc_item;
index 10aea3ea92b72c654e540730f35980b37deb5d0e..1e71083fc1a94969a351cbe98eb1d76e852ccd86 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.38.4.4 2006/04/24 09:45:57 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.38.4.5 2006/06/21 10:31:45 meskes Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
@@ -252,16 +252,20 @@ next_insert(char *text)
        return (*ptr == '\0') ? NULL : ptr;
 }
 
-static void
+static bool
 ECPGtypeinfocache_push(struct ECPGtype_information_cache ** cache, int oid, bool isarray, int lineno)
 {
        struct ECPGtype_information_cache *new_entry
        = (struct ECPGtype_information_cache *) ECPGalloc(sizeof(struct ECPGtype_information_cache), lineno);
 
+       if (new_entry == NULL)
+               return (false);
+
        new_entry->oid = oid;
        new_entry->isarray = isarray;
        new_entry->next = *cache;
        *cache = new_entry;
+       return(true);
 }
 
 static enum ARRAY_TYPE
@@ -282,48 +286,48 @@ ECPGis_type_an_array(int type, const struct statement * stmt, const struct varia
 #define not_an_array_in_ecpg ECPG_ARRAY_NONE
 
                /* populate cache with well known types to speed things up */
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), BOOLOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), BYTEAOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), CHAROID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), NAMEOID, not_an_array_in_ecpg, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT8OID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT2OID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT2VECTOROID, ECPG_ARRAY_VECTOR, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT4OID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), REGPROCOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), TEXTOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), OIDOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIDOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), XIDOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIDOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), OIDVECTOROID, ECPG_ARRAY_VECTOR, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), POINTOID, ECPG_ARRAY_VECTOR, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), LSEGOID, ECPG_ARRAY_VECTOR, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), PATHOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), BOXOID, ECPG_ARRAY_VECTOR, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), POLYGONOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), LINEOID, ECPG_ARRAY_VECTOR, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), FLOAT4OID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), FLOAT8OID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), ABSTIMEOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), RELTIMEOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), TINTERVALOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), UNKNOWNOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIRCLEOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), CASHOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), INETOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIDROID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), BPCHAROID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), VARCHAROID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), DATEOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMEOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMESTAMPOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMESTAMPTZOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), INTERVALOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMETZOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), ZPBITOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), VARBITOID, ECPG_ARRAY_NONE, stmt->lineno);
-               ECPGtypeinfocache_push(&(stmt->connection->cache_head), NUMERICOID, ECPG_ARRAY_NONE, stmt->lineno);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), BOOLOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), BYTEAOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), CHAROID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), NAMEOID, not_an_array_in_ecpg, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT8OID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT2OID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT2VECTOROID, ECPG_ARRAY_VECTOR, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), INT4OID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), REGPROCOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), TEXTOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), OIDOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIDOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), XIDOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIDOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), OIDVECTOROID, ECPG_ARRAY_VECTOR, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), POINTOID, ECPG_ARRAY_VECTOR, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), LSEGOID, ECPG_ARRAY_VECTOR, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), PATHOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), BOXOID, ECPG_ARRAY_VECTOR, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), POLYGONOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), LINEOID, ECPG_ARRAY_VECTOR, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), FLOAT4OID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), FLOAT8OID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), ABSTIMEOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), RELTIMEOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), TINTERVALOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), UNKNOWNOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIRCLEOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), CASHOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), INETOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), CIDROID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), BPCHAROID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), VARCHAROID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), DATEOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMEOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMESTAMPOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMESTAMPTZOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), INTERVALOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), TIMETZOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), ZPBITOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), VARBITOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
+               if (!ECPGtypeinfocache_push(&(stmt->connection->cache_head), NUMERICOID, ECPG_ARRAY_NONE, stmt->lineno)) return (ECPG_ARRAY_ERROR);
        }
 
        for (cache_entry = (stmt->connection->cache_head); cache_entry != NULL; cache_entry = cache_entry->next)
@@ -333,6 +337,9 @@ ECPGis_type_an_array(int type, const struct statement * stmt, const struct varia
        }
 
        array_query = (char *) ECPGalloc(strlen("select typlen from pg_type where oid= and typelem<>0") + 11, stmt->lineno);
+       if (array_query == NULL)
+               return (ECPG_ARRAY_ERROR);
+
        sprintf(array_query, "select typlen from pg_type where oid=%d and typelem<>0", type);
        query = PQexec(stmt->connection->connection, array_query);
        ECPGfree(array_query);
@@ -369,7 +376,11 @@ ECPGstore_result(const PGresult *results, int act_field,
                                ntuples = PQntuples(results);
        bool            status = true;
 
-       isarray = ECPGis_type_an_array(PQftype(results, act_field), stmt, var);
+       if ((isarray = ECPGis_type_an_array(PQftype(results, act_field), stmt, var)) == ECPG_ARRAY_ERROR)
+       {
+               ECPGraise(stmt->lineno, ECPG_OUT_OF_MEMORY, ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL);
+               return false;
+       }
 
        if (isarray == ECPG_ARRAY_NONE)
        {
@@ -441,6 +452,8 @@ ECPGstore_result(const PGresult *results, int act_field,
                                break;
                }
                var->value = (char *) ECPGalloc(len, stmt->lineno);
+               if (!var->value)
+                       return false;
                *((char **) var->pointer) = var->value;
                ECPGadd_mem(var->value, stmt->lineno);
        }
@@ -451,6 +464,8 @@ ECPGstore_result(const PGresult *results, int act_field,
                int                     len = var->ind_offset * ntuples;
 
                var->ind_value = (char *) ECPGalloc(len, stmt->lineno);
+               if (!var->ind_value)
+                       return false;
                *((char **) var->ind_pointer) = var->ind_value;
                ECPGadd_mem(var->ind_value, stmt->lineno);
        }
@@ -867,6 +882,9 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
                                        int                     slen;
                                        numeric    *nval = PGTYPESnumeric_new();
 
+                                       if (!nval)
+                                               return false;
+
                                        if (var->arrsize > 1)
                                        {
                                                for (element = 0; element < var->arrsize; element++, nval = PGTYPESnumeric_new())
@@ -881,7 +899,11 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
                                                        slen = strlen(str);
 
                                                        if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + sizeof("array [] "), lineno)))
+                                                       {
+                                                               PGTYPESnumeric_free(nval);
+                                                               free(str);
                                                                return false;
+                                                       }
 
                                                        if (!element)
                                                                strcpy(mallocedval, "array [");
@@ -900,11 +922,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 
                                                str = PGTYPESnumeric_to_asc(nval, nval->dscale);
 
-                                               PGTYPESnumeric_free(nval);
                                                slen = strlen(str);
 
                                                if (!(mallocedval = ECPGalloc(slen + 1, lineno)))
+                                               {
+                                                       PGTYPESnumeric_free(nval);
+                                                       free(str);
                                                        return false;
+                                               }
 
                                                strncpy(mallocedval, str, slen);
                                                mallocedval[slen] = '\0';
@@ -912,6 +937,7 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 
                                        *tobeinserted_p = mallocedval;
                                        *malloced_p = true;
+                                       PGTYPESnumeric_free(nval);
                                        free(str);
                                }
                                break;
@@ -926,10 +952,15 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
                                                for (element = 0; element < var->arrsize; element++)
                                                {
                                                        str = quote_postgres(PGTYPESinterval_to_asc((interval *) ((var + var->offset * element)->value)), lineno);
+                                                       if (!str)
+                                                               return false;
                                                        slen = strlen(str);
 
                                                        if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + sizeof("array [],interval "), lineno)))
+                                                       {
+                                                               ECPGfree(str);
                                                                return false;
+                                                       }
 
                                                        if (!element)
                                                                strcpy(mallocedval, "array [");
@@ -943,10 +974,15 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
                                        else
                                        {
                                                str = quote_postgres(PGTYPESinterval_to_asc((interval *) (var->value)), lineno);
+                                               if (!str)
+                                                       return false;
                                                slen = strlen(str);
 
                                                if (!(mallocedval = ECPGalloc(slen + sizeof("interval ") + 1, lineno)))
+                                               {
+                                                       ECPGfree(str);
                                                        return false;
+                                               }
 
                                                strcpy(mallocedval, "interval ");
                                                /* also copy trailing '\0' */
@@ -955,7 +991,7 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 
                                        *tobeinserted_p = mallocedval;
                                        *malloced_p = true;
-                                       free(str);
+                                       ECPGfree(str);
                                }
                                break;
 
@@ -969,10 +1005,15 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
                                                for (element = 0; element < var->arrsize; element++)
                                                {
                                                        str = quote_postgres(PGTYPESdate_to_asc(*(date *) ((var + var->offset * element)->value)), lineno);
+                                                       if (!str)
+                                                               return false;
                                                        slen = strlen(str);
 
                                                        if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + sizeof("array [],date "), lineno)))
+                                                       {
+                                                               ECPGfree(str);
                                                                return false;
+                                                       }
 
                                                        if (!element)
                                                                strcpy(mallocedval, "array [");
@@ -986,10 +1027,15 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
                                        else
                                        {
                                                str = quote_postgres(PGTYPESdate_to_asc(*(date *) (var->value)), lineno);
+                                               if (!str)
+                                                       return false;
                                                slen = strlen(str);
 
                                                if (!(mallocedval = ECPGalloc(slen + sizeof("date ") + 1, lineno)))
+                                               {
+                                                       ECPGfree(str);
                                                        return false;
+                                               }
 
                                                strcpy(mallocedval, "date ");
                                                /* also copy trailing '\0' */
@@ -998,7 +1044,7 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 
                                        *tobeinserted_p = mallocedval;
                                        *malloced_p = true;
-                                       free(str);
+                                       ECPGfree(str);
                                }
                                break;
 
@@ -1012,10 +1058,15 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
                                                for (element = 0; element < var->arrsize; element++)
                                                {
                                                        str = quote_postgres(PGTYPEStimestamp_to_asc(*(timestamp *) ((var + var->offset * element)->value)), lineno);
+                                                       if (!str)
+                                                               return false;
                                                        slen = strlen(str);
 
                                                        if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + sizeof("array [], timestamp "), lineno)))
+                                                       {
+                                                               ECPGfree(str);
                                                                return false;
+                                                       }
 
                                                        if (!element)
                                                                strcpy(mallocedval, "array [");
@@ -1029,10 +1080,15 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
                                        else
                                        {
                                                str = quote_postgres(PGTYPEStimestamp_to_asc(*(timestamp *) (var->value)), lineno);
+                                               if (!str)
+                                                       return false;
                                                slen = strlen(str);
 
                                                if (!(mallocedval = ECPGalloc(slen + sizeof("timestamp") + 1, lineno)))
+                                               {
+                                                       ECPGfree(str);
                                                        return false;
+                                               }
 
                                                strcpy(mallocedval, "timestamp ");
                                                /* also copy trailing '\0' */
@@ -1041,7 +1097,7 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
 
                                        *tobeinserted_p = mallocedval;
                                        *malloced_p = true;
-                                       free(str);
+                                       ECPGfree(str);
                                }
                                break;
 
@@ -1167,8 +1223,13 @@ ECPGexecute(struct statement * stmt)
                         * Now tobeinserted points to an area that is to be inserted
                         * at the first %s
                         */
-                       if (!(newcopy = (char *) ECPGalloc(strlen(copiedquery) + strlen(tobeinserted) + 1, stmt->lineno)))
+                       if (!(newcopy = (char *) ECPGalloc(strlen(copiedquery)
+                                                                                        + strlen(tobeinserted)
+                                                                                        + 1, stmt->lineno)))
+                       {
+                               ECPGfree(copiedquery);
                                return false;
+                       }
 
                        strcpy(newcopy, copiedquery);
                        if ((p = next_insert(newcopy + hostvarl)) == NULL)
@@ -1177,7 +1238,11 @@ ECPGexecute(struct statement * stmt)
                                 * We have an argument but we dont have the matched up
                                 * string in the string
                                 */
-                               ECPGraise(stmt->lineno, ECPG_TOO_MANY_ARGUMENTS, ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS, NULL);
+                               ECPGraise(stmt->lineno, ECPG_TOO_MANY_ARGUMENTS,
+                                                 ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS,
+                                                 NULL);
+                               ECPGfree(copiedquery);
+                               ECPGfree(newcopy);
                                return false;
                        }
                        else
@@ -1217,7 +1282,9 @@ ECPGexecute(struct statement * stmt)
        /* Check if there are unmatched things left. */
        if (next_insert(copiedquery) != NULL)
        {
-               ECPGraise(stmt->lineno, ECPG_TOO_FEW_ARGUMENTS, ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS, NULL);
+               ECPGraise(stmt->lineno, ECPG_TOO_FEW_ARGUMENTS,
+                                 ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS, NULL);
+               ECPGfree(copiedquery);
                return false;
        }
 
@@ -1227,7 +1294,9 @@ ECPGexecute(struct statement * stmt)
        {
                if ((results = PQexec(stmt->connection->connection, "begin transaction")) == NULL)
                {
-                       ECPGraise(stmt->lineno, ECPG_TRANS, ECPG_SQLSTATE_TRANSACTION_RESOLUTION_UNKNOWN, NULL);
+                       ECPGraise(stmt->lineno, ECPG_TRANS,
+                                         ECPG_SQLSTATE_TRANSACTION_RESOLUTION_UNKNOWN, NULL);
+                       ECPGfree(copiedquery);
                        return false;
                }
                PQclear(results);
@@ -1396,6 +1465,7 @@ ECPGdo(int lineno, int compat, int force_indicator, const char *connection_name,
        {
                setlocale(LC_NUMERIC, oldlocale);
                ECPGfree(oldlocale);
+               free_statement(stmt);
                return (false);
        }
        va_end(args);
index ef4461bc1845a7da989d1406273b547e5bc39079..25024875edacce74d1726286619332a8669eb61f 100644 (file)
@@ -14,7 +14,7 @@ enum COMPAT_MODE
 
 enum ARRAY_TYPE
 {
-       ECPG_ARRAY_NOT_SET, ECPG_ARRAY_ARRAY, ECPG_ARRAY_VECTOR, ECPG_ARRAY_NONE
+       ECPG_ARRAY_ERROR, ECPG_ARRAY_NOT_SET, ECPG_ARRAY_ARRAY, ECPG_ARRAY_VECTOR, ECPG_ARRAY_NONE
 };
 
 /* Here are some methods used by the lib. */
index 30781d734f58325c6703cb32dd9250dfacc9cd39..b5600416ef6525ea6c801674ee3c389cfee00476 100644 (file)
@@ -195,7 +195,6 @@ PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf)
        char       *start_pattern;
        struct tm       tm;
 
-       /* XXX error handling ? */
        /* copy the string over */
        strcpy(outbuf, fmtstring);
 
@@ -696,8 +695,6 @@ PGTYPESdate_defmt_asc(date *d, char *fmt, char *str)
                return -1;
        }
 
-       /* XXX: DBCENTURY ? */
-
        *d = date2j(tm.tm_year, tm.tm_mon, tm.tm_mday) - date2j(2000, 1, 1);
 
        return 0;
index dfd7c663fe3fe0145c79e112c645bb1818ca950b..4d3b29493745b6cee1e9bb1be4ee0420b2d6430a 100644 (file)
@@ -2763,7 +2763,7 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp *d,
                        }
                        else
                        {
-                               /* XXX Error: no match */
+                               /* Error: no match */
                                err = 1;
                                return err;
                        }
index 96bc356b971335ad95d8a093b6c50b888b6be86c..421b0fcadee95c9eb0c9b00fe5a5cbd87d6d89dd 100644 (file)
@@ -129,7 +129,10 @@ PGTYPESnumeric_new(void)
                return NULL;
 
        if (alloc_var(var, 0) < 0)
+       {
+               free(var);
                return NULL;
+       }
 
        return var;
 }
index e6062525ab430b6103e74774a194a81b8187ca85..c2a413770f5566015406ede42040761901f4af4d 100644 (file)
@@ -458,8 +458,7 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                                if (*p == '\0')
                                                        return -1;
                                                tmp[2] = *p;
-                                               /* XXX: fall back to strftime */
-
+                                               
                                                /*
                                                 * strftime's month is 0 based, ours is 1 based
                                                 */
@@ -477,7 +476,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                                break;
                                        }
                                case 'G':
-                                       /* XXX: fall back to strftime */
                                        tm->tm_mon -= 1;
                                        i = strftime(q, *pstr_len, "%G", tm);
                                        if (i == 0)
@@ -491,7 +489,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                        replace_type = PGTYPES_TYPE_NOTHING;
                                        break;
                                case 'g':
-                                       /* XXX: fall back to strftime */
                                        {
                                                char       *fmt = "%g"; /* Keep compiler quiet
                                                                                                 * about 2-digit year */
@@ -600,7 +597,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                        replace_type = PGTYPES_TYPE_UINT;
                                        break;
                                case 'U':
-                                       /* XXX: fall back to strftime */
                                        tm->tm_mon -= 1;
                                        i = strftime(q, *pstr_len, "%U", tm);
                                        if (i == 0)
@@ -614,7 +610,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                        replace_type = PGTYPES_TYPE_NOTHING;
                                        break;
                                case 'V':
-                                       /* XXX: fall back to strftime */
                                        i = strftime(q, *pstr_len, "%V", tm);
                                        if (i == 0)
                                                return -1;
@@ -630,7 +625,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                        replace_type = PGTYPES_TYPE_UINT;
                                        break;
                                case 'W':
-                                       /* XXX: fall back to strftime */
                                        tm->tm_mon -= 1;
                                        i = strftime(q, *pstr_len, "%U", tm);
                                        if (i == 0)
@@ -644,7 +638,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                        replace_type = PGTYPES_TYPE_NOTHING;
                                        break;
                                case 'x':
-                                       /* XXX: fall back to strftime */
                                        {
                                                char       *fmt = "%x"; /* Keep compiler quiet
                                                                                                 * about 2-digit year */
@@ -663,7 +656,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                        }
                                        break;
                                case 'X':
-                                       /* XXX: fall back to strftime */
                                        tm->tm_mon -= 1;
                                        i = strftime(q, *pstr_len, "%X", tm);
                                        if (i == 0)
@@ -685,7 +677,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                        replace_type = PGTYPES_TYPE_UINT;
                                        break;
                                case 'z':
-                                       /* XXX: fall back to strftime */
                                        tm->tm_mon -= 1;
                                        i = strftime(q, *pstr_len, "%z", tm);
                                        if (i == 0)
@@ -699,7 +690,6 @@ dttofmtasc_replace(timestamp *ts, date dDate, int dow, struct tm * tm,
                                        replace_type = PGTYPES_TYPE_NOTHING;
                                        break;
                                case 'Z':
-                                       /* XXX: fall back to strftime */
                                        tm->tm_mon -= 1;
                                        i = strftime(q, *pstr_len, "%Z", tm);
                                        if (i == 0)
index 0e509925b1e617be8bf82d065408b67a43f2f1c5..9183be036dd78131b6538b9255a52400b4e5055e 100644 (file)
@@ -38,12 +38,15 @@ main()
        
        text = PGTYPESdate_to_asc(date1);
        printf ("Date: %s\n", text);
+       free(text);
        
        text = PGTYPEStimestamp_to_asc(ts1);
        printf ("timestamp: %s\n", text);
+       free(text);
        
        text = PGTYPESinterval_to_asc(&iv1);
        printf ("interval: %s\n", text);
+       free(text);
 
        PGTYPESdate_mdyjul(mdy, &date2);
        printf("m: %d, d: %d, y: %d\n", mdy[0], mdy[1], mdy[2]);
@@ -59,10 +62,12 @@ main()
        text = PGTYPEStimestamp_to_asc(ts1);
 
        printf("date_day of %s is %d\n", text, PGTYPESdate_dayofweek(ts1));
+       free(text);
 
        PGTYPESdate_today(&date1);
        text = PGTYPESdate_to_asc(date1);
        printf("today is %s\n", text);
+       free(text);
 
        fmt = "(ddd), mmm. dd, yyyy, repeat: (ddd), mmm. dd, yyyy. end";
        out = (char*) malloc(strlen(fmt) + 1);
@@ -82,6 +87,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc1: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "mmmm. dd. yyyy";
@@ -89,6 +95,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc2: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "yy/mm/dd";
@@ -96,6 +103,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc3: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "yy/mm/dd";
@@ -103,6 +111,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc4: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "dd-mm-yy";
@@ -110,6 +119,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc5: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "mmddyy";
@@ -117,6 +127,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc6: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "mmm. dd. yyyy";
@@ -124,6 +135,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc7: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "mmm. dd. yyyy";
@@ -131,6 +143,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc8: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "mm yy   dd.";
@@ -138,6 +151,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc9: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "yyyy fierj mm   dd.";
@@ -145,6 +159,7 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc10: %s\n", text);
+       free(text);
 
        date1 = 0; text = "";
        fmt = "mm/dd/yy";
@@ -152,22 +167,27 @@ main()
        PGTYPESdate_defmt_asc(&date1, fmt, in);
        text = PGTYPESdate_to_asc(date1);
        printf("date_defmt_asc12: %s\n", text);
+       free(text);
 
        PGTYPEStimestamp_current(&ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_current: Now: %s\n", text);
+       free(text);
 
        ts1 = PGTYPEStimestamp_from_asc("96-02-29", NULL);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_to_asc1: %s\n", text);
+       free(text);
 
        ts1 = PGTYPEStimestamp_from_asc("1994-02-11 3:10:35", NULL);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_to_asc2: %s\n", text);
+       free(text);
 
        ts1 = PGTYPEStimestamp_from_asc("1994-02-11 26:10:35", NULL);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_to_asc3: %s\n", text);
+       free(text);
 
 /*     abc-03:10:35-def-02/11/94-gh  */
 /*      12345678901234567890123456789 */
@@ -175,138 +195,161 @@ main()
        out = (char*) malloc(32);
        i = PGTYPEStimestamp_fmt_asc(&ts1, out, 31, "abc-%X-def-%x-ghi%%");
        printf("timestamp_fmt_asc: %d: %s\n", i, out);
+       free(out);
 
        fmt = "This is a %m/%d/%y %H-%Ml%Stest";
        in =  "This is a 4/12/80 3-39l12test";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%a %b %d %H:%M:%S %z %Y";
        in =  "Tue Jul 22 17:28:44 +0200 2003";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%a %b %d %H:%M:%S %z %Y";
        in =  "Tue Feb 29 17:28:44 +0200 2000";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%a %b %d %H:%M:%S %z %Y";
        in =  "Tue Feb 29 17:28:44 +0200 1900";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%a %b %d %H:%M:%S %z %Y";
        in =  "Tue Feb 29 17:28:44 +0200 1996";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%b %d %H:%M:%S %z %Y";
        in =  "      Jul 31 17:28:44 +0200 1996";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%b %d %H:%M:%S %z %Y";
        in =  "      Jul 32 17:28:44 +0200 1996";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%a %b %d %H:%M:%S %z %Y";
        in =  "Tue Feb 29 17:28:44 +0200 1997";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%";
        in =  "Tue Jul 22 17:28:44 +0200 2003";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "a %";
        in =  "Tue Jul 22 17:28:44 +0200 2003";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%b, %d %H_%M`%S %z %Y";
        in =  "    Jul, 22 17_28 `44 +0200  2003  ";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%a %b %%%d %H:%M:%S %Z %Y";
        in =  "Tue Jul %22 17:28:44 CEST 2003";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%a %b %%%d %H:%M:%S %Z %Y";
        in =  "Tue Jul %22 17:28:44 CEST 2003";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "abc%n %C %B %%%d %H:%M:%S %Z %Y";
        in =  "abc\n   19 October %22 17:28:44 CEST 2003";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "abc%n %C %B %%%d %H:%M:%S %Z %y";
        in =  "abc\n   18 October %34 17:28:44 CEST 80";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "";
        in =  "abc\n   18 October %34 17:28:44 CEST 80";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error (should be error!): %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = NULL;
        in =  "1980-04-12 3:49:44      ";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        fmt = "%B %d, %Y. Time: %I:%M%p";
        in =  "July 14, 1988. Time: 9:15am";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        in = "September 6 at 01:30 pm in the year 1983";
        fmt = "%B %d at %I:%M %p in the year %Y";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        in = "  1976, July 14. Time: 9:15am";
        fmt = "%Y,   %B %d. Time: %I:%M %p";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        in = "  1976, July 14. Time: 9:15 am";
        fmt = "%Y,   %B %d. Time: %I:%M%p";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
 
        in = "  1976, P.M. July 14. Time: 9:15";
        fmt = "%Y, %P  %B %d. Time: %I:%M";
        i = PGTYPEStimestamp_defmt_asc(in, fmt, &ts1);
        text = PGTYPEStimestamp_to_asc(ts1);
        printf("timestamp_defmt_asc(%s, %s) = %s, error: %d\n", in, fmt, text, i);
+       free(text);
        exec sql rollback;
         exec sql disconnect;