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