Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv27441/src/server

Modified Files:
        rel_bin.mx rel_exp.mx rel_optimizer.mx rel_select.mx 
        sql_schema.mx 
Log Message:
order joins stemming from sql in statements, on smallest value list first 


U rel_select.mx
Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- rel_select.mx       11 Aug 2008 19:08:44 -0000      1.84
+++ rel_select.mx       22 Aug 2008 09:52:19 -0000      1.85
@@ -888,6 +888,9 @@
 
        for (n = l->h; n; n = n->next ) {
                lrel = n->data;
+
+               if (rel_is_ref(lrel))
+                       break;
                
                /* push down as long as the operators allow this */
                if (!is_select(lrel->op) && lrel->op != op_join && 
@@ -945,6 +948,9 @@
                lrel = ln->data;
                rrel = rn->data;
                
+               if (rel_is_ref(lrel) || rel_is_ref(rrel))
+                       break;
+
                /* push down as long as the operators allow this
                        and the relation is equal.
                 */
@@ -2007,7 +2013,7 @@
                                }
                                right = rl;
                        }
-                       if (!right->name)
+                       if (right->processed && !right->name)
                                rel_label(right, ++sql->label);
                        right = rel_distinct(right);
                } else {
@@ -2198,15 +2204,35 @@
        {
                symbol *lo = sc->data.lval->h->data.sym;
                symbol *ro = sc->data.lval->h->next->data.sym;
-               sql_rel *ls = rel;
-               sql_rel *rs = rel_copy(rel);
 
-               ls = rel_logical_exp(sql, ls, lo, f);
-               rs = rel_logical_exp(sql, rs, ro, f);
+               sql_rel *lr = rel;
+               sql_rel *rr = rel_copy(rel);
 
-               if (!ls || !rs)
+               lr = rel_logical_exp(sql, lr, lo, f);
+               rr = rel_logical_exp(sql, rr, ro, f);
+
+               if (!lr || !rr)
                        return NULL;
-               return rel_or(sql, ls, rs, f);
+               return rel_or(sql, lr, rr, f);
+
+/*
+               char *name;
+               sql_rel *lr, *rr;
+
+               rel_label(rel, ++sql->label);
+               name = rel->name;
+               stack_push_rel_view(sql, name, rel);
+               lr = stack_find_rel_view(sql, name);
+               rr = stack_find_rel_view(sql, name);
+               
+               lr = rel_logical_exp(sql, lr, lo, f);
+               rr = rel_logical_exp(sql, rr, ro, f);
+
+               if (!lr || !rr)
+                       return NULL;
+               
+               return rel_or(sql, lr, rr, f);
+*/
        }
        case SQL_AND:
        {
@@ -2284,7 +2310,8 @@
                                }
                                right = rl;
                        }
-                       rel_label(right, ++sql->label);
+                       if (right->processed && !right->name)
+                               rel_label(right, ++sql->label);
                        right = rel_distinct(right);
                } else {
                        return sql_error(sql, 02, "IN: missing inner query");

U rel_exp.mx
Index: rel_exp.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_exp.mx,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- rel_exp.mx  23 Jun 2008 21:27:04 -0000      1.12
+++ rel_exp.mx  22 Aug 2008 09:52:19 -0000      1.13
@@ -493,10 +493,12 @@
                case op_except:
                case op_inter:
                {
-                       if (rel->l)
-                               ne = rel_find_exp(rel->l, e);
-                       else if (rel->exps)
-                               ne = exps_bind_column(rel->exps, e->r);
+                       if (!rel->name) {
+                               if (rel->l)
+                                       ne = rel_find_exp(rel->l, e);
+                               else if (rel->exps)
+                                       ne = exps_bind_column(rel->exps, e->r);
+                       }
                }
                break;
                case op_basetable: 

U rel_optimizer.mx
Index: rel_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_optimizer.mx,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- rel_optimizer.mx    11 Aug 2008 19:08:44 -0000      1.22
+++ rel_optimizer.mx    22 Aug 2008 09:52:19 -0000      1.23
@@ -702,11 +702,30 @@
        return top;
 }
 
