Changeset: ab69f7bb3083 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ab69f7bb3083
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/rel_predicates.c
        sql/backends/monet5/sql_statement.c
        sql/include/sql_catalog.h
        sql/server/rel_dump.c
        sql/server/rel_exp.c
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/sql_atom.c
        sql/server/sql_atom.h
        sql/server/sql_parser.y
        sql/storage/sql_catalog.c
        sql/storage/store.c
        sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
        
sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out.Windows
        sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.test
        sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.test
        sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
        sql/test/BugTracker-2015/Tests/crash_in_reduce_groupby.Bug-3818.test
        sql/test/BugTracker-2015/Tests/large_join.Bug-3809.test
        
sql/test/BugTracker-2015/Tests/quantile_function_resolution.Bug-3773.test
        
sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.test
        sql/test/BugTracker-2017/Tests/caching_stats_bug.6374.test
        
sql/test/BugTracker-2017/Tests/sqlitelogictest-aggregation-having-avg.Bug-6428.test
        
sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.test
        sql/test/BugTracker-2021/Tests/plan-not-optimal-view.Bug-7140.test
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.test
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-1join-query.test
        
sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-plan-2join-query.test
        sql/test/SQLancer/Tests/sqlancer17.test
        sql/test/Tests/keys.test
        sql/test/analytics/Tests/analytics00.test
        sql/test/astro/Tests/astro.test
        sql/test/bugs/Tests/rtrim_bug.test
        sql/test/merge-partitions/Tests/mergepart31.test
        sql/test/mergetables/Tests/mergequery.test
        sql/test/mergetables/Tests/part-elim.test
        sql/test/miscellaneous/Tests/groupby_error.test
        sql/test/miscellaneous/Tests/groupby_expressions.test
        sql/test/miscellaneous/Tests/simple_plans.test
        sql/test/miscellaneous/Tests/simple_selects.test
        sql/test/out2in/Tests/out2in.test
        sql/test/sys-schema/Tests/webExamplesComparisonFunctionsOperators.test
        sql/test/sys-schema/Tests/webExamplesLogicalFunctionsOperators.test
        sql/test/sys-schema/Tests/webExamplesMathematicalFunctionsOperators.test
Branch: default
Log Message:

Cleaning atom propagation on the SQL layer. Always reuse atom pointer unless a 
write is needed on it. For ease with remote plans, dump number of digits for 
every type


