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
