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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list