From 6ea1792bedfc156036a1350f2ab1fcdc47298601 Mon Sep 17 00:00:00 2001 From: Michael Meskes Date: Wed, 24 Aug 2005 10:35:12 +0000 Subject: [PATCH] - Check for NULL before checking whether argument is an array. - Removed stray character from string quoting. - Fixed check to report missing varchar pointer implementation. --- src/interfaces/ecpg/ecpglib/data.c | 46 +++++++++++++-------------- src/interfaces/ecpg/preproc/preproc.y | 13 ++++---- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c index f880cf03c6..201fe9ee7d 100644 --- a/src/interfaces/ecpg/ecpglib/data.c +++ b/src/interfaces/ecpg/ecpglib/data.c @@ -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) diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 747bebf5b4..b0019fa9f3 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -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 && -- 2.39.5