Changeset: 03c0143ed1e8 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=03c0143ed1e8 Added Files: ChangeLog.Jun2016 sql/backends/monet5/Tests/pyapi31.sql Modified Files: monetdb5/mal/mal_module.c monetdb5/mal/mal_parser.c monetdb5/modules/mal/pcre.c sql/backends/monet5/sql.c sql/backends/monet5/sql_optimizer.c sql/backends/monet5/sql_upgrades.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimizer.c sql/server/rel_planner.c sql/server/rel_schema.c sql/server/sql_atom.c sql/server/sql_atom.h sql/server/sql_mvc.c sql/server/sql_mvc.h sql/test/mergetables/Tests/part-elim.sql Branch: jit Log Message:
merge with default diffs (truncated from 756 to 300 lines): diff --git a/ChangeLog.Jun2016 b/ChangeLog.Jun2016 new file mode 100644 --- /dev/null +++ b/ChangeLog.Jun2016 @@ -0,0 +1,6 @@ +# ChangeLog file for candidate +# This file is updated with Maddlog + +* Fri Jul 1 2016 Sjoerd Mullender <sjo...@acm.org> +- Lots of memory leaks have been plugged across the whole system. + diff --git a/monetdb5/mal/mal_module.c b/monetdb5/mal/mal_module.c --- a/monetdb5/mal/mal_module.c +++ b/monetdb5/mal/mal_module.c @@ -24,8 +24,7 @@ Module mal_scope; /* the root of the Module scopeJump[256][256]; /* to speedup access to correct scope */ static void newSubScope(Module scope){ - int len = (MAXSCOPE)*sizeof(Module); - scope->subscope = (Symbol *) GDKzalloc(len); + scope->subscope = (Symbol *) GDKzalloc(MAXSCOPE * sizeof(Symbol)); } void diff --git a/monetdb5/mal/mal_parser.c b/monetdb5/mal/mal_parser.c --- a/monetdb5/mal/mal_parser.c +++ b/monetdb5/mal/mal_parser.c @@ -1149,6 +1149,11 @@ fcnHeader(Client cntxt, int kind) curInstr = getInstrPtr(curBlk, 0); if (currChar(cntxt) != '('){ + if (cntxt->backup) { + freeSymbol(cntxt->curprg); + cntxt->curprg = cntxt->backup; + cntxt->backup = 0; + } parseError(cntxt, "function header '(' expected\n"); skipToEnd(cntxt); return curBlk; @@ -1160,6 +1165,7 @@ fcnHeader(Client cntxt, int kind) if (isModuleDefined(cntxt->nspace, getModuleId(curInstr)) == FALSE) { if (cntxt->backup) { + freeSymbol(cntxt->curprg); cntxt->curprg = cntxt->backup; cntxt->backup = 0; } @@ -1181,6 +1187,7 @@ fcnHeader(Client cntxt, int kind) if (ch == ')') break; if (cntxt->backup) { + freeSymbol(cntxt->curprg); cntxt->curprg = cntxt->backup; cntxt->backup = 0; } @@ -1262,6 +1269,7 @@ fcnHeader(Client cntxt, int kind) if (currChar(cntxt) != ')') { freeInstruction(curInstr); if (cntxt->backup) { + freeSymbol(cntxt->curprg); cntxt->curprg = cntxt->backup; cntxt->backup = 0; } diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c --- a/monetdb5/modules/mal/pcre.c +++ b/monetdb5/modules/mal/pcre.c @@ -33,6 +33,10 @@ #include <pcre.h> +#if PCRE_MAJOR < 8 || (PCRE_MAJOR == 8 && PCRE_MINOR < 13) +#define pcre_free_study my_pcre_free +#endif + pcre_export str PCREquote(str *r, const str *v); pcre_export str PCREmatch(bit *ret, const str *val, const str *pat); pcre_export str PCREimatch(bit *ret, const str *val, const str *pat); diff --git a/sql/backends/monet5/Tests/pyapi31.sql b/sql/backends/monet5/Tests/pyapi31.sql new file mode 100644 --- /dev/null +++ b/sql/backends/monet5/Tests/pyapi31.sql @@ -0,0 +1,31 @@ + +START TRANSACTION; + +# generate data +CREATE FUNCTION pyapi31_gendata() RETURNS TABLE(i INTEGER) LANGUAGE PYTHON { return numpy.arange(100) }; +CREATE TABLE input AS SELECT * FROM pyapi31_gendata() WITH DATA; + +# parallel table-producing function +CREATE FUNCTION pyapi31_parallel(i INTEGER) +RETURNS TABLE(a INTEGER, b INTEGER, c INTEGER) LANGUAGE PYTHON_MAP +{ + return {'a': i, 'b': i * 2, 'c': i * 3}; +}; +# this function should be executed in parallel over the inputs +explain SELECT * FROM pyapi31_parallel((SELECT i FROM input)); +SELECT * FROM pyapi31_parallel((SELECT i FROM input)); + + +# while we're at it, parallel function with more than 3 inputs: +CREATE FUNCTION pyapi31_many_inputs(a INTEGER, b INTEGER, c INTEGER, d INTEGER, e INTEGER) RETURNS INTEGER LANGUAGE PYTHON_MAP { return a * b * c * d * e }; + +explain SELECT pyapi31_many_inputs(i, i, i, i, i) FROM input; +SELECT pyapi31_many_inputs(i, i, i, i, i) FROM input; + +# but a function with 3 inputs does work +CREATE FUNCTION pyapi31_three_inputs(a INTEGER, b INTEGER, c INTEGER) RETURNS INTEGER LANGUAGE PYTHON_MAP { return a * b * c }; + +explain SELECT pyapi31_three_inputs(i, i, i) FROM input; +SELECT pyapi31_three_inputs(i, i, i) FROM input; + +ROLLBACK; diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -1570,6 +1570,7 @@ getVariable(Client cntxt, MalBlkPtr mb, mvc *m = NULL; str msg; str varname = *getArgReference_str(stk, pci, 2); + atom *a; ValRecord *dst, *src; if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) @@ -1578,12 +1579,13 @@ getVariable(Client cntxt, MalBlkPtr mb, return msg; if (mtype < 0 || mtype >= 255) throw(SQL, "sql.getVariable", "failed"); - src = stack_get_var(m, varname); - if (!src) { + a = stack_get_var(m, varname); + if (!a) { char buf[BUFSIZ]; snprintf(buf, BUFSIZ, "variable '%s' unknown", varname); throw(SQL, "sql.getVariable", "%s", buf); } + src = &a->data; dst = &stk->stk[getArg(pci, 0)]; VALcopy(dst, src); return MAL_SUCCEED; diff --git a/sql/backends/monet5/sql_optimizer.c b/sql/backends/monet5/sql_optimizer.c --- a/sql/backends/monet5/sql_optimizer.c +++ b/sql/backends/monet5/sql_optimizer.c @@ -127,11 +127,11 @@ SQLgetSpace(mvc *m, MalBlkPtr mb, int pr str getSQLoptimizer(mvc *m) { - ValRecord *val = stack_get_var(m, "optimizer"); + char *opt = stack_get_string(m, "optimizer"); char *pipe = "default_pipe"; - if (val && val->val.sval) - pipe = val->val.sval; + if (opt) + pipe = opt; return pipe; } diff --git a/sql/backends/monet5/sql_upgrades.c b/sql/backends/monet5/sql_upgrades.c --- a/sql/backends/monet5/sql_upgrades.c +++ b/sql/backends/monet5/sql_upgrades.c @@ -219,14 +219,10 @@ sql_update_oct2014(Client c, mvc *sql) { size_t bufsize = 8192*2, pos = 0; char *buf = GDKmalloc(bufsize), *err = NULL; - ValRecord *schvar = stack_get_var(sql, "current_schema"); - char *schema = NULL; + char *schema = stack_get_string(sql, "current_schema"); sql_table *t; sql_schema *s; - if (schvar) - schema = strdup(schvar->val.sval); - pos += snprintf(buf + pos, bufsize - pos, "set schema \"sys\";\n"); /* cleanup columns of dropped views */ @@ -488,10 +484,8 @@ sql_update_oct2014(Client c, mvc *sql) "insert into sys.systemfunctions (select f.id from sys.functions f, sys.schemas s where f.name in ('bbp', 'db_users', 'env', 'generate_series', 'storage', 'storagemodel', 'var') and f.type = %d and f.schema_id = s.id and s.name = 'sys');\n", F_UNION); - if (schema) { + if (schema) pos += snprintf(buf + pos, bufsize - pos, "set schema \"%s\";\n", schema); - free(schema); - } assert(pos < bufsize); @@ -508,11 +502,7 @@ sql_update_oct2014_sp1(Client c, mvc *sq { size_t bufsize = 8192*2, pos = 0; char *buf = GDKmalloc(bufsize), *err = NULL; - ValRecord *schvar = stack_get_var(sql, "current_schema"); - char *schema = NULL; - - if (schvar) - schema = strdup(schvar->val.sval); + char *schema = stack_get_string(sql, "current_schema"); pos += snprintf(buf + pos, bufsize - pos, "set schema \"sys\";\n" @@ -539,10 +529,8 @@ sql_update_oct2014_sp1(Client c, mvc *sq "drop table upgradeOct2014_changes;\n" "drop table upgradeOct2014;\n"); - if (schema) { + if (schema) pos += snprintf(buf + pos, bufsize - pos, "set schema \"%s\";\n", schema); - free(schema); - } assert(pos < bufsize); printf("Running database upgrade commands:\n%s\n", buf); @@ -556,11 +544,7 @@ sql_update_oct2014_sp2(Client c, mvc *sq { size_t bufsize = 8192, pos = 0; char *buf = GDKmalloc(bufsize), *err = NULL; - ValRecord *schvar = stack_get_var(sql, "current_schema"); - char *schema = NULL; - - if (schvar) - schema = strdup(schvar->val.sval); + char *schema = stack_get_string(sql, "current_schema"); pos += snprintf(buf + pos, bufsize - pos, "set schema \"sys\";\n" @@ -575,10 +559,8 @@ sql_update_oct2014_sp2(Client c, mvc *sq "from sys.storagemodel() group by \"schema\",\"table\";\n" "update _tables set system = true where name = 'tablestoragemodel' and schema_id = (select id from schemas where name = 'sys');\n"); - if (schema) { + if (schema) pos += snprintf(buf + pos, bufsize - pos, "set schema \"%s\";\n", schema); - free(schema); - } assert(pos < bufsize); { @@ -603,11 +585,7 @@ sql_update_oct2014_sp3(Client c, mvc *sq { size_t bufsize = 8192, pos = 0; char *buf = GDKmalloc(bufsize), *err = NULL; - ValRecord *schvar = stack_get_var(sql, "current_schema"); - char *schema = NULL; - - if (schvar) - schema = strdup(schvar->val.sval); + char *schema = stack_get_string(sql, "current_schema"); pos += snprintf(buf + pos, bufsize - pos, "set schema \"sys\";\n" @@ -617,10 +595,8 @@ sql_update_oct2014_sp3(Client c, mvc *sq "CREATE FUNCTION \"right_shift_assign\"(i1 inet, i2 inet) RETURNS boolean EXTERNAL NAME inet.\">>=\";\n" "insert into sys.systemfunctions (select id from sys.functions where name in ('left_shift', 'right_shift', 'left_shift_assign', 'right_shift_assign') and schema_id = (select id from sys.schemas where name = 'sys') and id not in (select function_id from sys.systemfunctions));\n"); - if (schema) { + if (schema) pos += snprintf(buf + pos, bufsize - pos, "set schema \"%s\";\n", schema); - free(schema); - } assert(pos < bufsize); printf("Running database upgrade commands:\n%s\n", buf); @@ -635,11 +611,7 @@ sql_update_hugeint(Client c, mvc *sql) { size_t bufsize = 8192, pos = 0; char *buf = GDKmalloc(bufsize), *err = NULL; - ValRecord *schvar = stack_get_var(sql, "current_schema"); - char *schema = NULL; - - if (schvar) - schema = strdup(schvar->val.sval); + char *schema = stack_get_string(sql, "current_schema"); pos += snprintf(buf + pos, bufsize - pos, "set schema \"sys\";\n"); @@ -720,10 +692,8 @@ sql_update_hugeint(Client c, mvc *sql) } } - if (schema) { + if (schema) pos += snprintf(buf + pos, bufsize - pos, "set schema \"%s\";\n", schema); - free(schema); - } assert(pos < bufsize); printf("Running database upgrade commands:\n%s\n", buf); @@ -738,11 +708,8 @@ sql_update_jul2015(Client c, mvc *sql) { size_t bufsize = 15360, pos = 0; char *buf = GDKmalloc(bufsize), *err = NULL; - ValRecord *schvar = stack_get_var(sql, "current_schema"); - char *schema = NULL; + char *schema = stack_get_string(sql, "current_schema"); - if (schvar) - schema = strdup(schvar->val.sval); pos += snprintf(buf + pos, bufsize - pos, "set schema \"sys\";\n"); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list