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