-static void
+static int
+rel_neg_in_size(sql_rel *r)
+{
+       if (is_union(r->op) && r->nrcols == 0) 
+               return -1 + rel_neg_in_size(r->l);
+       if (is_project(r->op) && r->nrcols == 0) 
+               return -1;
+       return 0;
+}
+
+static list *
 push_in_join_down(list *rels, list *exps)
 {
        node *n;
        int restart = 1;
+       list *nrels;
+
+       /* we should sort these first, ie small in's before large one's */
+       nrels = list_sort(rels, (fkeyvalue)&rel_neg_in_size, (fdup)&rel_dup);
+
+       /* we need to cleanup, the new refs ! */
+       rels->destroy = (fdestroy)rel_destroy;
+       list_destroy(rels);
+       rels = nrels;
 
        /* one of the rels should be a op_union with nrcols == 0 */
        while(restart) {
@@ -714,7 +733,7 @@
                sql_rel *r = n->data;
        
                restart = 0;
-               if (is_union(r->op) && r->nrcols == 0) {
+               if ((is_union(r->op) || is_project(r->op)) && r->nrcols == 0) {
                        /* next step find expression on this relation */
                        node *m;
                        sql_rel *l = NULL;
@@ -746,6 +765,7 @@
                }
            }
        }
+       return rels;
 }
 
 static sql_rel *
@@ -773,8 +793,7 @@
                for(n = rels->h; n; n = n->next) 
                        rel_print(sql, n->data, 0);
 #endif
-               push_in_join_down(rels, exps);
-
+               rels = push_in_join_down(rels, exps);
                rel = order_joins(rels, exps);
        }
        list_destroy(rels);

U rel_bin.mx
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- rel_bin.mx  11 Aug 2008 19:08:39 -0000      1.50
+++ rel_bin.mx  22 Aug 2008 09:52:18 -0000      1.51
@@ -1448,7 +1448,7 @@
                stmt *s = n->data;
                char *name = table_name(s->op1.lval->h->data);
                
-               if (strcmp(name, rel->name) == 0) {
+               if (rel->name && strcmp(name, rel->name) == 0) {
                        _DELETE(name);
                        return stmt_dup(s);
                }

U sql_schema.mx
Index: sql_schema.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_schema.mx,v
retrieving revision 1.145
retrieving revision 1.146
diff -u -d -r1.145 -r1.146
--- sql_schema.mx       11 Aug 2008 19:08:46 -0000      1.145
+++ sql_schema.mx       22 Aug 2008 09:52:19 -0000      1.146
@@ -851,6 +851,42 @@
                                mvc_create_dependency(sql, c->base.id, 
i->base.id, INDEX_DEPENDENCY);
                        }
                }
+               /* now we need to create the cluster table */
+               if (!idx_is_column(itype)) {
+                       char buf[BUFSIZ];
+                       int l;
+                       node *n;
+                       sql_kc *ic = NULL;
+                       sql_table *t = mvc_create_cluster(sql, ss, 
i->base.name, 1, SQL_PERSIST, CA_COMMIT, 0); 
+
+                       if (!t) 
+                               return sql_error(sql, 02, "CREATE INDEX: cannot 
create cluster table '%s'", iname);
+                       for( n = i->columns->h; n; n = n->next) {
+                               sql_kc *ic = n->data;
+                               mvc_create_column(sql, t, ic->c->base.name, 
&ic->c->type);
+                       }
+                       /* oid to link back to the original table */
+                       mvc_create_column(sql, t, "OID", 
sql_bind_localtype("oid"));
+
+                       /* Add triggers for, insert, update and delete on the   
                           original table */
+                       l = snprintf(buf, BUFSIZ, "create trigger ins_%s before 
insert on %s referencing old as tab new as ins for each row insert into %s 
values(", t->base.name, i->t->base.name, t->base.name);
+                       for( n = i->columns->h; n; n = n->next) {
+                               ic = n->data;
+                               l += snprintf(buf+l, BUFSIZ-l, "ins.%s, ", 
ic->c->base.name);
+                       }
+                       l += snprintf(buf+l, BUFSIZ-l, "rowid(ins.%s, '%s', 
'%s'));", ic->c->base.name, ic->c->t->s->base.name, ic->c->t->base.name);
+
+                       l += snprintf(buf+l, BUFSIZ-l, "create trigger upd_%s 
before update on %s referencing old as tab new as upd for each row update %s ", 
t->base.name, i->t->base.name, t->base.name);
+                       for( n = i->columns->h; n; n = n->next) {
+                               ic = n->data;
+                               l += snprintf(buf+l, BUFSIZ-l, "set %s = 
upd.%s%c, ", ic->c->base.name, ic->c->base.name, (n->next)?',':' ');
+                       }
+                       l += snprintf(buf+l, BUFSIZ-l, "where upd.OID = 
%s.OID;", t->base.name);
+
+                       l += snprintf(buf+l, BUFSIZ-l, "create trigger del_%s 
before delete on %s referencing old as del for each row delete from %s ", 
t->base.name, i->t->base.name, t->base.name);
+                       l += snprintf(buf+l, BUFSIZ-l, "where del.OID = 
%s.OID;", t->base.name);
+                       return stmt_sql(_strdup(buf));
+               }
                return stmt_none();
        }
 }


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to