- Check for NULL before checking whether argument is an array.
authorMichael Meskes <[email protected]>
Wed, 24 Aug 2005 10:35:12 +0000 (10:35 +0000)
committerMichael Meskes <[email protected]>
Wed, 24 Aug 2005 10:35:12 +0000 (10:35 +0000)
- Removed stray character from string quoting.
- Fixed check to report missing varchar pointer implementation.

src/interfaces/ecpg/ecpglib/data.c
src/interfaces/ecpg/preproc/preproc.y

index f880cf03c6ed982297e2933425fbbac031cc7702..201fe9ee7d8d79793895913c9bb9051894bf147e 100644 (file)
@@ -50,29 +50,6 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
 
        ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld array: %s\n", lineno, pval ? pval : "", offset, isarray ? "Yes" : "No");
 
-       /* pval is a pointer to the value */
-       /* let's check if it really is an array if it should be one */
-       if (isarray == ECPG_ARRAY_ARRAY)
-       {
-               if (*pval != '{')
-               {
-                       ECPGraise(lineno, ECPG_DATA_NOT_ARRAY, ECPG_SQLSTATE_DATATYPE_MISMATCH, NULL);
-                       return (false);
-               }
-
-               switch (type)
-               {
-                       case ECPGt_char:
-                       case ECPGt_unsigned_char:
-                       case ECPGt_varchar:
-                               break;
-
-                       default:
-                               pval++;
-                               break;
-               }
-       }
-
        /* We will have to decode the value */
 
        /*
@@ -129,6 +106,29 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
        if (value_for_indicator == -1)
                return (true);
 
+       /* pval is a pointer to the value */
+       /* let's check if it really is an array if it should be one */
+       if (isarray == ECPG_ARRAY_ARRAY)
+       {
+               if (*pval != '{')
+               {
+                       ECPGraise(lineno, ECPG_DATA_NOT_ARRAY, ECPG_SQLSTATE_DATATYPE_MISMATCH, NULL);
+                       return (false);
+               }
+
+               switch (type)
+               {
+                       case ECPGt_char:
+                       case ECPGt_unsigned_char:
+                       case ECPGt_varchar:
+                               break;
+
+                       default:
+                               pval++;
+                               break;
+               }
+       }
+
        do
        {
                switch (type)
index 747bebf5b4cdf7f9584a3e221dfda339d0637a37..b0019fa9f32bdce8391a14156d01a7726d16c02e 100644 (file)
@@ -1580,7 +1580,7 @@ CreateAsStmt:  CREATE OptTemp TABLE qualified_name OptCreateAs WithOidsAs
                        if (FoundInto == 1)
                                mmerror(PARSE_ERROR, ET_ERROR, "CREATE TABLE / AS SELECT may not specify INTO");
 
-                       $$ = cat_str(8, make_str("create"), $2, make_str("table"), $4, $5, $6, $8);
+                       $$ = cat_str(7, make_str("create"), $2, make_str("table"), $4, $5, $6, $8);
                }
                ;
 
@@ -1621,7 +1621,7 @@ CreateAsElement:  ColId { $$ = $1; }
  *****************************************************************************/
 
 CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList
-                       { $$ = cat_str(4, make_str("create"), $2, make_str("sequence"), $4, $5); }
+                       { $$ = cat_str(5, make_str("create"), $2, make_str("sequence"), $4, $5); }
                ;
 
 AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList
@@ -2705,7 +2705,7 @@ DropdbStmt: DROP DATABASE database_name
 
 CreateDomainStmt:  CREATE DOMAIN_P any_name opt_as Typename ColQualList
                        {
-                               $$ = cat_str(55555, make_str("create domain"), $3, $4, $5, $6);
+                               $$ = cat_str(5, make_str("create domain"), $3, $4, $5, $6);
                        }
                ;
 
@@ -4690,7 +4690,7 @@ type_declaration: S_TYPEDEF
                        this->type->type_index = length;    /* length of string */
                        this->type->type_sizeof = ECPGstruct_sizeof;
                        this->struct_member_list = ($3.type_enum == ECPGt_struct || $3.type_enum == ECPGt_union) ?
-                               struct_member_list[struct_level] : NULL;
+                               ECPGstruct_member_dup(struct_member_list[struct_level]) : NULL;
 
                        if ($3.type_enum != ECPGt_varchar &&
                            $3.type_enum != ECPGt_char &&
@@ -5142,7 +5142,8 @@ variable: opt_pointer ECPGColLabel opt_array_bounds opt_initializer
                                                        *dim = '\0';
                                        else    
                                                        sprintf(dim, "[%s]", dimension);
-                                       if (strcmp(length, "0") == 0)
+                                       /* if (strcmp(length, "0") == 0)*/
+                                       if (atoi(length) <= 0)
                                                mmerror(PARSE_ERROR, ET_ERROR, "pointer to varchar are not implemented");
 
                                        if (strcmp(dimension, "0") == 0)
@@ -5556,7 +5557,7 @@ ECPGTypedef: TYPE_P
                                this->type->type_index = length;        /* length of string */
                                this->type->type_sizeof = ECPGstruct_sizeof;
                                this->struct_member_list = ($5.type_enum == ECPGt_struct || $5.type_enum == ECPGt_union) ?
-                                       struct_member_list[struct_level] : NULL;
+                                       ECPGstruct_member_dup(struct_member_list[struct_level]) : NULL;
 
                                if ($5.type_enum != ECPGt_varchar &&
                                        $5.type_enum != ECPGt_char &&