Changeset: 40fd199703b6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=40fd199703b6
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_statement.h
Branch: Aug2018
Log Message:
backport fix of 6712
diffs (74 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
@@ -487,7 +487,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
}
if (!l)
return NULL;
- s = stmt_convert(be, l, from, to);
+ s = stmt_convert(be, l, from, to, sel);
} break;
case e_func: {
node *en;
@@ -1080,7 +1080,7 @@ check_types(backend *be, sql_subtype *ct
(c == 3 && tpe != type_cast)) {
s = NULL;
} else {
- s = stmt_convert(be, s, st, ct);
+ s = stmt_convert(be, s, st, ct, NULL);
}
}
if (!s) {
@@ -2787,6 +2787,11 @@ rel2bin_select(backend *be, sql_rel *rel
if (s->nrcols == 0){
if (!predicate && sub)
predicate = stmt_const(be, bin_first_column(be,
sub), stmt_bool(be, 1));
+ if (e->type != e_cmp) {
+ sql_subtype *bt = sql_bind_localtype("bit");
+
+ s = stmt_convert(be, s, exp_subtype(e), bt,
NULL);
+ }
sel = stmt_uselect(be, predicate, s, cmp_equal, sel, 0);
} else if (e->type != e_cmp) {
sel = stmt_uselect(be, s, stmt_bool(be, 1), cmp_equal,
NULL, 0);
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
@@ -2669,7 +2669,7 @@ stmt_exception(backend *be, stmt *cond,
}
stmt *
-stmt_convert(backend *be, stmt *v, sql_subtype *f, sql_subtype *t)
+stmt_convert(backend *be, stmt *v, sql_subtype *f, sql_subtype *t, stmt *sel)
{
MalBlkPtr mb = be->mb;
InstrPtr q = NULL;
@@ -2722,6 +2722,8 @@ stmt_convert(backend *be, stmt *v, sql_s
/* scale of the current decimal */
q = pushInt(mb, q, f->scale);
q = pushArgument(mb, q, v->nr);
+ if (sel && v->nrcols && f->type->eclass != EC_DEC &&
!EC_TEMP_FRAC(t->type->eclass) && !EC_INTERVAL(t->type->eclass))
+ q = pushArgument(mb, q, sel->nr);
if (t->type->eclass == EC_DEC || EC_TEMP_FRAC(t->type->eclass) ||
EC_INTERVAL(t->type->eclass)) {
/* digits, scale of the result decimal */
@@ -2763,6 +2765,7 @@ stmt_convert(backend *be, stmt *v, sql_s
return NULL;
}
s->op1 = v;
+ s->op2 = sel;
s->nrcols = 0; /* function without arguments returns single
value */
s->key = v->key;
s->nrcols = v->nrcols;
diff --git a/sql/backends/monet5/sql_statement.h
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -211,7 +211,7 @@ extern stmt *stmt_sample(backend *be, st
extern stmt *stmt_order(backend *be, stmt *s, int direction);
extern stmt *stmt_reorder(backend *be, stmt *s, int direction, stmt
*orderby_ids, stmt *orderby_grp);
-extern stmt *stmt_convert(backend *sa, stmt *v, sql_subtype *from, sql_subtype
*to);
+extern stmt *stmt_convert(backend *sa, stmt *v, sql_subtype *from, sql_subtype
*to, stmt *sel);
extern stmt *stmt_unop(backend *be, stmt *op1, sql_subfunc *op);
extern stmt *stmt_binop(backend *be, stmt *op1, stmt *op2, sql_subfunc *op);
extern stmt *stmt_Nop(backend *be, stmt *ops, sql_subfunc *op);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list