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