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

Reply via email to