Changeset: d5139fec50b6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d5139fec50b6
Added Files:
        sql/backends/monet5/Tests/cquery14.stable.err
        sql/backends/monet5/Tests/cquery14.stable.out
Modified Files:
        sql/backends/monet5/sql_cquery.c
Branch: trails
Log Message:

Perform a casting of the UDF's arguments before registering in the Petri-net


diffs (275 lines):

diff --git a/sql/backends/monet5/Tests/cquery14.stable.err 
b/sql/backends/monet5/Tests/cquery14.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/Tests/cquery14.stable.err
@@ -0,0 +1,34 @@
+stderr of test 'cquery14` in directory 'sql/backends/monet5` itself:
+
+
+# 16:24:43 >  
+# 16:24:43 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=34102" "--set" 
"mapi_usock=/var/tmp/mtest-23936/.s.monetdb.34102" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/MonetDB-trails/BUILD/var/MonetDB/mTests_sql_backends_monet5"
+# 16:24:43 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/MonetDB-trails/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = no
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 34102
+# cmdline opt  mapi_usock = /var/tmp/mtest-23936/.s.monetdb.34102
+# cmdline opt  monet_prompt = 
+# cmdline opt  gdk_dbpath = 
/home/ferreira/MonetDB-trails/BUILD/var/MonetDB/mTests_sql_backends_monet5
+# cmdline opt  gdk_debug = 536870922
+
+# 16:24:43 >  
+# 16:24:43 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-23936" "--port=34102"
+# 16:24:43 >  
+
+
+# 16:24:46 >  
+# 16:24:46 >  "Done."
+# 16:24:46 >  
+
diff --git a/sql/backends/monet5/Tests/cquery14.stable.out 
b/sql/backends/monet5/Tests/cquery14.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/Tests/cquery14.stable.out
@@ -0,0 +1,54 @@
+stdout of test 'cquery14` in directory 'sql/backends/monet5` itself:
+
+
+# 16:24:43 >  
+# 16:24:43 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=34102" "--set" 
"mapi_usock=/var/tmp/mtest-23936/.s.monetdb.34102" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/MonetDB-trails/BUILD/var/MonetDB/mTests_sql_backends_monet5"
+# 16:24:43 >  
+
+# MonetDB 5 server v11.28.0
+# This is an unreleased version
+# Serving database 'mTests_sql_backends_monet5', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.498 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2017 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on 
mapi:monetdb://dhcp-120.eduroam.cwi.nl:34102/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-23936/.s.monetdb.34102
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+# MonetDB/Timetrails module loaded
+
+Ready.
+
+# 16:24:43 >  
+# 16:24:43 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-23936" "--port=34102"
+# 16:24:43 >  
+
+#create stream table testing14 (a int) set window 1 stride 1;
+#create table results14 (a int);
+#create procedure cq_query14a()
+#begin
+#      insert into results14 (select * from testing14);
+#end;
+#create procedure cq_query14b()
+#begin
+#      insert into testing14 values (1), (2), (3);
+#      start continuous sys.cq_query14a() with cycles 2;
+#end;
+#start continuous sys.cq_query14b() with cycles 1;
+#select count(*) from results14; --should be 2
+% sys.L4 # table_name
+% L3 # name
+% bigint # type
+% 1 # length
+[ 2    ]
+#drop procedure sys.cq_query14b;
+#drop procedure sys.cq_query14a;
+#drop table testing14;
+#drop table results14;
+
+# 16:24:46 >  
+# 16:24:46 >  "Done."
+# 16:24:46 >  
+
diff --git a/sql/backends/monet5/sql_cquery.c b/sql/backends/monet5/sql_cquery.c
--- a/sql/backends/monet5/sql_cquery.c
+++ b/sql/backends/monet5/sql_cquery.c
@@ -459,6 +459,7 @@ CQregister(Client cntxt, str sname, str 
        sql_schema *s;
        sql_subfunc *f;
        list *l;
+       node *argn = NULL;
 
        prev = be->mb;
 
@@ -486,7 +487,7 @@ CQregister(Client cntxt, str sname, str 
                }
        }
 
