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

merging with Feb2013


diffs (164 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
@@ -3211,6 +3211,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:
@@ -3708,11 +3708,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;
@@ -4802,17 +4800,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;
 }
@@ -5366,7 +5377,9 @@ rel_merge_table_rewrite(int *changes, mv
                                        }
                                }
                        }
-                       if (nrel)
+                       if (nrel && list_length(t->tables.set) == 1) {
+                               nrel = rel_project(sql->sa, nrel, rel->exps);
+                       } else if (nrel)
                                nrel->exps = rel->exps;
                        rel_destroy(rel);
                        return nrel;
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
@@ -1649,6 +1649,9 @@ table_ref(mvc *sql, sql_rel *rel, symbol
                        }
                        return rel;
                }
+               if ((isMergeTable(t) || isReplicaTable(t)) && 
list_empty(t->tables.set))
+                       return sql_error(sql, 02, "Unable to query empty Merge 
or Replica tables");
+
                return rel_basetable(sql, t, tname);
        } else if (tableref->token == SQL_VALUES) {
                return rel_values(sql, tableref);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -1397,19 +1397,29 @@ tr_update_delta( sql_trans *tr, sql_delt
        /* any inserts */
        if (BUNlast(ins) > BUNfirst(ins) || cleared) {
                if (BUNlast(ins) > ins->batInserted && (store_nr_active > 1)) { 
+                       int done = 0;
                        BAT *ci = temp_descriptor(obat->ibid);
                        BUN nr;
 
-                       if (isEbat(ci)) {
+                       if (isEbat(ci) || !BATcount(ci)) {
+
                                temp_destroy(obat->ibid);
-                               obat->ibid = temp_copy(ci->batCacheid, FALSE);
+                               if (!ins->batInserted) {
+                                       obat->ibid = temp_create(ins);
+                                       done = 1;
+                                       nr = BATcount(ins);
+                               } else {
+                                       obat->ibid = temp_copy(ci->batCacheid, 
FALSE);
+                               }
                                bat_destroy(ci);
                                ci = temp_descriptor(obat->ibid);
                                BATseqbase(ci, cbat->ibase);
                        }
-                       assert(BATcount(cur) == cbat->ibase);
-                       assert(obat->ibase == cbat->ibase);
-                       nr = append_inserted(ci, ins);
+                       if (!done) {
+                               assert(BATcount(cur) == cbat->ibase);
+                               assert(obat->ibase == cbat->ibase);
+                               nr = append_inserted(ci, ins);
+                       }
                        obat->cnt += nr;
                        assert(obat->cnt == cbat->cnt);
                        assert(BATcount(ci) == BATcount(ins));
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;
 }
@@ -4209,7 +4210,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