diff options
Diffstat (limited to 'src/interfaces/ecpg/ecpglib/data.c')
-rw-r--r-- | src/interfaces/ecpg/ecpglib/data.c | 869 |
1 files changed, 436 insertions, 433 deletions
diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c index 4f474d3bcf1..ab1f2554ce5 100644 --- a/src/interfaces/ecpg/ecpglib/data.c +++ b/src/interfaces/ecpg/ecpglib/data.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.34 2006/08/24 10:35:58 meskes Exp $ */ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.35 2006/10/04 00:30:11 momjian Exp $ */ #define POSTGRES_ECPG_INTERNAL #include "postgres_fe.h" @@ -16,7 +16,10 @@ #include "pgtypes_timestamp.h" #include "pgtypes_interval.h" -static enum { NOT_CHECKED, REGRESS, NORMAL } ECPG_regression_mode = NOT_CHECKED; +static enum +{ + NOT_CHECKED, REGRESS, NORMAL +} ECPG_regression_mode = NOT_CHECKED; static bool garbage_left(enum ARRAY_TYPE isarray, char *scan_length, enum COMPAT_MODE compat) @@ -47,11 +50,11 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, long ind_offset, enum ARRAY_TYPE isarray, enum COMPAT_MODE compat, bool force_indicator) { struct sqlca_t *sqlca = ECPGget_sqlca(); - char *pval = (char *) PQgetvalue(results, act_tuple, act_field); - int binary = PQfformat(results, act_field); - int size = PQgetlength(results, act_tuple, act_field); - int value_for_indicator = 0; - long log_offset; + char *pval = (char *) PQgetvalue(results, act_tuple, act_field); + int binary = PQfformat(results, act_field); + int size = PQgetlength(results, act_tuple, act_field); + int value_for_indicator = 0; + long log_offset; /* * use a global variable to see if the environment variable @@ -62,13 +65,13 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, { if (getenv("ECPG_REGRESSION")) ECPG_regression_mode = REGRESS; - else + else ECPG_regression_mode = NORMAL; } /* - * If we are running in a regression test, do not log the offset - * variable, it depends on the machine's alignment. + * If we are running in a regression test, do not log the offset variable, + * it depends on the machine's alignment. */ if (ECPG_regression_mode == REGRESS) log_offset = -1; @@ -167,15 +170,15 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, { if (pval) { - if (varcharsize == 0 || varcharsize*offset >= size) + if (varcharsize == 0 || varcharsize * offset >= size) memcpy((char *) ((long) var + offset * act_tuple), pval, size); else { memcpy((char *) ((long) var + offset * act_tuple), - pval, varcharsize*offset); + pval, varcharsize * offset); - if (varcharsize*offset < size) + if (varcharsize * offset < size) { /* truncation */ switch (ind_type) @@ -206,533 +209,533 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno, } pval += size; } - } + } else { - switch (type) - { - long res; - unsigned long ures; - double dres; - char *scan_length; - numeric *nres; - date ddres; - timestamp tres; - interval *ires; - - case ECPGt_short: - case ECPGt_int: - case ECPGt_long: - if (pval) - { - res = strtol(pval, &scan_length, 10); - if (garbage_left(isarray, scan_length, compat)) + switch (type) + { + long res; + unsigned long ures; + double dres; + char *scan_length; + numeric *nres; + date ddres; + timestamp tres; + interval *ires; + + case ECPGt_short: + case ECPGt_int: + case ECPGt_long: + if (pval) { - ECPGraise(lineno, ECPG_INT_FORMAT, - ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + res = strtol(pval, &scan_length, 10); + if (garbage_left(isarray, scan_length, compat)) + { + ECPGraise(lineno, ECPG_INT_FORMAT, + ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); + return (false); + } + pval = scan_length; } - pval = scan_length; - } - else - res = 0L; + else + res = 0L; - switch (type) - { - case ECPGt_short: - *((short *) (var + offset * act_tuple)) = (short) res; - break; - case ECPGt_int: - *((int *) (var + offset * act_tuple)) = (int) res; - break; - case ECPGt_long: - *((long *) (var + offset * act_tuple)) = (long) res; - break; - default: - /* Cannot happen */ - break; - } - break; + switch (type) + { + case ECPGt_short: + *((short *) (var + offset * act_tuple)) = (short) res; + break; + case ECPGt_int: + *((int *) (var + offset * act_tuple)) = (int) res; + break; + case ECPGt_long: + *((long *) (var + offset * act_tuple)) = (long) res; + break; + default: + /* Cannot happen */ + break; + } + break; - case ECPGt_unsigned_short: - case ECPGt_unsigned_int: - case ECPGt_unsigned_long: - if (pval) - { - ures = strtoul(pval, &scan_length, 10); - if (garbage_left(isarray, scan_length, compat)) + case ECPGt_unsigned_short: + case ECPGt_unsigned_int: + case ECPGt_unsigned_long: + if (pval) { - ECPGraise(lineno, ECPG_UINT_FORMAT, - ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + ures = strtoul(pval, &scan_length, 10); + if (garbage_left(isarray, scan_length, compat)) + { + ECPGraise(lineno, ECPG_UINT_FORMAT, + ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); + return (false); + } + pval = scan_length; } - pval = scan_length; - } - else - ures = 0L; + else + ures = 0L; - switch (type) - { - case ECPGt_unsigned_short: - *((unsigned short *) (var + offset * act_tuple)) = (unsigned short) ures; - break; - case ECPGt_unsigned_int: - *((unsigned int *) (var + offset * act_tuple)) = (unsigned int) ures; - break; - case ECPGt_unsigned_long: - *((unsigned long *) (var + offset * act_tuple)) = (unsigned long) ures; - break; - default: - /* Cannot happen */ - break; - } - break; + switch (type) + { + case ECPGt_unsigned_short: + *((unsigned short *) (var + offset * act_tuple)) = (unsigned short) ures; + break; + case ECPGt_unsigned_int: + *((unsigned int *) (var + offset * act_tuple)) = (unsigned int) ures; + break; + case ECPGt_unsigned_long: + *((unsigned long *) (var + offset * act_tuple)) = (unsigned long) ures; + break; + default: + /* Cannot happen */ + break; + } + break; #ifdef HAVE_LONG_LONG_INT_64 #ifdef HAVE_STRTOLL - case ECPGt_long_long: - if (pval) - { - *((long long int *) (var + offset * act_tuple)) = strtoll(pval, &scan_length, 10); - if (garbage_left(isarray, scan_length, compat)) + case ECPGt_long_long: + if (pval) { - ECPGraise(lineno, ECPG_INT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + *((long long int *) (var + offset * act_tuple)) = strtoll(pval, &scan_length, 10); + if (garbage_left(isarray, scan_length, compat)) + { + ECPGraise(lineno, ECPG_INT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); + return (false); + } + pval = scan_length; } - pval = scan_length; - } - else - *((long long int *) (var + offset * act_tuple)) = (long long) 0; + else + *((long long int *) (var + offset * act_tuple)) = (long long) 0; - break; + break; #endif /* HAVE_STRTOLL */ #ifdef HAVE_STRTOULL - case ECPGt_unsigned_long_long: - if (pval) - { - *((unsigned long long int *) (var + offset * act_tuple)) = strtoull(pval, &scan_length, 10); - if ((isarray && *scan_length != ',' && *scan_length != '}') - || (!isarray && !(INFORMIX_MODE(compat) && *scan_length == '.') && *scan_length != '\0' && *scan_length != ' ')) /* Garbage left */ + case ECPGt_unsigned_long_long: + if (pval) { - ECPGraise(lineno, ECPG_UINT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + *((unsigned long long int *) (var + offset * act_tuple)) = strtoull(pval, &scan_length, 10); + if ((isarray && *scan_length != ',' && *scan_length != '}') + || (!isarray && !(INFORMIX_MODE(compat) && *scan_length == '.') && *scan_length != '\0' && *scan_length != ' ')) /* Garbage left */ + { + ECPGraise(lineno, ECPG_UINT_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); + return (false); + } + pval = scan_length; } - pval = scan_length; - } - else - *((unsigned long long int *) (var + offset * act_tuple)) = (long long) 0; + else + *((unsigned long long int *) (var + offset * act_tuple)) = (long long) 0; - break; + break; #endif /* HAVE_STRTOULL */ #endif /* HAVE_LONG_LONG_INT_64 */ - case ECPGt_float: - case ECPGt_double: - if (pval) - { - if (isarray && *pval == '"') - dres = strtod(pval + 1, &scan_length); - else - dres = strtod(pval, &scan_length); - - if (isarray && *scan_length == '"') - scan_length++; - - if (garbage_left(isarray, scan_length, compat)) + case ECPGt_float: + case ECPGt_double: + if (pval) { - ECPGraise(lineno, ECPG_FLOAT_FORMAT, - ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); - } - pval = scan_length; - } - else - dres = 0.0; + if (isarray && *pval == '"') + dres = strtod(pval + 1, &scan_length); + else + dres = strtod(pval, &scan_length); - switch (type) - { - case ECPGt_float: - *((float *) (var + offset * act_tuple)) = dres; - break; - case ECPGt_double: - *((double *) (var + offset * act_tuple)) = dres; - break; - default: - /* Cannot happen */ - break; - } - break; + if (isarray && *scan_length == '"') + scan_length++; - case ECPGt_bool: - if (pval) - { - if (pval[0] == 'f' && pval[1] == '\0') - { - if (offset == sizeof(char)) - *((char *) (var + offset * act_tuple)) = false; - else if (offset == sizeof(int)) - *((int *) (var + offset * act_tuple)) = false; - else - ECPGraise(lineno, ECPG_CONVERT_BOOL, - ECPG_SQLSTATE_DATATYPE_MISMATCH, - "different size"); - break; + if (garbage_left(isarray, scan_length, compat)) + { + ECPGraise(lineno, ECPG_FLOAT_FORMAT, + ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); + return (false); + } + pval = scan_length; } - else if (pval[0] == 't' && pval[1] == '\0') + else + dres = 0.0; + + switch (type) { - if (offset == sizeof(char)) - *((char *) (var + offset * act_tuple)) = true; - else if (offset == sizeof(int)) - *((int *) (var + offset * act_tuple)) = true; - else - ECPGraise(lineno, ECPG_CONVERT_BOOL, - ECPG_SQLSTATE_DATATYPE_MISMATCH, - "different size"); - break; + case ECPGt_float: + *((float *) (var + offset * act_tuple)) = dres; + break; + case ECPGt_double: + *((double *) (var + offset * act_tuple)) = dres; + break; + default: + /* Cannot happen */ + break; } - else if (pval[0] == '\0' && PQgetisnull(results, act_tuple, act_field)) + break; + + case ECPGt_bool: + if (pval) { - /* NULL is valid */ - break; + if (pval[0] == 'f' && pval[1] == '\0') + { + if (offset == sizeof(char)) + *((char *) (var + offset * act_tuple)) = false; + else if (offset == sizeof(int)) + *((int *) (var + offset * act_tuple)) = false; + else + ECPGraise(lineno, ECPG_CONVERT_BOOL, + ECPG_SQLSTATE_DATATYPE_MISMATCH, + "different size"); + break; + } + else if (pval[0] == 't' && pval[1] == '\0') + { + if (offset == sizeof(char)) + *((char *) (var + offset * act_tuple)) = true; + else if (offset == sizeof(int)) + *((int *) (var + offset * act_tuple)) = true; + else + ECPGraise(lineno, ECPG_CONVERT_BOOL, + ECPG_SQLSTATE_DATATYPE_MISMATCH, + "different size"); + break; + } + else if (pval[0] == '\0' && PQgetisnull(results, act_tuple, act_field)) + { + /* NULL is valid */ + break; + } } - } - ECPGraise(lineno, ECPG_CONVERT_BOOL, - ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); - break; + ECPGraise(lineno, ECPG_CONVERT_BOOL, + ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); + return (false); + break; - case ECPGt_char: - case ECPGt_unsigned_char: - if (pval) - { - if (varcharsize == 0 || varcharsize > size) - strncpy((char *) ((long) var + offset * act_tuple), pval, size + 1); - else + case ECPGt_char: + case ECPGt_unsigned_char: + if (pval) { - strncpy((char *) ((long) var + offset * act_tuple), pval, varcharsize); - - if (varcharsize < size) + if (varcharsize == 0 || varcharsize > size) + strncpy((char *) ((long) var + offset * act_tuple), pval, size + 1); + else { - /* truncation */ - switch (ind_type) + strncpy((char *) ((long) var + offset * act_tuple), pval, varcharsize); + + if (varcharsize < size) { - case ECPGt_short: - case ECPGt_unsigned_short: - *((short *) (ind + ind_offset * act_tuple)) = size; - break; - case ECPGt_int: - case ECPGt_unsigned_int: - *((int *) (ind + ind_offset * act_tuple)) = size; - break; - case ECPGt_long: - case ECPGt_unsigned_long: - *((long *) (ind + ind_offset * act_tuple)) = size; - break; + /* truncation */ + switch (ind_type) + { + case ECPGt_short: + case ECPGt_unsigned_short: + *((short *) (ind + ind_offset * act_tuple)) = size; + break; + case ECPGt_int: + case ECPGt_unsigned_int: + *((int *) (ind + ind_offset * act_tuple)) = size; + break; + case ECPGt_long: + case ECPGt_unsigned_long: + *((long *) (ind + ind_offset * act_tuple)) = size; + break; #ifdef HAVE_LONG_LONG_INT_64 - case ECPGt_long_long: - case ECPGt_unsigned_long_long: - *((long long int *) (ind + ind_offset * act_tuple)) = size; - break; + case ECPGt_long_long: + case ECPGt_unsigned_long_long: + *((long long int *) (ind + ind_offset * act_tuple)) = size; + break; #endif /* HAVE_LONG_LONG_INT_64 */ - default: - break; + default: + break; + } + sqlca->sqlwarn[0] = sqlca->sqlwarn[1] = 'W'; } - sqlca->sqlwarn[0] = sqlca->sqlwarn[1] = 'W'; } + pval += size; } - pval += size; - } - break; + break; - case ECPGt_varchar: - if (pval) - { - struct ECPGgeneric_varchar *variable = - (struct ECPGgeneric_varchar *) ((long) var + offset * act_tuple); - - variable->len = size; - if (varcharsize == 0) - strncpy(variable->arr, pval, variable->len); - else + case ECPGt_varchar: + if (pval) { - strncpy(variable->arr, pval, varcharsize); + struct ECPGgeneric_varchar *variable = + (struct ECPGgeneric_varchar *) ((long) var + offset * act_tuple); - if (variable->len > varcharsize) + variable->len = size; + if (varcharsize == 0) + strncpy(variable->arr, pval, variable->len); + else { - /* truncation */ - switch (ind_type) + strncpy(variable->arr, pval, varcharsize); + + if (variable->len > varcharsize) { - case ECPGt_short: - case ECPGt_unsigned_short: - *((short *) (ind + offset * act_tuple)) = variable->len; - break; - case ECPGt_int: - case ECPGt_unsigned_int: - *((int *) (ind + offset * act_tuple)) = variable->len; - break; - case ECPGt_long: - case ECPGt_unsigned_long: - *((long *) (ind + offset * act_tuple)) = variable->len; - break; + /* truncation */ + switch (ind_type) + { + case ECPGt_short: + case ECPGt_unsigned_short: + *((short *) (ind + offset * act_tuple)) = variable->len; + break; + case ECPGt_int: + case ECPGt_unsigned_int: + *((int *) (ind + offset * act_tuple)) = variable->len; + break; + case ECPGt_long: + case ECPGt_unsigned_long: + *((long *) (ind + offset * act_tuple)) = variable->len; + break; #ifdef HAVE_LONG_LONG_INT_64 - case ECPGt_long_long: - case ECPGt_unsigned_long_long: - *((long long int *) (ind + ind_offset * act_tuple)) = variable->len; - break; + case ECPGt_long_long: + case ECPGt_unsigned_long_long: + *((long long int *) (ind + ind_offset * act_tuple)) = variable->len; + break; #endif /* HAVE_LONG_LONG_INT_64 */ - default: - break; - } - sqlca->sqlwarn[0] = sqlca->sqlwarn[1] = 'W'; + default: + break; + } + sqlca->sqlwarn[0] = sqlca->sqlwarn[1] = 'W'; - variable->len = varcharsize; + variable->len = varcharsize; + } } + pval += size; } - pval += size; - } - break; + break; - case ECPGt_decimal: - case ECPGt_numeric: - if (pval) - { - if (isarray && *pval == '"') - nres = PGTYPESnumeric_from_asc(pval + 1, &scan_length); - else - nres = PGTYPESnumeric_from_asc(pval, &scan_length); - - /* did we get an error? */ - if (nres == NULL) + case ECPGt_decimal: + case ECPGt_numeric: + if (pval) { - ECPGlog("ECPGget_data line %d: RESULT: %s errno %d\n", - lineno, pval ? pval : "", errno); + if (isarray && *pval == '"') + nres = PGTYPESnumeric_from_asc(pval + 1, &scan_length); + else + nres = PGTYPESnumeric_from_asc(pval, &scan_length); - if (INFORMIX_MODE(compat)) + /* did we get an error? */ + if (nres == NULL) { - /* - * Informix wants its own NULL value here instead - * of an error - */ - nres = PGTYPESnumeric_new(); - if (nres) - ECPGset_noind_null(ECPGt_numeric, nres); + ECPGlog("ECPGget_data line %d: RESULT: %s errno %d\n", + lineno, pval ? pval : "", errno); + + if (INFORMIX_MODE(compat)) + { + /* + * Informix wants its own NULL value here + * instead of an error + */ + 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_OUT_OF_MEMORY, - ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL); + ECPGraise(lineno, ECPG_NUMERIC_FORMAT, + ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); return (false); } } else { - ECPGraise(lineno, ECPG_NUMERIC_FORMAT, - ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); - } - } - else - { - if (isarray && *scan_length == '"') - scan_length++; + if (isarray && *scan_length == '"') + scan_length++; - if (garbage_left(isarray, scan_length, compat)) - { - free(nres); - ECPGraise(lineno, ECPG_NUMERIC_FORMAT, + if (garbage_left(isarray, scan_length, compat)) + { + free(nres); + ECPGraise(lineno, ECPG_NUMERIC_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + return (false); + } } + pval = scan_length; } - pval = scan_length; - } - else - nres = PGTYPESnumeric_from_asc("0.0", &scan_length); - - if (type == ECPGt_numeric) - PGTYPESnumeric_copy(nres, (numeric *) (var + offset * act_tuple)); - else - PGTYPESnumeric_to_decimal(nres, (decimal *) (var + offset * act_tuple)); - - free(nres); - break; + else + nres = PGTYPESnumeric_from_asc("0.0", &scan_length); - case ECPGt_interval: - if (pval) - { - if (isarray && *pval == '"') - ires = PGTYPESinterval_from_asc(pval + 1, &scan_length); + if (type == ECPGt_numeric) + PGTYPESnumeric_copy(nres, (numeric *) (var + offset * act_tuple)); else - ires = PGTYPESinterval_from_asc(pval, &scan_length); + PGTYPESnumeric_to_decimal(nres, (decimal *) (var + offset * act_tuple)); + + free(nres); + break; - /* did we get an error? */ - if (ires == NULL) + case ECPGt_interval: + if (pval) { - if (INFORMIX_MODE(compat)) + if (isarray && *pval == '"') + ires = PGTYPESinterval_from_asc(pval + 1, &scan_length); + else + ires = PGTYPESinterval_from_asc(pval, &scan_length); + + /* did we get an error? */ + if (ires == NULL) { - /* - * Informix wants its own NULL value here instead - * of an error - */ - ires = (interval *) ECPGalloc(sizeof(interval), lineno); - if (!ires) + if (INFORMIX_MODE(compat)) + { + /* + * 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); return (false); - - ECPGset_noind_null(ECPGt_interval, ires); + } } else { - ECPGraise(lineno, ECPG_INTERVAL_FORMAT, - ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); - } - } - else - { - if (isarray && *scan_length == '"') - scan_length++; + if (isarray && *scan_length == '"') + scan_length++; - if (garbage_left(isarray, scan_length, compat)) - { - free(ires); - ECPGraise(lineno, ECPG_INTERVAL_FORMAT, + if (garbage_left(isarray, scan_length, compat)) + { + free(ires); + ECPGraise(lineno, ECPG_INTERVAL_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + return (false); + } } + pval = scan_length; } - pval = scan_length; - } - else - ires = PGTYPESinterval_from_asc("0 seconds", NULL); - - PGTYPESinterval_copy(ires, (interval *) (var + offset * act_tuple)); - free(ires); - break; - case ECPGt_date: - if (pval) - { - if (isarray && *pval == '"') - ddres = PGTYPESdate_from_asc(pval + 1, &scan_length); else - ddres = PGTYPESdate_from_asc(pval, &scan_length); + ires = PGTYPESinterval_from_asc("0 seconds", NULL); - /* did we get an error? */ - if (errno != 0) + PGTYPESinterval_copy(ires, (interval *) (var + offset * act_tuple)); + free(ires); + break; + case ECPGt_date: + if (pval) { - if (INFORMIX_MODE(compat)) - { - /* - * Informix wants its own NULL value here instead - * of an error - */ - ECPGset_noind_null(ECPGt_date, &ddres); - } + if (isarray && *pval == '"') + ddres = PGTYPESdate_from_asc(pval + 1, &scan_length); else + ddres = PGTYPESdate_from_asc(pval, &scan_length); + + /* did we get an error? */ + if (errno != 0) { - ECPGraise(lineno, ECPG_DATE_FORMAT, + if (INFORMIX_MODE(compat)) + { + /* + * Informix wants its own NULL value here + * instead of an error + */ + ECPGset_noind_null(ECPGt_date, &ddres); + } + else + { + ECPGraise(lineno, ECPG_DATE_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + return (false); + } } - } - else - { - if (isarray && *scan_length == '"') - scan_length++; - - if (garbage_left(isarray, scan_length, compat)) + else { - ECPGraise(lineno, ECPG_DATE_FORMAT, + if (isarray && *scan_length == '"') + scan_length++; + + if (garbage_left(isarray, scan_length, compat)) + { + ECPGraise(lineno, ECPG_DATE_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + return (false); + } } - } - - *((date *) (var + offset * act_tuple)) = ddres; - pval = scan_length; - } - break; - case ECPGt_timestamp: - if (pval) - { - if (isarray && *pval == '"') - tres = PGTYPEStimestamp_from_asc(pval + 1, &scan_length); - else - tres = PGTYPEStimestamp_from_asc(pval, &scan_length); + *((date *) (var + offset * act_tuple)) = ddres; + pval = scan_length; + } + break; - /* did we get an error? */ - if (errno != 0) + case ECPGt_timestamp: + if (pval) { - if (INFORMIX_MODE(compat)) - { - /* - * Informix wants its own NULL value here instead - * of an error - */ - ECPGset_noind_null(ECPGt_timestamp, &tres); - } + if (isarray && *pval == '"') + tres = PGTYPEStimestamp_from_asc(pval + 1, &scan_length); else + tres = PGTYPEStimestamp_from_asc(pval, &scan_length); + + /* did we get an error? */ + if (errno != 0) { - ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, + if (INFORMIX_MODE(compat)) + { + /* + * Informix wants its own NULL value here + * instead of an error + */ + ECPGset_noind_null(ECPGt_timestamp, &tres); + } + else + { + ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + return (false); + } } - } - else - { - if (isarray && *scan_length == '"') - scan_length++; - - if (garbage_left(isarray, scan_length, compat)) + else { - ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, + if (isarray && *scan_length == '"') + scan_length++; + + if (garbage_left(isarray, scan_length, compat)) + { + ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval); - return (false); + return (false); + } } - } - *((timestamp *) (var + offset * act_tuple)) = tres; - pval = scan_length; - } - break; + *((timestamp *) (var + offset * act_tuple)) = tres; + pval = scan_length; + } + break; - default: - ECPGraise(lineno, ECPG_UNSUPPORTED, - ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, - ECPGtype_name(type)); - return (false); - break; - } - if (isarray == ECPG_ARRAY_ARRAY) - { - bool string = false; + default: + ECPGraise(lineno, ECPG_UNSUPPORTED, + ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, + ECPGtype_name(type)); + return (false); + break; + } + if (isarray == ECPG_ARRAY_ARRAY) + { + bool string = false; - /* set array to next entry */ - ++act_tuple; + /* set array to next entry */ + ++act_tuple; - /* set pval to the next entry */ - for (; string || (*pval != ',' && *pval != '}' && *pval != '\0'); ++pval) - if (*pval == '"') - string = string ? false : true; + /* set pval to the next entry */ + for (; string || (*pval != ',' && *pval != '}' && *pval != '\0'); ++pval) + if (*pval == '"') + string = string ? false : true; - if (*pval == ',') - ++pval; - } - else if (isarray == ECPG_ARRAY_VECTOR) - { - bool string = false; + if (*pval == ',') + ++pval; + } + else if (isarray == ECPG_ARRAY_VECTOR) + { + bool string = false; - /* set array to next entry */ - ++act_tuple; + /* set array to next entry */ + ++act_tuple; - /* set pval to the next entry */ - for (; string || (*pval != ' ' && *pval != '\0'); ++pval) - if (*pval == '"') - string = string ? false : true; + /* set pval to the next entry */ + for (; string || (*pval != ' ' && *pval != '\0'); ++pval) + if (*pval == '"') + string = string ? false : true; - if (*pval == ' ') - ++pval; - } + if (*pval == ' ') + ++pval; + } } } while (*pval != '\0' && ((isarray == ECPG_ARRAY_ARRAY && *pval != '}') || isarray == ECPG_ARRAY_VECTOR)); |