Changeset: dda2dd676884 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dda2dd676884
Modified Files:
clients/Tests/exports.stable.out
monetdb5/mal/mal_client.c
monetdb5/mal/mal_parser.c
monetdb5/mal/mal_session.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_scenario.c
sql/storage/store.c
Branch: default
Log Message:
merged with Dec2016
diffs (263 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1177,7 +1177,7 @@ str INETnetmask(inet *retval, const inet
str INETnetwork(inet *retval, const inet *val);
str INETnew(inet *retval, str *in);
inet *INETnull(void);
-str INETsetmasklen(inet *retval, const inet *val, const int *mask);
+str INETsetmasklen(inet *retval, const inet *val, const int *msk);
str INETtext(str *retval, const inet *val);
int INETtoString(str *retval, int *len, const inet *handle);
str INSPECTatom_names(bat *ret);
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -50,15 +50,6 @@
#include "mal_runtime.h"
#include "mal_authorize.h"
-/*
- * This should be in src/mal/mal.h, as the function is implemented in
- * src/mal/mal.c; however, it cannot, as "Client" isn't known there ...
- * |-( For now, we move the prototype here, as it it only used here.
- * Maybe, we should consider also moving the implementation here...
- */
-
-static void freeClient(Client c);
-
int MAL_MAXCLIENTS = 0;
ClientRec *mal_clients;
@@ -356,7 +347,7 @@ MCforkClient(Client father)
* effects of sharing IO descriptors, also its children. Conversely, a
* child can not close a parent.
*/
-void
+static void
freeClient(Client c)
{
Thread t = c->mythread;
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
@@ -1099,6 +1099,7 @@ fcnHeader(Client cntxt, int kind)
}
advance(cntxt, 1);
+ assert(!cntxt->backup);
cntxt->backup = cntxt->curprg;
cntxt->curprg = newFunction( modnme, fnme, kind);
curPrg = cntxt->curprg;
@@ -1135,6 +1136,11 @@ fcnHeader(Client cntxt, int kind)
}
if (currChar(cntxt) != ')') {
freeInstruction(curInstr);
+ if (cntxt->backup) {
+ freeSymbol(cntxt->curprg);
+ cntxt->curprg = cntxt->backup;
+ cntxt->backup = 0;
+ }
parseError(cntxt, "')' expected\n");
skipToEnd(cntxt);
return curBlk;
@@ -1172,6 +1178,11 @@ fcnHeader(Client cntxt, int kind)
if ((ch = currChar(cntxt)) != ',') {
if (ch == ')')
break;
+ if (cntxt->backup) {
+ freeSymbol(cntxt->curprg);
+ cntxt->curprg = cntxt->backup;
+ cntxt->backup = 0;
+ }
parseError(cntxt, "',' expected\n");
skipToEnd(cntxt);
return curBlk;
@@ -1186,6 +1197,11 @@ fcnHeader(Client cntxt, int kind)
newarg = (short *) GDKmalloc(max * sizeof(curInstr->argv[0]));
if (newarg == NULL){
parseError(cntxt, MAL_MALLOC_FAIL);
+ if (cntxt->backup) {
+ freeSymbol(cntxt->curprg);
+ cntxt->curprg = cntxt->backup;
+ cntxt->backup = 0;
+ }
skipToEnd(cntxt);
return curBlk;
}
@@ -1295,8 +1311,12 @@ parseCommandPattern(Client cntxt, int ki
modnme = putNameLen(modnme, l);
if (isModuleDefined(cntxt->nspace, modnme))
insertSymbol(findModule(cntxt->nspace, modnme), curPrg);
- else
+ else {
+ freeSymbol(curPrg);
+ cntxt->curprg = cntxt->backup;
+ cntxt->backup = 0;
return (MalBlkPtr) parseError(cntxt, "<module> not found\n");
+ }
chkProgram(cntxt->fdout, cntxt->nspace, curBlk);
if (cntxt->backup) {
cntxt->curprg = cntxt->backup;
diff --git a/monetdb5/mal/mal_session.c b/monetdb5/mal/mal_session.c
--- a/monetdb5/mal/mal_session.c
+++ b/monetdb5/mal/mal_session.c
@@ -468,8 +468,19 @@ MSserveClient(void *dummy)
/*
* At this stage we should clean out the MAL block
*/
- freeMalBlk(c->curprg->def);
- c->curprg->def = 0;
+ if (c->backup) {
+ assert(0);
+ freeSymbol(c->backup);
+ c->backup = 0;
+ }
+ if (c->curprg) {
+ assert(0);
+ freeSymbol(c->curprg);
+ c->curprg = 0;
+ }
+ if (c->nspace) {
+ assert(0);
+ }
if (c->mode > FINISHCLIENT) {
if (isAdministrator(c) /* && moreClients(0)==0 */) {
@@ -480,7 +491,7 @@ MSserveClient(void *dummy)
}
if (!isAdministrator(c))
MCcloseClient(c);
- if (strcmp(c->nspace->name, "user") == 0) {
+ if (c->nspace && strcmp(c->nspace->name, "user") == 0) {
GDKfree(c->nspace->space);
GDKfree(c->nspace);
c->nspace = NULL;
@@ -514,6 +525,17 @@ MALexitClient(Client c)
if (c->bak)
return NULL;
c->mode = FINISHCLIENT;
+ if (c->backup) {
+ assert(0);
+ freeSymbol(c->backup);
+ c->backup = NULL;
+ }
+ /* should be in the nspace */
+ c->curprg = NULL;
+ if (c->nspace) {
+ freeModule(c->nspace);
+ c->nspace = NULL;
+ }
return NULL;
}
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -482,9 +482,7 @@ SQLstatementIntern(Client c, str *expr,
mnstr_printf(c->fdout, "#SQLstatement:post-compile\n");
printFunction(c->fdout, c->curprg->def, 0, LIST_MAL_NAME |
LIST_MAL_VALUE | LIST_MAL_MAPI);
#endif
- /* always keep it around for inspection */
- SQLaddQueryToCache(c);
- msg =SQLoptimizeFunction(c,c->curprg->def);
+ msg =SQLoptimizeFunction(c, c->curprg->def);
if( msg)
goto endofcompile;
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -1187,9 +1187,6 @@ SQLCacheRemove(Client c, str nme)
s = findSymbolInModule(c->nspace, nme);
if (s == NULL)
throw(MAL, "cache.remove", "internal error, symbol missing\n");
- if (getInstrPtr(s->def, 0)->token == FACTORYsymbol)
- shutdownFactoryByName(c, c->nspace, nme);
- else
- deleteSymbol(c->nspace, s);
+ deleteSymbol(c->nspace, s);
return MAL_SUCCEED;
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -471,21 +471,18 @@ load_trigger(sql_trans *tr, sql_table *t
v = table_funcs.column_find_value(tr, find_sql_column(triggers,
"event"), rid);
nt->event = *(sht*)v; _DELETE(v);
- nt->old_name = table_funcs.column_find_value(tr,
find_sql_column(triggers, "old_name"), rid);
- if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), nt->old_name) != 0) {
- _DELETE(nt->old_name);
- nt->old_name = NULL;
- }
- nt->new_name = table_funcs.column_find_value(tr,
find_sql_column(triggers, "new_name"), rid);
- if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), nt->new_name) != 0) {
- _DELETE(nt->new_name);
- nt->new_name = NULL;
- }
- nt->condition = table_funcs.column_find_value(tr,
find_sql_column(triggers, "condition"), rid);
- if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), nt->condition) != 0) {
- _DELETE(nt->condition);
- nt->condition = NULL;
- }
+ v = table_funcs.column_find_value(tr, find_sql_column(triggers,
"old_name"), rid);
+ if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), v) != 0)
+ nt->old_name = sa_strdup(tr->sa, v);
+ _DELETE(v);
+ v = table_funcs.column_find_value(tr, find_sql_column(triggers,
"new_name"), rid);
+ if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), v) != 0)
+ nt->new_name = sa_strdup(tr->sa, v);
+ _DELETE(v);
+ v = table_funcs.column_find_value(tr, find_sql_column(triggers,
"condition"), rid);
+ if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), v) != 0)
+ nt->condition = sa_strdup(tr->sa, v);
+ _DELETE(v);
nt->statement = table_funcs.column_find_value(tr,
find_sql_column(triggers, "statement"), rid);
nt->t = t;
@@ -536,9 +533,8 @@ load_column(sql_trans *tr, sql_table *t,
c->def = NULL;
def = table_funcs.column_find_value(tr, find_sql_column(columns,
"default"), rid);
if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), def) != 0)
- c->def = def;
- else
- _DELETE(def);
+ c->def = sa_strdup(tr->sa, def);
+ _DELETE(def);
v = table_funcs.column_find_value(tr, find_sql_column(columns, "null"),
rid);
c->null = *(bit *)v; _DELETE(v);
v = table_funcs.column_find_value(tr, find_sql_column(columns,
"number"), rid);
@@ -547,9 +543,8 @@ load_column(sql_trans *tr, sql_table *t,
c->storage_type = NULL;
st = table_funcs.column_find_value(tr, find_sql_column(columns,
"storage"), rid);
if (ATOMcmp(TYPE_str, ATOMnilptr(TYPE_str), st) != 0)
- c->storage_type = st;
- else
- _DELETE(st);
+ c->storage_type = sa_strdup(tr->sa, st);
+ _DELETE(st);
c->t = t;
if (isTable(c->t))
store_funcs.create_col(tr, c);
@@ -4789,13 +4784,16 @@ sql_trans_ranges( sql_trans *tr, sql_col
sql_column *stats_column_id = find_sql_column(stats,
"column_id");
oid rid = table_funcs.column_find_row(tr,
stats_column_id, &col->base.id, NULL);
if (rid != oid_nil) {
+ char *v;
sql_column *stats_min = find_sql_column(stats,
"minval");
sql_column *stats_max = find_sql_column(stats,
"maxval");
- *min = table_funcs.column_find_value(tr,
stats_min, rid);
- *max = table_funcs.column_find_value(tr,
stats_max, rid);
- col->min = *min;
- col->max = *max;
+ v = table_funcs.column_find_value(tr,
stats_min, rid);
+ *min = col->min = sa_strdup(tr->sa, v);
+ _DELETE(v);
+ v = table_funcs.column_find_value(tr,
stats_max, rid);
+ *max = col->max = sa_strdup(tr->sa, v);
+ _DELETE(v);
return 1;
}
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list