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

Reply via email to