Changeset: 133c95640d15 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=133c95640d15 Modified Files: sql/test/BugTracker/Tests/insert_values.SF-1578838.stable.err.single Branch: sciql Log Message:
merge diffs (truncated from 415 to 300 lines): diff --git a/java/ChangeLog.Dec2011 b/java/ChangeLog.Dec2011 --- a/java/ChangeLog.Dec2011 +++ b/java/ChangeLog.Dec2011 @@ -1,6 +1,9 @@ # ChangeLog file for java # This file is updated with Maddlog +* Tue Dec 27 2011 Fabian Groffen <[email protected]> +- Fixed an AssertionError for special results from e.g. EXPLAIN queries. + * Wed Dec 21 2011 Fabian Groffen <[email protected]> - Fixed overflow error when batching large statements, bug #2952 diff --git a/java/src/nl/cwi/monetdb/jdbc/MonetConnection.java b/java/src/nl/cwi/monetdb/jdbc/MonetConnection.java --- a/java/src/nl/cwi/monetdb/jdbc/MonetConnection.java +++ b/java/src/nl/cwi/monetdb/jdbc/MonetConnection.java @@ -30,6 +30,7 @@ import java.net.SocketTimeoutException; import nl.cwi.monetdb.mcl.io.*; import nl.cwi.monetdb.mcl.net.*; import nl.cwi.monetdb.mcl.parser.*; +import nl.cwi.monetdb.mcl.MCLException; /** * A Connection suitable for the MonetDB database. @@ -216,8 +217,15 @@ public class MonetConnection extends Mon throw new SQLException(error.substring(6), "08001"); } catch (IOException e) { throw new SQLException("Unable to connect (" + hostname + ":" + port + "): " + e.getMessage(), "08006"); - } catch (Exception e) { + } catch (MCLParseException e) { throw new SQLException(e.getMessage(), "08001"); + } catch (MCLException e) { + String[] connex = e.getMessage().split("\n"); + SQLException sqle = new SQLException(connex[0], "08001", e); + for (int i = 1; i < connex.length; i++) { + sqle.setNextException(new SQLException(connex[1], "08001")); + } + throw sqle; } // we seem to have managed to log in, let's store the @@ -1570,19 +1578,23 @@ public class MonetConnection extends Mon /* Below we have to calculate how many "chunks" we need * to allocate to store the entire result. However, if * the user didn't set a cache size, as in this case, we - * need to stick to our defaults. So far, so good. Now - * the problem with XQuery is, that it doesn't support - * any block fetching, so we need to always fetch - * everything at once. For that reason, the cache size - * is here set to the tuplecount, such that we do a full - * fetch at once. To avoid a division by zero lateron, - * we make sure the cache size is not 0 */ - cacheSize = lang == LANG_SQL ? MonetConnection.DEF_FETCHSIZE : (tuplecount + 1); + * need to stick to our defaults. */ + cacheSize = MonetConnection.DEF_FETCHSIZE; cacheSizeSetExplicitly = false; } else { cacheSize = parent.cachesize; cacheSizeSetExplicitly = true; } + /* So far, so good. Now the problem with EXPLAIN, DOT, etc + * queries is, that they don't support any block fetching, + * so we need to always fetch everything at once. For that + * reason, the cache size is here set to the rowcount if + * it's larger, such that we do a full fetch at once. + * (Because we always set a reply_size, we can only get a + * larger rowcount from the server if it doesn't paginate, + * because it's a pseudo SQL result.) */ + if (rowcount > cacheSize) + cacheSize = rowcount; seqnr = seq; closed = false; destroyOnClose = false; diff --git a/java/src/nl/cwi/monetdb/mcl/net/MapiSocket.java b/java/src/nl/cwi/monetdb/mcl/net/MapiSocket.java --- a/java/src/nl/cwi/monetdb/mcl/net/MapiSocket.java +++ b/java/src/nl/cwi/monetdb/mcl/net/MapiSocket.java @@ -284,7 +284,7 @@ public final class MapiSocket { con.getInetAddress().getHostName() + ":" + con.getPort() + ": End of stream reached"); if ((lineType = reader.getLineType()) == BufferedMCLReader.ERROR) { - err += "\n" + tmp.substring(1); + err += "\n" + tmp.substring(7); } else if (lineType == BufferedMCLReader.INFO) { warns.add(tmp.substring(1)); } else if (lineType == BufferedMCLReader.REDIRECT) { diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c --- a/monetdb5/optimizer/opt_pipes.c +++ b/monetdb5/optimizer/opt_pipes.c @@ -55,13 +55,13 @@ struct PIPELINES{ * deterministically, and to check / debug whether "unexpected" problems are related to * mitosis (and/or mergetable). */ -{ "no_mitosis_pipe", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,garbageCollector" }, +{ "no_mitosis_pipe", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,dataflow,history,multiplex,accumulators,garbageCollector" }, /* The sequential pipe line is (and should be kept!) identical to the default pipeline, * except that optimizers mitosis & dataflow are omitted. It is use mainly to make some * tests work deterministically, i.e., avoid ambigious output, by avoiding parallelism. */ -{ "sequential_pipe", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,history,multiplex,garbageCollector" }, +{ "sequential_pipe", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,commonTerms,joinPath,reorder,deadcode,reduce,history,multiplex,accumulators,garbageCollector" }, /* The default pipeline used in the November 2009 release*/ { "nov2009_pipe", "inline,remap,evaluate,costModel,coercions,emptySet,aliases,mergetable,deadcode,constants,commonTerms,joinPath,deadcode,reduce,dataflow,history,multiplex,garbageCollector" }, diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c --- a/sql/server/rel_bin.c +++ b/sql/server/rel_bin.c @@ -1059,8 +1059,8 @@ static stmt * rel2bin_semijoin( mvc *sql, sql_rel *rel, list *refs) { list *l; - node *en, *n; - stmt *left = NULL, *right = NULL, *join = NULL; + node *en = NULL, *n; + stmt *left = NULL, *right = NULL, *join = NULL, *jl, *jr; if (rel->l) /* first construct the left sub relation */ left = subrel_bin(sql, rel->l, refs); @@ -1070,38 +1070,65 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel return NULL; left = row2cols(sql, left); right = row2cols(sql, right); + /* + * split in 2 steps, + * first cheap join(s) (equality or idx) + * second selects/filters + */ if (rel->exps) { + int idx = 0; + list *jns = list_new(sql->sa); + for( en = rel->exps->h; en; en = en->next ) { - stmt *s = exp_bin(sql, en->data, left, right, NULL, NULL); - + int join_idx = sql->opt_stats[0]; + sql_exp *e = en->data; + stmt *s = NULL; + + /* only handle simple joins here */ + if (list_length(jns) && (idx || !e->type == e_cmp || e->flag != cmp_equal)) + break; + + s = exp_bin(sql, en->data, left, right, NULL, NULL); if (!s) { assert(0); return NULL; } + if (join_idx != sql->opt_stats[0]) + idx = 1; if (!join) { join = s; - } else { - /* break column join */ - stmt *l = stmt_mark(sql->sa, stmt_reverse(sql->sa, join), 100); - stmt *r = stmt_mark(sql->sa, join, 100); - stmt *ld = s->op1; - stmt *rd = stmt_reverse(sql->sa, s->op2); - stmt *le = stmt_join(sql->sa, l, ld, cmp_equal); - stmt *re = stmt_join(sql->sa, r, rd, cmp_equal); - - sql_subfunc *f = sql_bind_func(sql->sa, sql->session->schema, compare_func((comp_type)s->flag), tail_type(le), tail_type(le), F_FUNC); - stmt * cmp; - - assert(f); - - cmp = stmt_binop(sql->sa, le, re, f); - - cmp = stmt_uselect(sql->sa, cmp, stmt_bool(sql->sa, 1), cmp_equal); - - l = stmt_semijoin(sql->sa, l, cmp); - r = stmt_semijoin(sql->sa, r, cmp); - join = stmt_join(sql->sa, stmt_reverse(sql->sa, l), r, cmp_equal); + /* stop on first non equality join */ + } else if (s->type != st_join && + s->type != st_join2 && + s->type != st_joinN) { + if (s->type == st_reverse) { + stmt *rs = s->op1; + + if (rs->type == st_join || + rs->type == st_join2 || + rs->type == st_joinN) { + list_append(jns, s); + continue; + } + } + /* handle select expressions */ + /*assert(0);*/ + /* should be handled by join list (reljoin) */ + if (s->h == join->h) { + join = stmt_semijoin(sql->sa, join,s); + } else { + join = stmt_reverse(sql->sa, join); + join = stmt_semijoin(sql->sa, join,s); + join = stmt_reverse(sql->sa, join); + } + continue; } + list_append(jns, s); + } + if (list_length(jns) > 1) { + join = stmt_releqjoin(sql->sa, jns); + } else { + join = jns->h->data; } } else { /* TODO: this case could use some optimization */ @@ -1109,6 +1136,52 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel stmt *r = bin_first_column(sql->sa, right); join = stmt_join(sql->sa, l, stmt_reverse(sql->sa, r), cmp_all); } + jl = stmt_reverse(sql->sa, stmt_mark_tail(sql->sa, join,0)); + jr = stmt_reverse(sql->sa, stmt_mark_tail(sql->sa, stmt_reverse(sql->sa, join),0)); + if (en) { + stmt *sub, *sel; + list *nl; + + /* construct relation */ + nl = list_new(sql->sa); + + /* first project using equi-joins */ + for( n = left->op4.lval->h; n; n = n->next ) { + stmt *c = n->data; + char *rnme = table_name(sql->sa, c); + char *nme = column_name(sql->sa, c); + stmt *s = stmt_project(sql->sa, jl, column(sql->sa, c) ); + + s = stmt_alias(sql->sa, s, rnme, nme); + list_append(nl, s); + } + for( n = right->op4.lval->h; n; n = n->next ) { + stmt *c = n->data; + char *rnme = table_name(sql->sa, c); + char *nme = column_name(sql->sa, c); + stmt *s = stmt_project(sql->sa, jr, column(sql->sa, c) ); + + s = stmt_alias(sql->sa, s, rnme, nme); + list_append(nl, s); + } + sub = stmt_list(sql->sa, nl); + + /* continue with non equi-joins */ + sel = stmt_relselect_init(sql->sa); + for( ; en; en = en->next ) { + stmt *s = exp_bin(sql, en->data, sub, NULL, NULL, NULL); + + if (!s) { + assert(0); + return NULL; + } + stmt_relselect_fill(sel, s); + } + /* recreate join output */ + sel = stmt_reverse(sql->sa, stmt_mark_tail(sql->sa, sel, 0)); + jl = stmt_project(sql->sa, sel, jl); + jr = stmt_project(sql->sa, sel, jr); + } /* construct relation */ l = list_new(sql->sa); @@ -1117,10 +1190,10 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel Reduce this using difference and semijoin */ if (rel->op == op_anti) { stmt *c = left->op4.lval->h->data; - join = stmt_diff(sql->sa, c, join); + join = stmt_diff(sql->sa, c, stmt_reverse(sql->sa, jl)); } else { stmt *c = left->op4.lval->h->data; - join = stmt_semijoin(sql->sa, c, join); + join = stmt_semijoin(sql->sa, c, stmt_reverse(sql->sa, jl)); } join = stmt_reverse(sql->sa, stmt_mark_tail(sql->sa, join,0)); 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 @@ -5030,7 +5030,7 @@ rel_setquery(mvc *sql, sql_rel *rel, sym sql_rel *t2 = table_ref(sql, NULL, tab_ref2); assert(n->next->type == type_int); - (void)rel; /* TODO correlated unions */ + (void)rel; /* TODO correlated setqueries */ if (!t1 || !t2) return NULL; diff --git a/sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out b/sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out --- a/sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out +++ b/sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out @@ -61,7 +61,7 @@ function user.s4_1{autoCommit=true}():vo X_6:bat[:oid,:oid] := sql.bind_dbat(X_2,"sys","sf_2596114",1); X_9 := bat.reverse(X_6); X_18 := algebra.kdifference(X_17,X_9); - X_19:bat[:oid,:dbl] := batcalc.*(X_18,X_18); + X_19:bat[:oid,:dbl] := batcalc.*(X_18,X_18,true,true); X_20 := sql.resultSet(1,1,X_19); sql.rsColumn(X_20,"sys.","sql_mul_x","double",53,0,X_19); X_25 := io.stdout(); diff --git a/sql/test/BugTracker/Tests/insert_values.SF-1578838.stable.err.single b/sql/test/BugTracker/Tests/insert_values.SF-1578838.stable.err.single deleted file mode 100644 --- a/sql/test/BugTracker/Tests/insert_values.SF-1578838.stable.err.single _______________________________________________ Checkin-list mailing list [email protected] http://mail.monetdb.org/mailman/listinfo/checkin-list
