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

Reply via email to