diffs (truncated from 5201 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
@@ -1210,7 +1210,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
        case e_atom: {
                if (e->l) {                     /* literals */
                        atom *a = e->l;
-                       s = stmt_atom(be, atom_dup(sql->sa, a));
+                       s = stmt_atom(be, atom_copy(sql->sa, a));
                } else if (e->r) {              /* parameters and declared 
variables */
                        sql_var_name *vname = (sql_var_name*) e->r;
                        assert(vname->name);
diff --git a/sql/backends/monet5/rel_predicates.c 
b/sql/backends/monet5/rel_predicates.c
--- a/sql/backends/monet5/rel_predicates.c
+++ b/sql/backends/monet5/rel_predicates.c
@@ -59,7 +59,7 @@ rel_find_predicates(visitor *v, sql_rel 
                                } else if (isNew(c)) {
                                        continue;
                                } else {
-                                       atom *e1 = r && r->l ? atom_dup(NULL, 
r->l) : NULL, *e2 = r2 && r2->l ? atom_dup(NULL, r2->l) : NULL;
+                                       atom *e1 = r && r->l ? atom_copy(NULL, 
r->l) : NULL, *e2 = r2 && r2->l ? atom_copy(NULL, r2->l) : NULL;
 
                                        if ((r && r->l && !e1) || (r2 && r2->l 
&& !e2)) {
                                                if (e1) {
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3016,7 +3016,7 @@ stmt_exception(backend *be, stmt *cond, 
 /* The type setting is not propagated to statements such as st_bat and 
st_append,
        because they are not considered projections */
 static void
-tail_set_type(stmt *st, sql_subtype *t)
+tail_set_type(mvc *m, stmt *st, sql_subtype *t)
 {
        for (;;) {
                switch (st->type) {
@@ -3048,7 +3048,7 @@ tail_set_type(stmt *st, sql_subtype *t)
                        return;
                }
                case st_atom:
-                       atom_set_type(st->op4.aval, t);
+                       st->op4.aval = atom_set_type(m->sa, st->op4.aval, t);
                        return;
                case st_convert:
                case st_temp:
@@ -3089,7 +3089,7 @@ stmt_convert(backend *be, stmt *v, stmt 
                /* trivial string cases */
                (EC_VARCHAR(f->type->eclass) && EC_VARCHAR(t->type->eclass) && 
(t->digits == 0 || (f->digits > 0 && t->digits >= f->digits))))) {
                /* set output type. Despite the MAL code already being 
generated, the output type may still be checked */
-               tail_set_type(v, t);
+               tail_set_type(be->mvc, v, t);
                return v;
        }
 
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -861,7 +861,7 @@ typedef struct atom {
 
 /* duplicate atom */
 extern ValPtr SA_VALcopy(sql_allocator *sa, ValPtr d, const ValRecord *s);
-extern atom *atom_dup(sql_allocator *sa, atom *a);
+extern atom *atom_copy(sql_allocator *sa, atom *a);
 
 typedef struct pl {
        sql_column *c;
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
@@ -95,6 +95,20 @@ dump_escape_ident(sql_allocator *sa, con
        return res;
 }
 
+static char *
+dump_sql_subtype(sql_allocator *sa, sql_subtype *t)
+{
+       char buf[BUFSIZ];
+
+       if (t->digits && t->scale)
+               snprintf(buf, BUFSIZ, "%s(%u,%u)", t->type->base.name, 
t->digits, t->scale);
+       else if (t->digits)
+               snprintf(buf, BUFSIZ, "%s(%u)", t->type->base.name, t->digits);
+       else
+               snprintf(buf, BUFSIZ, "%s", t->type->base.name);
+       return sa_strdup(sa, buf);
+}
+
 static void exps_print(mvc *sql, stream *fout, list *exps, int depth, list 
*refs, int alias, int brackets);
 
 static void
@@ -118,7 +132,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
                } else if (e->flag & PSM_VAR) {
                        // todo output table def (from e->f)
                        const char *rname = exp_relname(e);
-                       char *type_str = e->f ? NULL : 
sql_subtype_string(sql->ta, exp_subtype(e));
+                       char *type_str = e->f ? NULL : 
dump_sql_subtype(sql->ta, exp_subtype(e));
                        int level = GET_PSM_LEVEL(e->flag);
                        mnstr_printf(fout, "declare ");
                        if (rname)
@@ -154,7 +168,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
                break;
        }
        case e_convert: {
-               char *to_type = sql_subtype_string(sql->ta, exp_subtype(e));
+               char *to_type = dump_sql_subtype(sql->ta, exp_subtype(e));
                mnstr_printf(fout, "%s[", to_type);
                exp_print(sql, fout, e->l, depth, refs, 0, 0);
                mnstr_printf(fout, "]");
@@ -170,7 +184,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
                                        isReplicaTable(t)?"replica 
table":"table",
                                        dump_escape_ident(sql->ta, 
t->base.name));
                        } else {
-                               char *t = sql_subtype_string(sql->ta, 
atom_type(a));
+                               char *t = dump_sql_subtype(sql->ta, 
atom_type(a));
                                if (a->isnull)
                                        mnstr_printf(fout, "%s \"NULL\"", t);
                                else {
@@ -937,49 +951,13 @@ read_exp_properties(mvc *sql, sql_exp *e
 static sql_exp*
 parse_atom(mvc *sql, char *r, int *pos, sql_subtype *tpe)
 {
-       sql_exp *exp = NULL;
        char *st = readString(r,pos);
 
        if (st && strcmp(st, "NULL") == 0) {
-               exp = exp_atom(sql->sa, atom_general(sql->sa, tpe, NULL));
+               return exp_atom(sql->sa, atom_general(sql->sa, tpe, NULL));
        } else {
-               atom *a = atom_general(sql->sa, tpe, st);
-               if (tpe->type->eclass == EC_NUM) { /* needs to set the number 
of digits */
-#ifdef HAVE_HGE
-                       hge value = 0;
-                       const hge one = 1;
-#else
-                       lng value = 0;
-                       const lng one = 1;
-#endif
-                       int bits = (int) digits2bits((unsigned) strlen(st)), 
obits = bits;
-
-#ifdef HAVE_HGE
-                       if (a->data.vtype == TYPE_hge) {
-                               value = a->data.val.hval;
-                       } else
-#endif
-                       if (a->data.vtype == TYPE_lng) {
-                               value = a->data.val.lval;
-                       } else if (a->data.vtype == TYPE_int) {
-                               value = a->data.val.ival;
-                       } else if (a->data.vtype == TYPE_sht) {
-                               value = a->data.val.shval;
-                       } else {
-                               value = a->data.val.btval;
-                       }
-
-                       while (bits > 0 && (bits == sizeof(value) * 8 || (one 
<< (bits - 1)) > value))
-                               bits--;
-                       if (bits != obits && (bits == 8 || bits == 16 || bits 
== 32 || bits == 64))
-                               bits++;
-                       a->tpe.digits = bits;
-               } else if (tpe->type->eclass == EC_FLT || tpe->type->eclass == 
EC_DEC) {
-                       assert(a->tpe.digits > 0);
-               }
-               exp = exp_atom(sql->sa, a);
+               return exp_atom(sql->sa, atom_general(sql->sa, tpe, st));
        }
-       return exp;
 }
 
 static sql_exp*
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
@@ -2786,7 +2786,7 @@ exp_copy(mvc *sql, sql_exp * e)
        }
        case e_atom:
                if (e->l)
-                       ne = exp_atom(sql->sa, atom_dup(sql->sa, e->l));
+                       ne = exp_atom(sql->sa, e->l);
                else if (e->r) {
                        sql_var_name *vname = (sql_var_name*) e->r;
                        ne = exp_param_or_declared(sql->sa, vname->sname, 
vname->name, &e->tpe, e->flag);
@@ -2830,14 +2830,14 @@ atom *
 exp_flatten(mvc *sql, sql_exp *e)
 {
        if (e->type == e_atom) {
-               atom *v =  exp_value(sql, e);
+               atom *v = exp_value(sql, e);
 
                if (v)
-                       return atom_dup(sql->sa, v);
+                       return atom_copy(sql->sa, v);
        } else if (e->type == e_convert) {
                atom *v = exp_flatten(sql, e->l);
 
-               if (v && atom_cast(sql->sa, v, exp_subtype(e)))
+               if (v && (v = atom_cast(sql->sa, v, exp_subtype(e))))
                        return v;
                return NULL;
        } else if (e->type == e_func) {
@@ -3048,26 +3048,10 @@ rel_set_type_param(mvc *sql, sql_subtype
  * This is only done to be able to map more cached queries onto the same
  * interface.
  */
-
-static void
-convert_atom(atom *a, sql_subtype *rt)
-{
-       if (atom_null(a)) {
-               if (a->data.vtype != rt->type->localtype) {
-                       const void *p;
-
-                       a->data.vtype = rt->type->localtype;
-                       p = ATOMnilptr(a->data.vtype);
-                       VALset(&a->data, a->data.vtype, (ptr) p);
-               }
-       }
-       a->tpe = *rt;
-}
-
 sql_exp *
 exp_convert_inplace(mvc *sql, sql_subtype *t, sql_exp *exp)
 {
-       atom *a;
+       atom *a, *na;
 
        /* exclude named variables and variable lists */
        if (exp->type != e_atom || exp->r /* named */ || exp->f /* list */ || 
!exp->l /* not direct atom */)
@@ -3077,8 +3061,8 @@ exp_convert_inplace(mvc *sql, sql_subtyp
        if (!a->isnull && t->scale && t->type->eclass != EC_FLT)
                return NULL;
 
-       if (a && atom_cast(sql->sa, a, t)) {
-               convert_atom(a, t);
+       if ((na = atom_cast(sql->sa, a, t))) {
+               exp->l = na;
                exp->tpe = *t;
                return exp;
        }
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
@@ -3063,7 +3063,7 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                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);
 
-                                       if (a && atom_cast(sql->sa, a, 
exp_subtype(e))) {
+                                       if (a && (a = atom_cast(sql->sa, a, 
exp_subtype(e)))) {
                                                sql_exp *ne = exp_atom(sql->sa, 
a);
                                                if (subtype_cmp(exp_subtype(e), 
exp_subtype(ne)) != 0)
                                                        ne = 
exp_convert(sql->sa, ne, exp_subtype(ne), exp_subtype(e));
@@ -7712,7 +7712,7 @@ rel_simplify_predicates(visitor *v, sql_
                                                        /* change atom's value 
on right */
                                                        l = args->h->data;
                                                        if (!a->isnull)
-                                                               
a->data.val.bval = !a->data.val.bval;
+                                                               r = 
exp_atom_bool(v->sql->sa, !a->data.val.bval);
                                                        e = 
exp_compare(v->sql->sa, l, r, e->flag);
                                                        if (anti) set_anti(e);
                                                        if (is_semantics) 
set_semantics(e);
@@ -8199,54 +8199,47 @@ exp_merge_range(visitor *v, sql_rel *rel
  * types).
  */
 
-static int
-reduce_scale(atom *a)
+#define reduce_scale_tpe(tpe, uval) \
+       do { \
+               tpe v = uval; \
+               if (v != 0) { \
+                       while( (v/10)*10 == v ) { \
+                               i++; \
+                               v /= 10; \
+                       } \
+                       nval = v; \
+               } \
+       } while (0)
+
+static atom *
+reduce_scale(mvc *sql, atom *a)
 {
        int i = 0;
+       atom *na = a;
+#ifdef HAVE_HGE
+       hge nval = 0;
+#else
+       lng nval = 0;
+#endif
 
 #ifdef HAVE_HGE
        if (a->data.vtype == TYPE_hge) {
-               hge v = a->data.val.hval;
-
-               if (v != 0)
-                       while( (v/10)*10 == v ) {
-                               i++;
-                               v /= 10;
-                       }
-               a->data.val.hval = v;
+               reduce_scale_tpe(hge, a->data.val.hval);
        } else
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to