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