Changeset: e83e2243ac16 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e83e2243ac16
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_exp.c
sql/server/rel_optimizer.c
sql/server/rel_schema.c
sql/server/rel_select.c
sql/server/sql_atom.c
sql/server/sql_atom.h
sql/server/sql_parser.y
Branch: default
Log Message:
Reduce atom_copy when possible. Make sure atom changing functions return a new
atom when changes are made
diffs (truncated from 414 to 300 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
@@ -1209,8 +1209,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
break;
case e_atom: {
if (e->l) { /* literals */
- atom *a = e->l;
- s = stmt_atom(be, atom_copy(sql->sa, a));
+ s = stmt_atom(be, e->l);
} else if (e->r) { /* parameters and declared
variables */
sql_var_name *vname = (sql_var_name*) e->r;
assert(vname->name);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -562,7 +562,7 @@ exp_value(mvc *sql, sql_exp *e)
{
if (!e || e->type != e_atom)
return NULL;
- if (e->l) { /* literal */
+ if (e->l) { /* literal */
return e->l;
} else if (e->r) { /* param (ie not set) */
sql_var_name *vname = (sql_var_name*) e->r;
@@ -2812,7 +2812,7 @@ exp_copy(mvc *sql, sql_exp * e)
} else if (e->flag & PSM_REL) {
return exp_ref(sql, e);
} else if (e->flag & PSM_EXCEPTION) {
- ne = exp_exception(sql->sa, exp_copy(sql, e->l),
sa_strdup(sql->sa, (const char *) e->r));
+ ne = exp_exception(sql->sa, exp_copy(sql, e->l), (const
char *) e->r);
}
break;
}
@@ -2830,16 +2830,12 @@ atom *
exp_flatten(mvc *sql, sql_exp *e)
{
if (e->type == e_atom) {
- atom *v = exp_value(sql, e);
+ return exp_value(sql, e);
+ } else if (e->type == e_convert) {
+ atom *v = exp_flatten(sql, e->l);
if (v)
- return atom_copy(sql->sa, v);
- } else if (e->type == e_convert) {
- atom *v = exp_flatten(sql, e->l);
-
- if (v && (v = atom_cast(sql->sa, v, exp_subtype(e))))
- return v;
- return NULL;
+ return atom_cast(sql->sa, v, exp_subtype(e));
} else if (e->type == e_func) {
sql_subfunc *f = e->f;
list *l = e->l;
@@ -2850,12 +2846,12 @@ exp_flatten(mvc *sql, sql_exp *e)
atom *l1 = exp_flatten(sql, l->h->data);
atom *l2 = exp_flatten(sql, l->h->next->data);
if (l1 && l2)
- return atom_add(l1,l2);
+ return atom_add(sql->sa, l1, l2);
} else if (!f->func->s && strcmp(f->func->base.name, "sql_sub")
== 0 && list_length(l) == 2 && res && EC_NUMBER(res->type.type->eclass)) {
atom *l1 = exp_flatten(sql, l->h->data);
atom *l2 = exp_flatten(sql, l->h->next->data);
if (l1 && l2)
- return atom_sub(l1,l2);
+ return atom_sub(sql->sa, l1, l2);
}
}
return NULL;
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
@@ -1987,7 +1987,7 @@ rel_push_topn_and_sample_down(visitor *v
list_append(rel->exps,
exp_copy(v->sql, offset2));
changed = true;
} else if (offset1 && offset2) { /* sum
offsets */
- atom *b1 = (atom *)offset1->l,
*b2 = (atom *)offset2->l, *c = atom_add(b1, b2);
+ atom *b1 = (atom *)offset1->l,
*b2 = (atom *)offset2->l, *c = atom_add(v->sql->sa, b1, b2);
if (!c) /* error, don't apply
optimization, WARNING because of this the offset optimization must come before
the limit one */
return rel;
@@ -3061,7 +3061,7 @@ exp_simplify_math( mvc *sql, sql_exp *e,
atom *ra = exp_flatten(sql, re);
if (la && ra && subtype_cmp(atom_type(la),
atom_type(ra)) == 0 && subtype_cmp(atom_type(la), exp_subtype(e)) == 0) {
- atom *a = atom_mul(la, ra);
+ atom *a = atom_mul(sql->sa, la, ra);
if (a && (a = atom_cast(sql->sa, a,
exp_subtype(e)))) {
sql_exp *ne = exp_atom(sql->sa,
a);
@@ -3105,7 +3105,10 @@ 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) {
- if (atom_inc(exp_value(sql,
lre))) {
+ atom *a = exp_value(sql, lre);
+ if (a && (a = atom_inc(sql->sa,
a))) {
+ lre->l = a;
+ lre->r = NULL;
if
(subtype_cmp(exp_subtype(e), exp_subtype(le)) != 0)
le =
exp_convert(sql->sa, le, exp_subtype(le), exp_subtype(e));
(*changes)++;
@@ -3166,7 +3169,7 @@ exp_simplify_math( mvc *sql, sql_exp *e,
atom *ra = exp_flatten(sql, re);
if (la && ra) {
- atom *a = atom_add(la, ra);
+ atom *a = atom_add(sql->sa, la, ra);
if (a) {
sql_exp *ne = exp_atom(sql->sa,
a);
@@ -3233,7 +3236,7 @@ exp_simplify_math( mvc *sql, sql_exp *e,
atom *ra = exp_flatten(sql, re);
if (la && ra) {
- atom *a = atom_sub(la, ra);
+ atom *a = atom_sub(sql->sa, la, ra);
if (a) {
sql_exp *ne = exp_atom(sql->sa,
a);
@@ -8233,6 +8236,8 @@ reduce_scale(mvc *sql, atom *a)
reduce_scale_tpe(int, a->data.val.ival);
} else if (a->data.vtype == TYPE_sht) {
reduce_scale_tpe(sht, a->data.val.shval);
+ } else if (a->data.vtype == TYPE_bte) {
+ reduce_scale_tpe(bte, a->data.val.btval);
}
if (i) {
na = atom_int(sql->sa, &a->tpe, nval);
@@ -8262,18 +8267,22 @@ rel_project_reduce_casts(visitor *v, sql
list *args = e->l;
sql_exp *h = args->h->data;
sql_exp *t = args->t->data;
-
- if ((is_atom(h->type) && h->l) ||
(is_atom(t->type) && t->l)) {
- atom *a = (is_atom(h->type) &&
h->l) ? h->l : t->l;
+ atom *ha = exp_value(v->sql, h), *ta =
exp_value(v->sql, t);
+
+ if (ha || ta) {
+ atom *a = ha ? ha : ta;
atom *na = reduce_scale(v->sql,
a);
if (na != a) {
int rs = a->tpe.scale -
na->tpe.scale;
res->scale -= rs;
- if (is_atom(h->type) &&
h->l)
+ if (ha) {
+ h->r = NULL;
h->l = na;
- else
+ } else {
+ t->r = NULL;
t->l = na;
+ }
v->changes++;
}
}
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -546,7 +546,7 @@ column_options(sql_query *query, dlist *
if (e && is_atom(e->type)) {
atom *a =
exp_value(sql, e);
- if (atom_null(a)) {
+ if (a && atom_null(a)) {
switch
(mvc_default(sql, cs, NULL)) {
case -1:
(void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
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
@@ -2422,7 +2422,7 @@ rel_logical_value_exp(sql_query *query,
case SQL_ATOM: {
AtomNode *an = (AtomNode *) sc;
assert(an && an->a);
- return exp_atom(sql->sa, atom_copy(sql->sa, an->a));
+ return exp_atom(sql->sa, an->a);
}
case SQL_IDENT:
case SQL_COLUMN:
@@ -2679,7 +2679,7 @@ rel_logical_exp(sql_query *query, sql_re
/* TRUE or FALSE */
sql_rel *or = rel;
AtomNode *an = (AtomNode *) sc;
- sql_exp *e = exp_atom(sql->sa, atom_copy(sql->sa, an->a));
+ sql_exp *e = exp_atom(sql->sa, an->a);
if (e) {
sql_subtype bt;
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
@@ -1377,20 +1377,24 @@ atom_cast(sql_allocator *sa, atom *a, sq
return NULL;
}
-int
-atom_neg(atom *a)
+atom *
+atom_neg(sql_allocator *sa, atom *a)
{
ValRecord dst;
+
if (a->isnull)
- return 0;
- VALempty(&dst);
+ return a;
dst.vtype = a->data.vtype;
if (VARcalcnegate(&dst, &a->data) != GDK_SUCCEED) {
GDKclrerr();
- return -1;
+ return NULL;
}
- a->data = dst;
- return 0;
+ atom *res = atom_create(sa);
+ if (!res)
+ return NULL;
+ res->tpe = a->tpe;
+ res->data = dst;
+ return res;
}
int
@@ -1406,7 +1410,36 @@ atom_cmp(atom *a1, atom *a2)
}
atom *
-atom_add(atom *a1, atom *a2)
+atom_add(sql_allocator *sa, 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;
+ if (a1->tpe.type->localtype < a2->tpe.type->localtype ||
+ (a1->tpe.type->localtype == a2->tpe.type->localtype &&
+ a1->tpe.digits < a2->tpe.digits)) {
+ atom *t = a1;
+ a1 = a2;
+ a2 = t;
+ }
+ if (a1->isnull || a2->isnull)
+ return atom_general(sa, &a1->tpe, NULL);
+ dst.vtype = a1->tpe.type->localtype;
+ if (VARcalcadd(&dst, &a1->data, &a2->data, 1) != GDK_SUCCEED) {
+ GDKclrerr();
+ return NULL;
+ }
+ atom *res = atom_create(sa);
+ if (!res)
+ return NULL;
+ res->tpe = a1->tpe;
+ res->data = dst;
+ return res;
+}
+
+atom *
+atom_sub(sql_allocator *sa, atom *a1, atom *a2)
{
ValRecord dst;
@@ -1419,46 +1452,23 @@ atom_add(atom *a1, atom *a2)
a1 = a2;
a2 = t;
}
+ if (a1->isnull || a2->isnull)
+ return atom_general(sa, &a1->tpe, NULL);
dst.vtype = a1->tpe.type->localtype;
- if (VARcalcadd(&dst, &a1->data, &a2->data, 1) != GDK_SUCCEED) {
- GDKclrerr();
- return NULL;
- }
- a1->data = dst;
- if (a1->isnull || a2->isnull)
- a1->isnull = 1;
- 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;
- if (a1->tpe.type->localtype < a2->tpe.type->localtype ||
- (a1->tpe.type->localtype == a2->tpe.type->localtype &&
- a1->tpe.digits < a2->tpe.digits))
- dst.vtype = a2->tpe.type->localtype;
- else
- dst.vtype = a1->tpe.type->localtype;
if (VARcalcsub(&dst, &a1->data, &a2->data, 1) != GDK_SUCCEED) {
GDKclrerr();
return NULL;
}
- if (a1->tpe.type->localtype < a2->tpe.type->localtype ||
- (a1->tpe.type->localtype == a2->tpe.type->localtype &&
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list