Changeset: c56cca352541 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c56cca352541 Added Files: sql/test/BugTracker-2017/Tests/one-plus-nil.Bug-6243.sql sql/test/BugTracker-2017/Tests/one-plus-nil.Bug-6243.stable.err sql/test/BugTracker-2017/Tests/one-plus-nil.Bug-6243.stable.out sql/test/BugTracker-2017/Tests/with-alias-bug.6246.sql sql/test/BugTracker-2017/Tests/with-alias-bug.6246.stable.err sql/test/BugTracker-2017/Tests/with-alias-bug.6246.stable.out Modified Files: sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_upgrades.c sql/server/rel_dump.c sql/server/rel_optimizer.c sql/server/rel_select.c sql/server/sql_atom.c sql/server/sql_atom.h sql/test/BugTracker-2012/Tests/with_in_derived_table.Bug-3043.stable.out sql/test/BugTracker-2017/Tests/All sql/test/remote/Tests/ssbm.stable.out.int128 Branch: default Log Message:
Merge with Dec2016 branch. diffs (truncated from 871 to 300 lines): diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -175,7 +175,10 @@ static int const char *nme = (op->op3)?op->op3->op4.aval->data.val.sval:op->cname; char buf[64]; - snprintf(buf,64,"A%s",nme); + if (nme[0] != 'A') + snprintf(buf,64,"A%s",nme); + else + snprintf(buf,64,"%s",nme); varid = newVariable(curBlk, buf, strlen(buf), type); curInstr = pushArgument(curBlk, curInstr, varid); setVarType(curBlk, varid, type); diff --git a/sql/backends/monet5/sql_upgrades.c b/sql/backends/monet5/sql_upgrades.c --- a/sql/backends/monet5/sql_upgrades.c +++ b/sql/backends/monet5/sql_upgrades.c @@ -1479,7 +1479,7 @@ SQLupgrades(Client c, mvc *m) } } - if ((sql_update_dec2016_sp2(c, m)) != NULL) { + if ((err = sql_update_dec2016_sp2(c, m)) != NULL) { fprintf(stderr, "!%s\n", err); GDKfree(err); } diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -592,6 +592,18 @@ skipIdent( char *r, int *pos) (*pos)++; } +static void +skipIdentOrSymbol( char *r, int *pos) +{ + while(r[*pos] && (isalnum(r[*pos]) || + r[*pos] == '_' || r[*pos] == '%' || + r[*pos] == '<' || r[*pos] == '>' || + r[*pos] == '/' || r[*pos] == '*' || + r[*pos] == '-' || r[*pos] == '+' || + r[*pos] == '~' || r[*pos] == '^' )) + (*pos)++; +} + static int readInt( char *r, int *pos) { @@ -724,7 +736,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re (*pos)++; tname = b; cname = r + *pos; - skipIdent(r, pos); + skipIdentOrSymbol(r, pos); e = r+*pos; skipWS(r, pos); old = *e; 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 @@ -85,12 +85,14 @@ name_find_column( sql_rel *rel, char *rn } if (t->idxs.set) for (cn = t->idxs.set->h; cn; cn = cn->next) { - sql_idx *c = cn->data; - if (strcmp(c->base.name, name+1 /* skip % */) == 0) { + sql_idx *i = cn->data; + if (strcmp(i->base.name, name+1 /* skip % */) == 0) { *bt = rel; - if (pnr < 0 || (c->t->p && - list_position(c->t->p->tables.set, c->t) == pnr)) - return c; + if (pnr < 0 || (i->t->p && + list_position(i->t->p->tables.set, i->t) == pnr)) { + sql_kc *c = i->columns->h->data; + return c->c; + } } } break; @@ -2720,7 +2722,7 @@ exp_simplify_math( mvc *sql, sql_exp *e, atom *ra = exp_flatten(sql, re); if (la && ra) { - atom *a = atom_mul(sql->sa, la, ra); + atom *a = atom_mul(la, ra); if (a) { sql_exp *ne = exp_atom(sql->sa, a); @@ -2766,10 +2768,11 @@ exp_simplify_math( mvc *sql, sql_exp *e, sql_exp *lle = l->h->data; sql_exp *lre = l->h->next->data; if (exp_equal(re, lle)==0) { - atom_inc(exp_value(sql, lre, sql->args, sql->argc)); - (*changes)++; - exp_setname(sql->sa, le, exp_relname(e), exp_name(e)); - return le; + if (atom_inc(exp_value(sql, lre, sql->args, sql->argc))) { + (*changes)++; + exp_setname(sql->sa, le, exp_relname(e), exp_name(e)); + return le; + } } } if (!f->func->s && !strcmp(f->func->base.name, "sql_mul") && list_length(l) == 2) { @@ -8355,7 +8358,7 @@ rel_apply_rewrite(int *changes, mvc *sql return l; } } - if (rel->flag == APPLY_LOJ && r->op == op_select) { + if (rel->flag == APPLY_LOJ && (r->op == op_select || is_join(r->op))) { sql_rel *nr, *ns; nr = rel_project(sql->sa, rel_dup(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 @@ -306,7 +306,15 @@ query_exp_optname(mvc *sql, sql_rel *r, { switch (q->token) { case SQL_WITH: - return rel_with_query(sql, q); + { + sql_rel *tq = rel_with_query(sql, q); + + if (!tq) + return NULL; + if (q->data.lval->t->type == type_symbol) + return rel_table_optname(sql, tq, q->data.lval->t->data.sym); + return tq; + } case SQL_UNION: case SQL_EXCEPT: case SQL_INTERSECT: diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c --- a/sql/server/sql_atom.c +++ b/sql/server/sql_atom.c @@ -1148,37 +1148,16 @@ atom_cast(sql_allocator *sa, atom *a, sq int atom_neg( atom *a ) { - switch( a->tpe.type->localtype) { - case TYPE_bte: - a->data.val.btval = -a->data.val.btval; - break; - case TYPE_sht: - a->data.val.shval = -a->data.val.shval; - break; - case TYPE_int: - a->data.val.ival = -a->data.val.ival; - break; - case TYPE_lng: - a->data.val.lval = -a->data.val.lval; - break; -#ifdef HAVE_HGE - case TYPE_hge: - a->data.val.hval = -a->data.val.hval; - break; -#endif - case TYPE_flt: - a->data.val.fval = -a->data.val.fval; - break; - case TYPE_dbl: - a->data.val.dval = -a->data.val.dval; - if (a->data.val.dval == dbl_nil) - return -1; - break; - default: + ValRecord dst; + dst.vtype = a->data.vtype; + if (VARcalcnegate(&dst, &a->data) != GDK_SUCCEED) return -1; - } - if (a->d != dbl_nil && a->tpe.type->localtype != TYPE_dbl) - a->d = -a->d; + a->data = dst; + dst.vtype = TYPE_dbl; + dst.val.dval = a->d; + if (VARcalcnegate(&dst, &dst) != GDK_SUCCEED) + return -1; + a->d = dst.val.dval; return 0; } @@ -1197,183 +1176,80 @@ atom_cmp(atom *a1, atom *a2) atom * atom_add(atom *a1, atom *a2) { + ValRecord dst; if ((!EC_COMPUTE(a1->tpe.type->eclass) && (a1->tpe.type->eclass != EC_DEC || a1->tpe.digits != a2->tpe.digits || a1->tpe.scale != a2->tpe.scale)) || a1->tpe.digits < a2->tpe.digits || a1->tpe.type->localtype != a2->tpe.type->localtype) { return NULL; } - switch(a1->tpe.type->localtype) { - case TYPE_bte: - a1->data.val.btval += a2->data.val.btval; - a1->d = (dbl) a1->data.val.btval; - break; - case TYPE_sht: - a1->data.val.shval += a2->data.val.shval; - a1->d = (dbl) a1->data.val.shval; - break; - case TYPE_int: - a1->data.val.ival += a2->data.val.ival; - a1->d = (dbl) a1->data.val.ival; - break; - case TYPE_lng: - a1->data.val.lval += a2->data.val.lval; - a1->d = (dbl) a1->data.val.lval; - break; -#ifdef HAVE_HGE - case TYPE_hge: - a1->data.val.hval += a2->data.val.hval; - a1->d = (dbl) a1->data.val.hval; - break; -#endif - case TYPE_flt: - a1->data.val.fval += a2->data.val.fval; - a1->d = (dbl) a1->data.val.fval; - break; - case TYPE_dbl: - a1->data.val.dval += a2->data.val.dval; - a1->d = (dbl) a1->data.val.dval; - default: - break; - } + dst.vtype = a1->tpe.type->localtype; + if (VARcalcadd(&dst, &a1->data, &a2->data, 1) != GDK_SUCCEED) + return NULL; + a1->data = dst; + dst.vtype = TYPE_dbl; + if (VARconvert(&dst, &a1->data, 1) == GDK_SUCCEED) + a1->d = dst.val.dval; return a1; } atom * atom_sub(atom *a1, atom *a2) { + ValRecord dst; if ((!EC_COMPUTE(a1->tpe.type->eclass) && (a1->tpe.type->eclass != EC_DEC || a1->tpe.digits != a2->tpe.digits || a1->tpe.scale != a2->tpe.scale)) || a1->tpe.digits < a2->tpe.digits || a1->tpe.type->localtype != a2->tpe.type->localtype) { return NULL; } - switch(a1->tpe.type->localtype) { - case TYPE_bte: - a1->data.val.btval -= a2->data.val.btval; - a1->d = (dbl) a1->data.val.btval; - break; - case TYPE_sht: - a1->data.val.shval -= a2->data.val.shval; - a1->d = (dbl) a1->data.val.shval; - break; - case TYPE_int: - a1->data.val.ival -= a2->data.val.ival; - a1->d = (dbl) a1->data.val.ival; - break; - case TYPE_lng: - a1->data.val.lval -= a2->data.val.lval; - a1->d = (dbl) a1->data.val.lval; - break; -#ifdef HAVE_HGE - case TYPE_hge: - a1->data.val.hval -= a2->data.val.hval; - a1->d = (dbl) a1->data.val.hval; - break; -#endif - case TYPE_flt: - a1->data.val.fval -= a2->data.val.fval; - a1->d = (dbl) a1->data.val.fval; - break; - case TYPE_dbl: - a1->data.val.dval -= a2->data.val.dval; - a1->d = (dbl) a1->data.val.dval; - default: - break; - } + dst.vtype = a1->tpe.type->localtype; + if (VARcalcsub(&dst, &a1->data, &a2->data, 1) != GDK_SUCCEED) + return NULL; + a1->data = dst; + dst.vtype = TYPE_dbl; + if (VARconvert(&dst, &a1->data, 1) == GDK_SUCCEED) + a1->d = dst.val.dval; return a1; } atom * -atom_mul(sql_allocator *sa, atom *a1, atom *a2) +atom_mul(atom *a1, atom *a2) { + ValRecord dst; if (!EC_COMPUTE(a1->tpe.type->eclass)) return NULL; - if (a1->tpe.type->localtype != a2->tpe.type->localtype) { - if (a1->tpe.type->localtype == TYPE_dbl) { - a1->data.val.dval *= a2->d; - a1->d = (dbl) a1->data.val.dval; - return a1; - } - if (a2->tpe.type->localtype == TYPE_dbl) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list