Changeset: cbf95fbae11b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cbf95fbae11b
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_select.c
Branch: Oct2020
Log Message:

When making a explicit cast to lower digit string type, don't covert after 
truncating, because the output string will meet the output type number of digits


diffs (53 lines):

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
@@ -2783,7 +2783,7 @@ convert_atom(atom *a, sql_subtype *rt)
        a->tpe = *rt;
 }
 
-static sql_exp *
+sql_exp *
 exp_convert_inplace(mvc *sql, sql_subtype *t, sql_exp *exp)
 {
        atom *a;
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -193,6 +193,7 @@ extern void exps_reset_freevar(list *exp
 
 extern sql_exp *exp_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp 
*exp, check_type tpe);
 extern int rel_set_type_param(mvc *sql, sql_subtype *type, sql_rel *rel, 
sql_exp *rel_exp, int upcast);
+extern sql_exp *exp_convert_inplace(mvc *sql, sql_subtype *t, sql_exp *exp);
 extern sql_exp *exp_numeric_supertype(mvc *sql, sql_exp *e);
 extern sql_exp *exp_values_set_supertype(mvc *sql, sql_exp *values, 
sql_subtype *opt_super);
 
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
@@ -3846,11 +3846,21 @@ rel_cast(sql_query *query, sql_rel **rel
        if (EC_VARCHAR(tpe->type->eclass) && tpe->digits > 0) {
                sql_subtype *et = exp_subtype(e);
                /* truncate only if the number of digits are smaller or from 
clob */
-               if (et && (tpe->digits < et->digits || et->digits == 0)) {
-                       sql_subtype *it = sql_bind_localtype("int");
-                       sql_subfunc *c = sql_bind_func(sql->sa, 
sql->session->schema, "truncate", et, it, F_FUNC);
-                       if (c)
-                               e = exp_binop(sql->sa, e, exp_atom_int(sql->sa, 
tpe->digits), c);
+               if (et && EC_VARCHAR(et->type->eclass) && (tpe->digits < 
et->digits || et->digits == 0)) {
+                       sql_subfunc *f;
+                       sql_exp *ne = exp_convert_inplace(sql, tpe, e); /* 
first try cheap internal (in-place) conversion */
+
+                       if (ne) {
+                               exp_label(sql->sa, ne, ++sql->label);
+                               return ne;
+                       }
+                       f = sql_bind_func(sql->sa, sql->session->schema, 
"truncate", et, sql_bind_localtype("int"), F_FUNC);
+                       assert(f);
+                       ne = exp_binop(sql->sa, e, exp_atom_int(sql->sa, 
tpe->digits), f);
+                       /* set output type as the one to be casted */
+                       f->res->h->data = sql_create_subtype(sql->sa, 
tpe->type, tpe->digits, tpe->scale);
+                       exp_label(sql->sa, ne, ++sql->label);
+                       return ne;
                }
        }
        if (e)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to