Changeset: 8c3652e8186f for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8c3652e8186f Modified Files: clients/mapiclient/dump.c clients/mapilib/mapi.c clients/odbc/driver/ODBCConvert.c clients/odbc/driver/SQLExecute.c Branch: default Log Message:
Merge with Oct2012 branch. diffs (178 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -244,8 +244,13 @@ dump_foreign_keys(Mapi mid, const char * "ORDER BY \"fs\".\"name\",\"fkt\".\"name\"," "\"fkk\".\"name\", \"nr\""; } - if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) + hdl = mapi_query(mid, query); + if (query != NULL && maxquerylen != 0) + free(query); + maxquerylen = 0; + if (hdl == NULL || mapi_error(mid)) goto bailout; + cnt = mapi_fetch_row(hdl); while (cnt != 0) { char *c_psname = mapi_fetch_field(hdl, 0); @@ -1289,13 +1294,19 @@ dump_external_functions(Mapi mid, const " EXTERNAL NAME \"%s\".\"%s\";\n", prev_f_mod, prev_f_func); free(prev_f_id); + } + if (prev_f_mod) free(prev_f_mod); + if (prev_f_func) free(prev_f_func); + if (prev_a_name) free(prev_a_name); + if (prev_a_type) free(prev_a_type); + if (prev_a_type_digits) free(prev_a_type_digits); + if (prev_a_type_scale) free(prev_a_type_scale); - } mapi_close_handle(hdl); return mnstr_errnr(toConsole) ? 1 : 0; diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c --- a/clients/mapilib/mapi.c +++ b/clients/mapilib/mapi.c @@ -2282,7 +2282,8 @@ connect_to_server(Mapi mid) } memset(&userver, 0, sizeof(struct sockaddr_un)); userver.sun_family = AF_UNIX; - strncpy(userver.sun_path, mid->hostname, sizeof(userver.sun_path)); + strncpy(userver.sun_path, mid->hostname, sizeof(userver.sun_path) - 1); + userver.sun_path[sizeof(userver.sun_path) - 1] = 0; s = socket(PF_UNIX, SOCK_STREAM, 0); if (connect(s, serv, sizeof(struct sockaddr_un)) < 0) { @@ -4540,7 +4541,7 @@ mapi_quick_response(MapiHdl hdl, FILE *f mapi_hdl_check(hdl, "mapi_quick_response"); do { - if ((line = mapi_result_error(hdl)) != NULL) + if (mapi_result_error(hdl) != NULL) mapi_explain_result(hdl, fd); while ((line = mapi_fetch_line(hdl)) != NULL) fprintf(fd, "%s\n", line); diff --git a/clients/odbc/driver/ODBCConvert.c b/clients/odbc/driver/ODBCConvert.c --- a/clients/odbc/driver/ODBCConvert.c +++ b/clients/odbc/driver/ODBCConvert.c @@ -166,13 +166,16 @@ parsesecondinterval(bignum_t *nval, SQL_ switch (type) { case SQL_INTERVAL_DAY: /* SQL_C_INTERVAL_DAY */ nval->val *= 24; + /* fall through */ case SQL_INTERVAL_HOUR: /* SQL_C_INTERVAL_HOUR */ case SQL_INTERVAL_DAY_TO_HOUR: /* SQL_C_INTERVAL_DAY_TO_HOUR */ nval->val *= 60; + /* fall through */ case SQL_INTERVAL_MINUTE: /* SQL_C_INTERVAL_MINUTE */ case SQL_INTERVAL_HOUR_TO_MINUTE: /* SQL_C_INTERVAL_HOUR_TO_MINUTE */ case SQL_INTERVAL_DAY_TO_MINUTE: /* SQL_C_INTERVAL_DAY_TO_MINUTE */ nval->val *= 60; + /* fall through */ case SQL_INTERVAL_SECOND: /* SQL_C_INTERVAL_SECOND */ case SQL_INTERVAL_MINUTE_TO_SECOND: /* SQL_C_INTERVAL_MINUTE_TO_SECOND */ case SQL_INTERVAL_HOUR_TO_SECOND: /* SQL_C_INTERVAL_HOUR_TO_SECOND */ @@ -2680,12 +2683,14 @@ ODBCFetch(ODBCStmt *stmt, #define assign(buf,bufpos,buflen,value,stmt) \ do { \ if (bufpos >= buflen) { \ - buf = realloc(buf, buflen += 1024); \ - if (buf == NULL) { \ + char *b = realloc(buf, buflen += 1024); \ + if (b == NULL) { \ + free(buf); \ /* Memory allocation error */ \ addStmtError(stmt, "HY001", NULL, 0); \ return SQL_ERROR; \ } \ + buf = b; \ } \ buf[bufpos++] = (value); \ } while (0) @@ -2694,12 +2699,14 @@ ODBCFetch(ODBCStmt *stmt, size_t _len = strlen(value); \ size_t _i; \ while (bufpos + _len >= buflen) { \ - buf = realloc(buf, buflen += 1024); \ - if (buf == NULL) { \ + char *b = realloc(buf, buflen += 1024); \ + if (b == NULL) { \ + free(buf); \ /* Memory allocation error */ \ addStmtError(stmt, "HY001", NULL, 0); \ return SQL_ERROR; \ } \ + buf = b; \ } \ for (_i = 0; _i < _len; _i++) \ buf[bufpos++] = (value)[_i]; \ @@ -2879,7 +2886,7 @@ ODBCStore(ODBCStmt *stmt, nval.sign = ((SQL_NUMERIC_STRUCT *) ptr)->sign; nval.val = 0; for (i = 0; i < SQL_MAX_NUMERIC_LEN; i++) - nval.val |= ((SQL_NUMERIC_STRUCT *) ptr)->val[i] << (i * 8); + nval.val |= (SQLUBIGINT) ((SQL_NUMERIC_STRUCT *) ptr)->val[i] << (i * 8); break; case SQL_C_FLOAT: fval = * (SQLREAL *) ptr; @@ -3013,6 +3020,7 @@ ODBCStore(ODBCStmt *stmt, } assigns(buf, bufpos, buflen, sep, stmt); + *bufp = buf; /* just the types supported by the server */ switch (sqltype) { case SQL_CHAR: @@ -3366,6 +3374,8 @@ ODBCStore(ODBCStmt *stmt, #endif case SQL_C_BINARY: if (parsemonthintervalstring(&sval, &slen, &ival) == SQL_ERROR) { + /* Invalid character value for cast + * specification */ addStmtError(stmt, "22018", NULL, 0); return SQL_ERROR; } @@ -3426,6 +3436,8 @@ ODBCStore(ODBCStmt *stmt, #endif case SQL_C_BINARY: if (parsesecondintervalstring(&sval, &slen, &ival, &ivalprec) == SQL_ERROR) { + /* Invalid character value for cast + * specification */ addStmtError(stmt, "22018", NULL, 0); return SQL_ERROR; } diff --git a/clients/odbc/driver/SQLExecute.c b/clients/odbc/driver/SQLExecute.c --- a/clients/odbc/driver/SQLExecute.c +++ b/clients/odbc/driver/SQLExecute.c @@ -421,16 +421,21 @@ SQLExecute_(ODBCStmt *stmt) offset = 0; sep = ""; for (i = 1; i <= stmt->nparams; i++) { - if (ODBCStore(stmt, i, offset, 0, &query, &querypos, &querylen, sep) == SQL_ERROR) + if (ODBCStore(stmt, i, offset, 0, &query, &querypos, &querylen, sep) == SQL_ERROR) { + if (query) + free(query); return SQL_ERROR; + } sep = ","; } if (querypos + 1 >= querylen) { - query = realloc(query, querylen += 10); - if (query == NULL) { + char *q = realloc(query, querylen += 10); + if (q == NULL) { + free(query); addStmtError(stmt, "HY001", NULL, 0); return SQL_ERROR; } + query = q; } query[querypos++] = ')'; query[querypos] = 0; _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list