Changeset: 4a7afd146f4c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4a7afd146f4c
Modified Files:
sql/backends/monet5/sql_optimizer.c
sql/server/rel_bin.c
sql/server/rel_select.c
sql/server/rel_updates.c
Branch: Aug2011
Log Message:
fixed problem when retrieving 'index' columns.
diffs (160 lines):
diff --git a/sql/backends/monet5/sql_optimizer.c
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -338,6 +338,8 @@ SQLgetStatistics(Client cntxt, mvc *m, M
size_t cnt;
sql_idx *i = mvc_bind_idx(m, s, cname);
+ if (!i) /* alter statements */
+ break;
cnt = store_funcs.count_idx(i);
assert(cnt <= (size_t) GDK_oid_max);
b = store_funcs.bind_idx(m->session->tr,i,0);
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -444,7 +444,7 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
if (e->flag == cmp_in || e->flag == cmp_notin) {
return handle_in_exps(sql, e->l, e->r, left, right,
grp, (e->flag == cmp_in), 0);
}
- if (e->flag == cmp_or && !right) {
+ if (e->flag == cmp_or && (!right || right->nrcols == 1)) {
list *l = e->l;
node *n;
stmt *sel1, *sel2;
@@ -3113,7 +3113,7 @@ rel2bin_update( mvc *sql, sql_rel *rel,
updcol = first_updated_col(updates, list_length(t->columns.set));
for (m = rel->exps->h; m; m = m->next) {
sql_exp *ce = m->data;
- sql_idx *i = find_sql_idx(t, ce->name);
+ sql_idx *i = find_sql_idx(t, ce->name+1);
if (i) {
stmt *is = bin_find_column(sql->sa, update, ce->l,
ce->r);
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
@@ -2099,9 +2099,14 @@ rel_compare(mvc *sql, sql_rel *rel, symb
rel_setsubquery(r);
rs = rel_lastexp(sql, r);
if (r->card > CARD_ATOM) {
- sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(rs));
-
- rs = exp_aggr1(sql->sa, rs, zero_or_one, 0, 0,
CARD_ATOM, 0);
+ /* if single value (independed of relations),
rewrite */
+ if (is_project(r->op) && !r->l && r->exps &&
list_length(r->exps) == 1) {
+ return rel_compare_exp(sql, rel, ls,
r->exps->h->data, compare_op, NULL, k.reduce);
+ } else {
+ sql_subaggr *zero_or_one =
sql_bind_aggr(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(rs));
+
+ rs = exp_aggr1(sql->sa, rs,
zero_or_one, 0, 0, CARD_ATOM, 0);
+ }
}
rel = rel_crossproduct(sql->sa, rel, r, op_semi);
}
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -164,6 +164,7 @@ rel_insert_hash_idx(mvc *sql, sql_idx *i
static sql_rel *
rel_insert_join_idx(mvc *sql, sql_idx *i, sql_rel *inserts)
{
+ char *iname = sa_strconcat( sql->sa, "%", i->base.name);
int need_nulls = 0;
node *m, *o;
sql_key *rk = &((sql_fkey *) i->key)->rkey->k;
@@ -218,7 +219,7 @@ rel_insert_join_idx(mvc *sql, sql_idx *i
_nlls = rel_project(sql->sa, _nlls, rel_projections(sql, _nlls,
NULL, 1, 1));
/* add constant value for NULLS */
e = exp_atom(sql->sa, atom_general(sql->sa,
sql_bind_localtype("oid"), NULL));
- exp_setname(sql->sa, e, i->t->base.name, i->base.name);
+ exp_setname(sql->sa, e, i->t->base.name, iname);
append(_nlls->exps, e);
} else {
nnlls = ins;
@@ -230,7 +231,7 @@ rel_insert_join_idx(mvc *sql, sql_idx *i
nnlls = rel_project(sql->sa, nnlls, pexps);
/* add row numbers */
e = exp_column(sql->sa, rel_name(rt), "%TID%",
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
- exp_setname(sql->sa, e, i->t->base.name, i->base.name);
+ exp_setname(sql->sa, e, i->t->base.name, iname);
append(nnlls->exps, e);
if (need_nulls) {
@@ -486,6 +487,7 @@ is_idx_updated(sql_idx * i, list *exps)
static sql_rel *
rel_update_hash_idx(mvc *sql, sql_idx *i, sql_rel *updates)
{
+ char *iname = sa_strconcat( sql->sa, "%", i->base.name);
node *m;
sql_subtype *it, *wrd = 0; /* is not set in first if below */
int bits = 1 + ((sizeof(wrd)*8)-1)/(list_length(i->columns)+1);
@@ -529,11 +531,11 @@ rel_update_hash_idx(mvc *sql, sql_idx *i
}
/* append hash to updates */
append(get_inserts(updates), h);
- exp_setname(sql->sa, h, i->t->base.name, i->base.name);
+ exp_setname(sql->sa, h, i->t->base.name, iname);
if (!updates->exps)
updates->exps = new_exp_list(sql->sa);
- append(updates->exps, exp_column(sql->sa, i->t->base.name,
i->base.name, wrd, CARD_MULTI, 0, 0));
+ append(updates->exps, exp_column(sql->sa, i->t->base.name, iname, wrd,
CARD_MULTI, 0, 0));
return updates;
}
@@ -568,6 +570,7 @@ rel_update_join_idx(mvc *sql, sql_idx *i
{
int nr = ++sql->label;
char name[16], *nme = number2name(name, 16, nr);
+ char *iname = sa_strconcat( sql->sa, "%", i->base.name);
int need_nulls = 0;
node *m, *o;
@@ -619,7 +622,7 @@ rel_update_join_idx(mvc *sql, sql_idx *i
_nlls = rel_project(sql->sa, _nlls, rel_projections(sql, _nlls,
NULL, 1, 1));
/* add constant value for NULLS */
e = exp_atom(sql->sa, atom_general(sql->sa,
sql_bind_localtype("oid"), NULL));
- exp_setname(sql->sa, e, i->t->base.name, i->base.name);
+ exp_setname(sql->sa, e, i->t->base.name, iname);
append(_nlls->exps, e);
} else {
nnlls = ups;
@@ -630,7 +633,7 @@ rel_update_join_idx(mvc *sql, sql_idx *i
nnlls = rel_project(sql->sa, nnlls, rel_projections(sql, nnlls->l,
NULL, 1, 1));
/* add row numbers */
e = exp_column(sql->sa, rel_name(rt), "%TID%",
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
- exp_setname(sql->sa, e, i->t->base.name, i->base.name);
+ exp_setname(sql->sa, e, i->t->base.name, iname);
append(nnlls->exps, e);
if (need_nulls) {
@@ -642,7 +645,7 @@ rel_update_join_idx(mvc *sql, sql_idx *i
}
if (!updates->exps)
updates->exps = new_exp_list(sql->sa);
- append(updates->exps, exp_column(sql->sa, i->t->base.name,
i->base.name, sql_bind_localtype("oid"), CARD_MULTI, 0, 0));
+ append(updates->exps, exp_column(sql->sa, i->t->base.name, iname,
sql_bind_localtype("oid"), CARD_MULTI, 0, 0));
return updates;
}
@@ -660,19 +663,6 @@ rel_update_idxs(mvc *sql, sql_table *t,
for (n = t->idxs.set->h; n; n = n->next) {
sql_idx *i = n->data;
- sql_subtype *tpe = sql_bind_localtype("wrd"); /* hash "wrd" */
- char *iname = sa_strconcat( sql->sa, "%", i->base.name);
- sql_exp *v;
-
- if (i->type == join_idx)
- tpe = sql_bind_localtype("oid");
- /* index names are prefixed, to make them independent */
- v = exp_column(sql->sa, t->base.name, iname, tpe, CARD_MULTI,
0, 1);
- rel_project_add_exp(sql, p, v);
- }
-
- for (n = t->idxs.set->h; n; n = n->next) {
- sql_idx *i = n->data;
/* check if update is needed,
* ie atleast on of the idx columns is updated
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list