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