Changeset: b50dadf65e4d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b50dadf65e4d
Added Files:
sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.sql
sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.stable.err
sql/test/BugTracker-2017/Tests/aggr_udf_with_more_than_2params.Bug-6385.stable.out
Modified Files:
clients/mapilib/mapi.c
clients/odbc/driver/ODBCDesc.c
common/stream/stream.c
sql/benchmarks/tpch/load.sh
sql/server/rel_select.c
sql/test/BugTracker-2017/Tests/All
Branch: default
Log Message:
Merge with Jul2017 branch.
diffs (truncated from 577 to 300 lines):
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -989,7 +989,16 @@ static int mapi_initialized = 0;
return (e); \
} \
} while (0)
-#define REALLOC(p,c) ((p) = ((p) ? realloc((p),(c)*sizeof(*(p))) :
malloc((c)*sizeof(*(p)))))
+#define REALLOC(p, c) \
+ do { \
+ if (p) { \
+ void *tmp = (p); \
+ (p) = realloc((p), (c) * sizeof(*(p))); \
+ if ((p) == NULL) \
+ free(tmp); \
+ } else \
+ (p) = malloc((c) * sizeof(*(p))); \
+ } while (0)
/*
* Blocking
@@ -1010,11 +1019,13 @@ static int mapi_initialized = 0;
* errors, and mapi_explain or mapi_explain_query to print a formatted error
* report.
*/
+static char nomem[] = "Memory allocation failed";
+
static void
mapi_clrError(Mapi mid)
{
assert(mid);
- if (mid->errorstr)
+ if (mid->errorstr && mid->errorstr != nomem)
free(mid->errorstr);
mid->action = 0; /* contains references to constants */
mid->error = 0;
@@ -1026,7 +1037,10 @@ mapi_setError(Mapi mid, const char *msg,
{
assert(msg);
REALLOC(mid->errorstr, strlen(msg) + 1);
- strcpy(mid->errorstr, msg);
+ if (mid->errorstr == NULL)
+ mid->errorstr = nomem;
+ else
+ strcpy(mid->errorstr, msg);
mid->error = error;
mid->action = action;
return mid->error;
@@ -1574,7 +1588,7 @@ close_result(MapiHdl hdl)
result->cache.line = NULL;
result->cache.tuplecount = 0;
}
- if (result->errorstr)
+ if (result->errorstr && result->errorstr != nomem)
free(result->errorstr);
result->errorstr = NULL;
memset(result->sqlstate, 0, sizeof(result->sqlstate));
@@ -1613,8 +1627,12 @@ add_error(struct MapiResultSet *result,
error += 6;
}
REALLOC(result->errorstr, size + strlen(error) + 2);
- strcpy(result->errorstr + size, error);
- strcat(result->errorstr + size, "\n");
+ if (result->errorstr == NULL)
+ result->errorstr = nomem;
+ else {
+ strcpy(result->errorstr + size, error);
+ strcat(result->errorstr + size, "\n");
+ }
}
const char *
@@ -2134,7 +2152,7 @@ mapi_destroy(Mapi mid)
(void) mapi_disconnect(mid);
if (mid->blk.buf)
free(mid->blk.buf);
- if (mid->errorstr)
+ if (mid->errorstr && mid->errorstr != nomem)
free(mid->errorstr);
if (mid->hostname)
free(mid->hostname);
@@ -2774,7 +2792,8 @@ mapi_reconnect(Mapi mid)
mid->errorstr = NULL;
mapi_close_handle(hdl);
mapi_setError(mid, errorstr, "mapi_reconnect", error);
- free(errorstr); /* now free it after a copy has been made */
+ if (errorstr != nomem)
+ free(errorstr); /* now free it after a copy has been
made */
close_connection(mid);
return mid->error;
}
@@ -3216,9 +3235,14 @@ mapi_prepare(Mapi mid, const char *cmd)
do { \
/* note: k==strlen(hdl->query) */ \
if (k+len >= lim) { \
+ char *q = hdl->query; \
lim = k + len + MAPIBLKSIZE; \
hdl->query = realloc(hdl->query, lim); \
- assert(hdl->query); \
+ if (hdl->query == NULL) { \
+ free(q); \
+ return; \
+ } \
+ hdl->query = q; \
} \
} while (0)
@@ -3236,7 +3260,8 @@ mapi_param_store(MapiHdl hdl)
lim = strlen(hdl->template) + MAPIBLKSIZE;
REALLOC(hdl->query, lim);
- assert(hdl->query);
+ if (hdl->query == NULL)
+ return;
hdl->query[0] = 0;
k = 0;
@@ -3252,7 +3277,8 @@ mapi_param_store(MapiHdl hdl)
if (k + (q - p) >= lim) {
lim += MAPIBLKSIZE;
REALLOC(hdl->query, lim);
- assert(hdl->query);
+ if (hdl->query == NULL)
+ return;
}
strncpy(hdl->query + k, p, q - p);
k += q - p;
diff --git a/clients/odbc/driver/ODBCDesc.c b/clients/odbc/driver/ODBCDesc.c
--- a/clients/odbc/driver/ODBCDesc.c
+++ b/clients/odbc/driver/ODBCDesc.c
@@ -163,10 +163,14 @@ setODBCDescRecCount(ODBCDesc *desc, int
desc->descRec = NULL;
} else if (desc->descRec == NULL) {
assert(desc->sql_desc_count == 0);
- desc->descRec = (ODBCDescRec *) malloc((count + 1) *
sizeof(*desc->descRec));
+ desc->descRec = malloc((count + 1) * sizeof(*desc->descRec));
} else {
+ ODBCDescRec *p;
assert(desc->sql_desc_count > 0);
- desc->descRec = (ODBCDescRec *) realloc(desc->descRec, (count +
1) * sizeof(*desc->descRec));
+ p = realloc(desc->descRec, (count + 1) *
sizeof(*desc->descRec));
+ if (p == NULL)
+ return; /* TODO: error handling */
+ desc->descRec = p;
}
if (count > desc->sql_desc_count) {
int i;
diff --git a/common/stream/stream.c b/common/stream/stream.c
--- a/common/stream/stream.c
+++ b/common/stream/stream.c
@@ -3448,8 +3448,13 @@ buffer_get_buf(buffer *b)
if (b == NULL)
return NULL;
- if (b->pos == b->len && (b->buf = realloc(b->buf, b->len + 1)) == NULL)
- return NULL;
+ if (b->pos == b->len) {
+ if ((r = realloc(b->buf, b->len + 1)) == NULL) {
+ /* keep b->buf in tact */
+ return NULL;
+ }
+ b->buf = r;
+ }
r = b->buf;
r[b->pos] = '\0';
b->buf = malloc(b->len);
@@ -3505,14 +3510,14 @@ buffer_write(stream *s, const void *buf,
return -1;
}
if (b->pos + size > b->len) {
- size_t ns = b->len;
-
- while (b->pos + size > ns)
- ns *= 2;
- if ((b->buf = realloc(b->buf, ns)) == NULL) {
+ char *p;
+ size_t ns = b->pos + size + 8192;
+
+ if ((p = realloc(b->buf, ns)) == NULL) {
s->errnr = MNSTR_WRITE_ERROR;
return -1;
}
+ b->buf = p;
b->len = ns;
}
memcpy(b->buf + b->pos, buf, size);
@@ -5076,12 +5081,14 @@ bstream_read(bstream *s, size_t size)
}
assert(s->buf != NULL);
- if (s->len == s->size &&
- (s->buf = realloc(s->buf, (s->size <<= 1) + 1)) == NULL) {
- s->size = 0;
- s->len = 0;
- s->pos = 0;
- return -1;
+ if (s->len == s->size) {
+ char *p;
+ size_t ns = s->size + size + 8192;
+ if ((p = realloc(s->buf, ns + 1)) == NULL) {
+ return -1;
+ }
+ s->size = ns;
+ s->buf = p;
}
if (size > s->size - s->len)
@@ -5127,12 +5134,14 @@ bstream_readline(bstream *s)
}
assert(s->buf != NULL);
- if (s->len == s->size &&
- (s->buf = realloc(s->buf, (s->size <<= 1) + 1)) == NULL) {
- s->size = 0;
- s->len = 0;
- s->pos = 0;
- return -1;
+ if (s->len == s->size) {
+ char *p;
+ size_t ns = s->size + size + 8192;
+ if ((p = realloc(s->buf, ns + 1)) == NULL) {
+ return -1;
+ }
+ s->size = ns;
+ s->buf = p;
}
if (size > s->size - s->len)
diff --git a/sql/benchmarks/tpch/load.sh b/sql/benchmarks/tpch/load.sh
--- a/sql/benchmarks/tpch/load.sh
+++ b/sql/benchmarks/tpch/load.sh
@@ -24,8 +24,8 @@ SF='sf-0.01'
#SF='sf-5'
dir=`echo $SF | tr '[a-z]' '[A-Z]'`
-$SQL < c.sql
-#$SQL < c.sql-primary-foreign
-cat load-$SF-LOCKED.sql$T | sed -e s+PWD+$PWD/$dir+ | $SQL
-#cat load-$SF.sql$T | sed -e s+PWD+$PWD/$dir+ | $SQL
+#$SQL < c.sql
+$SQL < c.sql-primary-foreign
+#cat load-$SF-LOCKED.sql$T | sed -e s+PWD+$PWD/$dir+ | $SQL
+cat load-$SF.sql$T | sed -e s+PWD+$PWD/$dir+ | $SQL
#$SQL < alter.sql
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1545,8 +1545,20 @@ rel_filter(mvc *sql, sql_rel *rel, list
return rel_select(sql->sa, rel, e);
if (/*is_semi(rel->op) ||*/ is_outerjoin(rel->op)) {
- rel_join_add_exp(sql->sa, rel, e);
- return rel;
+ if ((is_left(rel->op) || is_full(rel->op)) &&
rel_find_exp(rel->l, l->h->data)) {
+ rel_join_add_exp(sql->sa, rel, e);
+ return rel;
+ } else if ((is_right(rel->op) || is_full(rel->op)) &&
rel_find_exp(rel->r, l->h->data)) {
+ rel_join_add_exp(sql->sa, rel, e);
+ return rel;
+ }
+ if (is_left(rel->op) && rel_find_exp(rel->r,
l->h->data)) {
+ rel->r = rel_push_select(sql, rel->r, L, e);
+ return rel;
+ } else if (is_right(rel->op) && rel_find_exp(rel->l,
l->h->data)) {
+ rel->l = rel_push_select(sql, rel->l, L, e);
+ return rel;
+ }
}
/* push select into the given relation */
return rel_push_select(sql, rel, L, e);
@@ -2935,8 +2947,15 @@ rel_unop(mvc *sql, sql_rel **rel, symbol
sql->session->status = 0;
sql->errstr[0] = '\0';
e = rel_value_exp(sql, rel, l->next->data.sym, fs, iek);
- if (!e)
+ if (!e) {
+ if (!f && *rel && (*rel)->card == CARD_AGGR) {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ return sql_error(sql, 02, "SELECT: no such aggregate
'%s'", fname);
+ }
return NULL;
+ }
t = exp_subtype(e);
if (!t) {
@@ -3220,8 +3239,14 @@ rel_binop(mvc *sql, sql_rel **rel, symbo
l = rel_value_exp(sql, rel, dl->next->data.sym, f, iek);
r = rel_value_exp(sql, rel, dl->next->next->data.sym, f, iek);
- if (!l && !r)
+ if (!l || !r)
sf = find_func(sql, s, fname, 2, F_AGGR, NULL);
+ if (!sf && (!l || !r) && *rel && (*rel)->card == CARD_AGGR) {
+ /* reset error */
+ sql->session->status = 0;
+ sql->errstr[0] = '\0';
+ return sql_error(sql, 02, "SELECT: no such aggregate '%s'",
fname);
+ }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list