Changeset: 9895731a5164 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9895731a5164
Modified Files:
sql/backends/monet5/Tests/pyapi32.sql
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_gencode.c
sql/server/rel_select.c
Branch: pythonloader
Log Message:
Fix segfaults with varres arguments (but still not working).
diffs (172 lines):
diff --git a/sql/backends/monet5/Tests/pyapi32.sql
b/sql/backends/monet5/Tests/pyapi32.sql
--- a/sql/backends/monet5/Tests/pyapi32.sql
+++ b/sql/backends/monet5/Tests/pyapi32.sql
@@ -3,11 +3,12 @@
START TRANSACTION;
+
CREATE FUNCTION varres_test() RETURNS TABLE(*) LANGUAGE PYTHON {
return {'i': 5, 'j': 10};
};
-explain SELECT * FROM varres_test();
+debug SELECT * FROM varres_test();
SELECT * FROM varres_test();
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
@@ -1407,14 +1407,18 @@ rel2bin_table( mvc *sql, sql_rel *rel, l
}
l = sa_list(sql->sa);
if (f->func->varres) {
- for(i=0, en = rel->exps->h, n = f->res->h; en; en =
en->next, n = n->next, i++ ) {
- sql_exp *exp = en->data;
- sql_subtype *st = n->data;
- const char *rnme = exp->rname?exp->rname:exp->l;
- stmt *s = stmt_rs_column(sql->sa, psub, i, st);
-
- s = stmt_alias(sql->sa, s, rnme, exp->name);
- list_append(l, s);
+ if (f->func->res) {
+ for(i = 0, en = rel->exps->h, n = f->res->h;
en; en = en->next, n = n->next, i++ ) {
+ sql_exp *exp = en->data;
+ sql_subtype *st = n->data;
+ const char *rnme =
exp->rname?exp->rname:exp->l;
+ stmt *s = stmt_rs_column(sql->sa, psub,
i, st);
+
+ s = stmt_alias(sql->sa, s, rnme,
exp->name);
+ list_append(l, s);
+ }
+ } else {
+ list_append(l, psub);
}
} else {
for(i = 0, n = f->func->res->h; n; n = n->next, i++ ) {
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
@@ -2485,49 +2485,63 @@ static int
list *l = lst->op4.lval;
int cnt = list_length(l);
stmt *first;
-
- n = l->h;
- first = n->data;
-
- /* single value result, has a fast exit */
- if (cnt == 1 && first->nrcols <= 0 ){
- stmt *c = n->data;
- sql_subtype *t = tail_type(c);
- const char *tname =
table_name(sql->mvc->sa, c);
- const char *sname =
schema_name(sql->mvc->sa, c);
- const char *_empty = "";
- const char *tn = (tname) ? tname :
_empty;
- const char *sn = (sname) ? sname :
_empty;
- const char *cn =
column_name(sql->mvc->sa, c);
- const char *ntn = sql_escape_ident(tn);
- const char *nsn = sql_escape_ident(sn);
- size_t fqtnl = strlen(ntn) + 1 +
strlen(nsn) + 1;
- char *fqtn = NEW_ARRAY(char, fqtnl);
-
- snprintf(fqtn, fqtnl, "%s.%s", nsn,
ntn);
-
+ if (cnt > 0) {
+ n = l->h;
+ first = n->data;
+
+ /* single value result, has a fast exit
*/
+ if (cnt == 1 && first->nrcols <= 0 ){
+ stmt *c = n->data;
+ sql_subtype *t = tail_type(c);
+ const char *tname =
table_name(sql->mvc->sa, c);
+ const char *sname =
schema_name(sql->mvc->sa, c);
+ const char *_empty = "";
+ const char *tn = (tname) ?
tname : _empty;
+ const char *sn = (sname) ?
sname : _empty;
+ const char *cn =
column_name(sql->mvc->sa, c);
+ const char *ntn =
sql_escape_ident(tn);
+ const char *nsn =
sql_escape_ident(sn);
+ size_t fqtnl = strlen(ntn) + 1
+ strlen(nsn) + 1;
+ char *fqtn = NEW_ARRAY(char,
fqtnl);
+
+ snprintf(fqtn, fqtnl, "%s.%s",
nsn, ntn);
+
+ q = newStmt(mb, sqlRef,
resultSetRef);
+ if (q) {
+ s->nr = getDestVar(q);
+ q = pushStr(mb, q,
fqtn);
+ q = pushStr(mb, q, cn);
+ q = pushStr(mb, q,
t->type->localtype == TYPE_void ? "char" : t->type->sqlname);
+ q = pushInt(mb, q,
t->digits);
+ q = pushInt(mb, q,
t->scale);
+ q = pushInt(mb, q,
t->type->eclass);
+ q = pushArgument(mb, q,
c->nr);
+ }
+
+ c_delete(ntn);
+ c_delete(nsn);
+ _DELETE(fqtn);
+ if (q == NULL)
+ return -1;
+ break;
+ }
+ if ( (s->nr =dump_header(sql->mvc, mb,
s, l)) < 0)
+ return -1;
+ } else {
q = newStmt(mb, sqlRef, resultSetRef);
if (q) {
+ const char *_empty = "";
+
s->nr = getDestVar(q);
- q = pushStr(mb, q, fqtn);
- q = pushStr(mb, q, cn);
- q = pushStr(mb, q,
t->type->localtype == TYPE_void ? "char" : t->type->sqlname);
- q = pushInt(mb, q, t->digits);
- q = pushInt(mb, q, t->scale);
- q = pushInt(mb, q,
t->type->eclass);
- q = pushArgument(mb, q, c->nr);
+ q = pushStr(mb, q, _empty);
+ q = pushStr(mb, q, _empty);
+ q = pushStr(mb, q, "char");
+ q = pushInt(mb, q, 0);
+ q = pushInt(mb, q, 0);
+ q = pushInt(mb, q, 0);
+ q = pushArgument(mb, q, 1);
}
-
- c_delete(ntn);
- c_delete(nsn);
- _DELETE(fqtn);
- if (q == NULL)
- return -1;
- break;
}
- if ( (s->nr =dump_header(sql->mvc, mb, s, l)) <
0)
- return -1;
-
} else {
q = newStmt(mb, sqlRef, raiseRef);
q = pushStr(mb, q, "not a valid output list\n");
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
@@ -587,10 +587,12 @@ rel_named_table_function(mvc *sql, sql_r
/* for each column add table.column name */
exps = new_exp_list(sql->sa);
- for (m = sf->func->res->h; m; m = m->next) {
- sql_arg *a = m->data;
-
- append(exps, exp_column(sql->sa, tname, a->name, &a->type,
CARD_MULTI, 1, 0));
+ if (!sf->func->varres) {
+ for (m = sf->func->res->h; m; m = m->next) {
+ sql_arg *a = m->data;
+
+ append(exps, exp_column(sql->sa, tname, a->name,
&a->type, CARD_MULTI, 1, 0));
+ }
}
return rel_table_func(sql->sa, rel, e, exps, (sq != NULL));
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list