-       rschema = (sname == NULL || strcmp(sname, str_nil) == 0) ? 
m->session->schema_name : sname;
+       rschema = (!sname || strcmp(sname, str_nil) == 0) ? 
m->session->schema_name : sname;
        if((s = mvc_bind_schema(m, rschema)) == NULL) { //bind the schema
                msg = createException(SQL,"cquery.register",SQLSTATE(3F000) 
"Failed to bind schema %s\n", rschema);
                goto finish;
@@ -531,38 +532,16 @@ CQregister(Client cntxt, str sname, str 
        }
        p->token = FUNCTIONsymbol;
        p->barrier = 0;
-       varid = newVariable(mb, cq_id, strlen(cq_id), TYPE_any);
+       if((varid = newVariable(mb, cq_id, strlen(cq_id), TYPE_void)) < 0) {
+               FREE_CQ_MB(finish)
+       }
        setDestVar(p, varid);
        pushInstruction(mb, p);
 
-       for (i = 0; i < argc; i++) { //add variables to the MAL block
-               atom *a = args[i];
-               int type = atom_type(a)->type->localtype;
-               varid = 0;
-
-               (void) snprintf(buffer, sizeof(buffer), "A%d", i);
-               a->varid = varid = newVariable(mb, buffer, strlen(buffer), 
type);
-               if (varid < 0) {
-                       FREE_CQ_MB(finish)
-               }
-               if ((p = pushArgument(mb, p, varid)) == NULL) {
-                       FREE_CQ_MB(finish)
-               }
-               setVarType(mb, varid, type);
-               setVarUDFtype(mb, 0);
+       if((q = newStmt(mb, sqlRef, transactionRef)) == NULL) {
+               FREE_CQ_MB(finish)
        }
-       for (i = 0; i < argc; i++) { //add assignments for arguments
-               p = newAssignment(mb);
-               if (p && args[i]->varid >= 0) {
-                       p = pushArgument(mb, p, args[i]->varid);
-               } else if(p) {
-                       (void) snprintf(buffer, sizeof(buffer), "A%d", i);
-                       p = pushArgumentId(mb, p, buffer);
-               }
-               if (p == NULL) {
-                       FREE_CQ_MB(finish)
-               }
-       }
+       setArgType(mb,q, 0, TYPE_void);
        if ((p = newStmt(mb, "user", fname)) == NULL) { //add the UDF call 
statement
                FREE_CQ_MB(finish)
        }
@@ -571,34 +550,45 @@ CQregister(Client cntxt, str sname, str 
                setVarType(mb, getArg(q, 0), res->type->localtype);
                setVarUDFtype(mb, getArg(q, 0));
        }*/
-       for (i = 0; i < argc; i++) { //add arguments assignments
-               if ((p = pushArgument(mb, p, i + 2)) == NULL) {
+       for (i = 0, argn = f->func->ops->h; i < argc && argn; i++, argn = 
argn->next) { //add variables to the MAL block
+               sql_subtype tpe = ((sql_arg *) argn->data)->type;
+               atom *a = args[i];
+               ValPtr val = (ValPtr) &a->data;
+               if(VALconvert(tpe.type->localtype, val) == NULL) {
+                       msg = 
createException(SQL,"cquery.register",SQLSTATE(3F000) "Error while making a 
conversion\n");
+                       GDKfree(ralias);
+                       freeMalBlk(mb);
+                       goto finish;
+               }
+               if((p = pushValue(mb, p, val)) == NULL) {
                        FREE_CQ_MB(finish)
                }
        }
-       for (i = 0; i < argc; i++) { //initialize arguments assignments
-               atom *arg = args[i];
-               ValPtr val = (ValPtr) &arg->data;
-               if (VALcopy(&mb->var[i + 2].value, val) == NULL) {
-                       FREE_CQ_MB(finish)
-               }
-               setVarConstant(mb, i + 2);
-               setVarFixed(mb, i + 2);
+       if((q = newStmt(mb, sqlRef, commitRef)) == NULL) {
+               FREE_CQ_MB(finish)
+       }
+       setArgType(mb,q, 0, TYPE_void);
+       if(pushEndInstruction(mb) == NULL) {
+               FREE_CQ_MB(finish)
+       }
+       chkProgram(cntxt->usermodule, mb);
+       if(mb->errors) {
+               msg = createException(SQL,"cquery.register",SQLSTATE(3F000) 
"%s", mb->errors);
+               GDKfree(ralias);
+               freeMalBlk(mb);
+               goto finish;
        }
 
        if(!alias || strcmp(alias, str_nil) == 0) { //set the alias
-               if((ralias = GDKstrdup(fname)) == NULL) {
-                       FREE_CQ_MB(finish)
-               }
+               ralias = GDKstrdup(fname);
        } else {
-        ralias = GDKstrdup(alias);
+               ralias = GDKstrdup(alias);
        }
        if(ralias == NULL) {
                FREE_CQ_MB(finish)
        }
        if ((sym = findSymbol(cntxt->usermodule, "user", fname)) == NULL){ // 
access the actual procedure body
-               msg = createException(SQL,"cquery.register",SQLSTATE(3F000) 
"Cannot find %s user.%s.\n", err_message, fname);
-               GDKfree(cq_id);
+               msg = createException(SQL,"cquery.register",SQLSTATE(3F000) 
"Cannot find %s user.%s\n", err_message, fname);
                GDKfree(ralias);
                freeMalBlk(mb);
                goto finish;
@@ -630,13 +620,11 @@ CQregister(Client cntxt, str sname, str 
        if(idx != pnettop && pnet[idx].status != CQDELETE) {
                msg = createException(SQL,"cquery.register",SQLSTATE(3F000) 
"The continuous %s %s is already registered.\n",
                                err_message, ralias);
-               GDKfree(cq_id);
                GDKfree(ralias);
                freeMalBlk(mb);
                goto unlock;
        }
        if((msg = CQanalysis(cntxt, sym->def, pnettop)) != MAL_SUCCEED) {
-               GDKfree(cq_id);
                GDKfree(ralias);
                freeMalBlk(mb);
                goto unlock;
@@ -646,7 +634,6 @@ CQregister(Client cntxt, str sname, str 
                        if(baskets[pnet[pnettop].baskets[i]].window != 
DEFAULT_TABLE_WINDOW) {
                                msg = createException(SQL, "cquery.register",
                                                                          
SQLSTATE(42000) "Heartbeat ignored, a window constraint exists\n");
-                               GDKfree(cq_id);
                                GDKfree(ralias);
                                freeMalBlk(mb);
                                goto unlock;
@@ -654,18 +641,6 @@ CQregister(Client cntxt, str sname, str 
                }
        }
 
-       if((q = newStmt(mb, sqlRef, transactionRef)) == NULL) {
-               FREE_CQ_MB(unlock)
-       }
-       setArgType(mb,q, 0, TYPE_void);
-       moveInstruction(mb, getPC(mb,q),1);
-       if((q = newStmt(mb, sqlRef, commitRef)) == NULL) {
-               FREE_CQ_MB(unlock)
-       }
-       setArgType(mb,q, 0, TYPE_void);
-       moveInstruction(mb, getPC(mb,q),mb->stop - 1);
-       chkProgram(cntxt->usermodule, mb);
-
        if((pnet[pnettop].mod = GDKstrdup(sname)) == NULL) {
                FREE_CQ_MB(unlock)
        }
@@ -673,7 +648,7 @@ CQregister(Client cntxt, str sname, str 
                GDKfree(pnet[pnettop].mod);
                FREE_CQ_MB(unlock)
        }
-       if((pnet[pnettop].stk = prepareMALstack(mb, mb->vsize)) == NULL) {
+       if((pnet[pnettop].stk = prepareMALstack(mb, mb->vsize)) == NULL) { 
//prepare MAL stack
                GDKfree(pnet[pnettop].mod);
                GDKfree(pnet[pnettop].fcn);
                FREE_CQ_MB(unlock)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to