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