Changeset: 20d5b7a25853 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=20d5b7a25853
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_optimizer.c
        sql/storage/store.c
Branch: Feb2013
Log Message:

make sure we use sorteness when using select expressions


diffs (102 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3304,6 +3304,8 @@ update_check_ukey(mvc *sql, stmt **updat
                                if ((k->type == ukey) && stmt_has_null(upd)) {
                                        stmt *nn = stmt_selectnonil(sql, upd, 
NULL);
                                        upd = stmt_reorder_project(sql->sa, nn, 
upd);
+                                       if (grp)
+                                               grp = 
stmt_reorder_project(sql->sa, nn, grp);
                                }
 
                                g = stmt_group(sql->sa, upd, grp, ext, Cnt);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -385,7 +385,7 @@ exp_count(int *cnt, int seqnr, sql_exp *
                default:
                        return 0;
                }
-       case e_column:
+       case e_column: 
                *cnt += 20;
                return 20;
        case e_atom:
@@ -3762,11 +3762,9 @@ rel_groupby_order(int *changes, mvc *sql
                node *n;
                int i, *scores = calloc(list_length(gbe), sizeof(int));
 
-               for (i = 0, n = gbe->h; n; i++, n = n->next) {
+               for (i = 0, n = gbe->h; n; i++, n = n->next) 
                        scores[i] = score_gbe(sql, rel, n->data);
-               }
                rel->r = list_keysort(gbe, scores, (fdup)NULL);
-
                free(scores);
        }
        return rel;
@@ -4853,17 +4851,30 @@ exp_merge(list *exps)
 }
 #endif
 
+static int
+score_se( mvc *sql, sql_rel *rel, sql_exp *e)
+{
+       int score = 0;
+       if (e->type == e_cmp && !is_complex_exp(e->flag)) {
+               score += score_gbe(sql, rel, e->l);
+       }
+       score += exp_keyvalue(e);
+       return score;
+}
+
 static sql_rel *
 rel_select_order(int *changes, mvc *sql, sql_rel *rel) 
 {
        (void)changes;
        (void)sql;
        if (is_select(rel->op) && rel->exps && list_length(rel->exps)>1) {
-               list *exps = NULL;
-                       
-               exps = list_sort(rel->exps, (fkeyvalue)&exp_keyvalue, 
(fdup)NULL);
-               /*rel->exps = exp_merge(exps);*/
-               rel->exps = exps;
+               int i, *scores = calloc(list_length(rel->exps), sizeof(int));
+               node *n;
+
+               for (i = 0, n = rel->exps->h; n; i++, n = n->next) 
+                       scores[i] = score_se(sql, rel, n->data);
+               rel->exps = list_keysort(rel->exps, scores, (fdup)NULL);
+               free(scores);
        }
        return rel;
 }
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -477,6 +477,7 @@ load_column(sql_trans *tr, sql_table *t,
        c->t = t;
        if (isTable(c->t))
                store_funcs.create_col(tr, c);
+       c->sorted = sql_trans_is_sorted(tr, c);
        if (bs_debug)
                fprintf(stderr, "#\t\tload column %s\n", c->base.name);
        return c;
@@ -1155,7 +1156,7 @@ dup_sql_column(sql_allocator *sa, sql_ta
        col->storage_type = NULL;
        if (c->storage_type)
                col->storage_type = sa_strdup(sa, c->storage_type);
-       col->sorted = sql_trans_is_sorted(NULL, c);
+       col->sorted = c->sorted;
        cs_add(&t->columns, col, TR_NEW);
        return col;
 }
@@ -4202,7 +4203,7 @@ sql_trans_alter_default(sql_trans *tr, s
 int
 sql_trans_is_sorted( sql_trans *tr, sql_column *col )
 {
-       if (col && store_funcs.sorted_col(tr, col))
+       if (col && isTable(col->t) && store_funcs.sorted_col && 
store_funcs.sorted_col(tr, col))
                return 1;
        return 0;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to