Changeset: 73905a09f51b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=73905a09f51b Modified Files: clients/Tests/exports.stable.out monetdb5/optimizer/opt_prelude.c monetdb5/optimizer/opt_prelude.h sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h Branch: Apr2019 Log Message:
fixes for bug 6671 diffs (121 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -2189,6 +2189,7 @@ str expandRef; str exportOperationRef; str export_tableRef; str fcnDefinition(MalBlkPtr mb, InstrPtr p, str s, int flg, str base, size_t len); +str fetchRef; int findGDKtype(int type); Module findModule(Module scope, str name); str findRef; diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c --- a/monetdb5/optimizer/opt_prelude.c +++ b/monetdb5/optimizer/opt_prelude.c @@ -127,6 +127,7 @@ str execRef; str expandRef; str exportOperationRef; str export_tableRef; +str fetchRef; str findRef; str finishRef; str firstnRef; @@ -429,6 +430,7 @@ void optimizerInit(void) expandRef = putName("expand"); exportOperationRef = putName("exportOperation"); export_tableRef = putName("export_table"); + fetchRef = putName("fetch"); findRef = putName("find"); finishRef = putName("finish"); firstnRef = putName("firstn"); diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h --- a/monetdb5/optimizer/opt_prelude.h +++ b/monetdb5/optimizer/opt_prelude.h @@ -126,6 +126,7 @@ mal_export str execRef; mal_export str expandRef; mal_export str exportOperationRef; mal_export str export_tableRef; +mal_export str fetchRef; mal_export str findRef; mal_export str finishRef; mal_export str firstnRef; 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 @@ -1589,6 +1589,7 @@ rel2bin_table(backend *be, sql_rel *rel, } else if (rel->l) { /* handle sub query via function */ int i; char name[16], *nme; + sql_rel *fr; nme = number2name(name, 16, ++sql->remote); @@ -1597,6 +1598,7 @@ rel2bin_table(backend *be, sql_rel *rel, return NULL; sub = stmt_list(be, l); sub = stmt_func(be, sub, sa_strdup(sql->sa, nme), rel->l, 0); + fr = rel->l; l = sa_list(sql->sa); for(i = 0, n = rel->exps->h; n; n = n->next, i++ ) { sql_exp *c = n->data; @@ -1605,6 +1607,8 @@ rel2bin_table(backend *be, sql_rel *rel, const char *rnme = NULL; s = stmt_alias(be, s, rnme, nme); + if (fr->card <= CARD_ATOM) /* single value, get result from bat */ + s = stmt_fetch(be, s); list_append(l, s); } sub = stmt_list(be, l); 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 @@ -3755,3 +3755,38 @@ const_column(backend *be, stmt *val) } return NULL; } + +stmt * +stmt_fetch(backend *be, stmt *val) +{ + sql_subtype *ct = tail_type(val); + MalBlkPtr mb = be->mb; + InstrPtr q = NULL; + int tt = ct->type->localtype; + + if (val->nr < 0) + return NULL; + q = newStmt(mb, algebraRef, fetchRef); + if (q == NULL) + return NULL; + setVarType(mb, getArg(q, 0), tt); + q = pushArgument(mb, q, val->nr); + q = pushOid(mb, q, 0); + if (q) { + stmt *s = stmt_create(be->mvc->sa, st_single); + if(!s) { + freeInstruction(q); + return NULL; + } + s->op1 = val; + s->op4.typeval = *ct; + s->nrcols = 0; + + s->tname = val->tname; + s->cname = val->cname; + s->nr = getDestVar(q); + s->q = q; + return s; + } + return NULL; +} 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 @@ -240,5 +240,6 @@ extern const char *table_name(sql_alloca extern const char *schema_name(sql_allocator *sa, stmt *st); extern stmt *const_column(backend *ba, stmt *val); +extern stmt *stmt_fetch(backend *ba, stmt *val); #endif /* _SQL_STATEMENT_H_ */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list