Changeset: d01d05a28dc2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d01d05a28dc2
Modified Files:
sql/backends/monet5/sql_gencode.c
sql/backends/monet5/sql_statement.c
Branch: graph0
Log Message:
Fix SEGV in MAL codegen
At least now we know why in existing code the instr ptr is
reassigned in every API call of the codegen.
diffs (124 lines):
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -2824,25 +2824,25 @@ static int
// let's start with the first join
jr1 = newTmpVariable(mb, TYPE_any);
join = newStmt(mb, algebraRef, "subsemijoin");
- pushReturn(mb, join, jr1);
- pushArgument(mb, join, ref_left);
- pushArgument(mb, join, ref_domain);
- pushNil(mb, join, TYPE_bat);
- pushNil(mb, join, TYPE_bat);
- pushBit(mb, join, FALSE);
- pushLng(mb, q, getDestVar(cnt1));
+ join = pushReturn(mb, join, jr1);
+ join = pushArgument(mb, join, ref_left);
+ join = pushArgument(mb, join, ref_domain);
+ join = pushNil(mb, join, TYPE_bat);
+ join = pushNil(mb, join, TYPE_bat);
+ join = pushBit(mb, join, FALSE);
+ join = pushArgument(mb, join, getDestVar(cnt1));
// jl1 = getDestVar(join);
// second join
jr2 = newTmpVariable(mb, TYPE_any);
join = newStmt(mb, algebraRef, "subsemijoin");
- pushReturn(mb, join, jr2);
- pushArgument(mb, join, ref_right);
- pushArgument(mb, join, ref_domain);
- pushArgument(mb, join, jr1);
- pushNil(mb, join, TYPE_bat);
- pushBit(mb, join, FALSE);
- pushLng(mb, q, getDestVar(cnt1));
+ join = pushReturn(mb, join, jr2);
+ join = pushArgument(mb, join, ref_right);
+ join = pushArgument(mb, join, ref_domain);
+ join = pushArgument(mb, join, jr1);
+ join = pushNil(mb, join, TYPE_bat);
+ join = pushBit(mb, join, FALSE);
+ join = pushArgument(mb, join, getDestVar(cnt1));
jl2 = getDestVar(join);
// qtemp = newTmpVariable(mb, TYPE_bat); // qfrom
@@ -2856,8 +2856,8 @@ static int
// if |jr1| > |jr2|
cmp = newStmt(mb, "calc", "==");
- pushArgument(mb, cmp, getDestVar(cnt1));
- pushArgument(mb, cmp, getDestVar(cnt2));
+ cmp = pushArgument(mb, cmp, getDestVar(cnt1));
+ cmp = pushArgument(mb, cmp, getDestVar(cnt2));
stmt_if = newAssignment(mb);
stmt_if->barrier = BARRIERsymbol;
stmt_if = pushArgument(mb, stmt_if, getDestVar(cmp));
@@ -2865,13 +2865,13 @@ static int
// third join
jr3 = newTmpVariable(mb, TYPE_any);
join = newStmt(mb, algebraRef, "subsemijoin");
- pushReturn(mb, join, jr3);
- pushArgument(mb, join, ref_left);
- pushArgument(mb, join, ref_domain);
- pushArgument(mb, join, jl2); // candidate list for
ref_left
- pushNil(mb, join, TYPE_bat);
- pushBit(mb, join, FALSE);
- pushArgument(mb, join, getDestVar(cnt2));
+ join = pushReturn(mb, join, jr3);
+ join = pushArgument(mb, join, ref_left);
+ join = pushArgument(mb, join, ref_domain);
+ join = pushArgument(mb, join, jl2); // candidate list
for ref_left
+ join = pushNil(mb, join, TYPE_bat);
+ join = pushBit(mb, join, FALSE);
+ join = pushArgument(mb, join, getDestVar(cnt2));
// jl3 = getDestVar(join);
qfrom_oid = newAssignment(mb);
@@ -2884,7 +2884,7 @@ static int
// else |jr1| == |jr2|
cmp_not = newStmt(mb, calcRef, notRef);
- pushArgument(mb, cmp_not, getDestVar(cmp));
+ cmp_not = pushArgument(mb, cmp_not, getDestVar(cmp));
stmt_else = newAssignment(mb);
stmt_else->barrier = BARRIERsymbol;
stmt_else = pushArgument(mb, stmt_else,
getDestVar(cmp_not));
@@ -2952,13 +2952,13 @@ static int
// spfw(V:bat[:oid], E:bat[:oid], W:bat[:lng],
qf:bat[:oid], qt:bat[:oid])
q = newStmt(mb, graphRef, "spfw");
- pushReturn(mb, q, newTmpVariable(mb, TYPE_bat));
- pushReturn(mb, q, newTmpVariable(mb, TYPE_bat));
- pushArgument(mb, q, qfrom);
- pushArgument(mb, q, qto);
- pushNil(mb, q, TYPE_bat);
- pushArgument(mb, q, left);
- pushArgument(mb, q, right);
+ q = pushReturn(mb, q, newTmpVariable(mb, TYPE_bat));
+ q = pushReturn(mb, q, newTmpVariable(mb, TYPE_bat));
+ q = pushArgument(mb, q, qfrom);
+ q = pushArgument(mb, q, qto);
+ q = pushNil(mb, q, TYPE_bat);
+ q = pushArgument(mb, q, left);
+ q = pushArgument(mb, q, right);
// abi convention for st_result
s->nr = getDestVar(q); // qfrom
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
@@ -1714,6 +1714,7 @@ static void
stack_push_children(sql_stack *stk, stmt *s)
{
switch (s->type) {
+ case st_concat:
case st_list:
stack_push_list(stk, s->op4.lval);
break;
@@ -1786,6 +1787,7 @@ print_stmt(sql_allocator *sa, stmt *s)
case st_atom:
printf("z%d := '%s':%s\n", s->nr, atom2string(sa, s->op4.aval),
s->op4.aval->tpe.type->base.name);
break;
+ case st_concat:
case st_list:{
node *n;
printf("z%d := %s(", s->nr, st_type2string(s->type));
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list