Changeset: 234d6a70715b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=234d6a70715b
Modified Files:
sql/backends/monet5/sql.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_user.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/storage/store.c
Branch: default
Log Message:
Forgot to release lock in case of failure, plus more allocation checks
diffs (239 lines):
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
@@ -557,10 +557,14 @@ setVariable(Client cntxt, MalBlkPtr mb,
msg = addPipeDefinition(cntxt, buf, newopt);
if (msg)
return msg;
- if (stack_find_var(m, varname))
- stack_set_string(m, varname, buf);
- } else if (stack_find_var(m, varname))
- stack_set_string(m, varname, newopt);
+ if (stack_find_var(m, varname)) {
+ if(!stack_set_string(m, varname, buf))
+ throw(SQL, "sql.setVariable",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ }
+ } else if (stack_find_var(m, varname)) {
+ if(!stack_set_string(m, varname, newopt))
+ throw(SQL, "sql.setVariable",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ }
}
return MAL_SUCCEED;
}
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
@@ -285,7 +285,7 @@ SQLinit(void)
if(stack_push_var(sql, name, &ctype))
\
stack_set_var(sql, name, VALset(&src, ctype.type->localtype,
val)); \
else
\
- failure++;
\
+ failure--;
\
#define NR_GLOBAL_VARS 10
/* NR_GLOBAL_VAR should match exactly the number of variables created
@@ -399,6 +399,11 @@ SQLtrans(mvc *m)
if (s->schema_name)
GDKfree(s->schema_name);
s->schema_name = monet5_user_get_def_schema(m,
m->user_id);
+ if(!s->schema_name) {
+ mvc_cancel_session(m);
+ (void) sql_error(m, 02, SQLSTATE(HY001)
"Allocation failure while starting the transaction");
+ return;
+ }
assert(s->schema_name);
s->schema = find_sql_schema(s->tr, s->schema_name);
assert(s->schema);
@@ -441,6 +446,7 @@ SQLinitClient(Client c)
bstream *fdin;
if( b == NULL || cbuf == NULL) {
+ MT_lock_unset(&sql_contextLock);
GDKfree(b);
GDKfree(cbuf);
throw(SQL,"sql.initClient",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
@@ -449,12 +455,14 @@ SQLinitClient(Client c)
buffer_init(b, cbuf, len);
buf = buffer_rastream(b, "si");
if( buf == NULL) {
+ MT_lock_unset(&sql_contextLock);
buffer_destroy(b);
throw(SQL,"sql.initClient",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
}
fdin = bstream_create(buf, b->len);
if( fdin == NULL) {
+ MT_lock_unset(&sql_contextLock);
buffer_destroy(b);
throw(SQL,"sql.initClient",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
}
@@ -465,20 +473,30 @@ SQLinitClient(Client c)
}
if (c->sqlcontext == 0) {
m = mvc_create(c->idx, 0, SQLdebug, c->fdin, c->fdout);
- if( m == NULL)
+ if( m == NULL) {
+ MT_lock_unset(&sql_contextLock);
throw(SQL,"sql.initClient",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
- if(global_variables(m, "monetdb", "sys"))
+ }
+ if(global_variables(m, "monetdb", "sys") < 0) {
+ MT_lock_unset(&sql_contextLock);
+ mvc_destroy(m);
throw(SQL,"sql.initClient",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ }
if (isAdministrator(c) || strcmp(c->scenario, "msql") == 0)
/* console should return everything */
m->reply_size = -1;
be = (void *) backend_create(m, c);
- if( be == NULL)
+ if( be == NULL) {
+ MT_lock_unset(&sql_contextLock);
+ mvc_destroy(m);
throw(SQL,"sql.initClient", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ }
} else {
be = c->sqlcontext;
m = be->mvc;
- if(mvc_reset(m, c->fdin, c->fdout, SQLdebug, NR_GLOBAL_VARS) <
0)
+ if(mvc_reset(m, c->fdin, c->fdout, SQLdebug, NR_GLOBAL_VARS) <
0) {
+ MT_lock_unset(&sql_contextLock);
throw(SQL,"sql.initClient", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ }
backend_reset(be);
}
if (m->session->tr)
@@ -488,6 +506,7 @@ SQLinitClient(Client c)
schema = monet5_user_set_def_schema(m, c->user);
if (!schema) {
_DELETE(schema);
+ MT_lock_unset(&sql_contextLock);
throw(PERMD, "SQLinitClient", SQLSTATE(08004) "schema
authorization error");
}
_DELETE(schema);
@@ -715,6 +734,8 @@ SQLcompile(Client cntxt, MalBlkPtr mb, M
msg = SQLstatementIntern(cntxt, expr, "SQLcompile", FALSE, FALSE, NULL);
if (msg == MAL_SUCCEED)
*ret = _STRDUP("SQLcompile");
+ if(*ret == NULL)
+ throw(SQL,"sql.compile",SQLSTATE(HY001) MAL_MALLOC_FAIL);
return msg;
}
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -442,7 +442,8 @@ monet5_user_get_def_schema(mvc *m, int u
rid = table_funcs.column_find_row(m->session->tr, schemas_id,
&schema_id, NULL);
if (!is_oid_nil(rid))
schema = table_funcs.column_find_value(m->session->tr,
schemas_name, rid);
- stack_set_string(m, "current_schema", schema);
+ if(!stack_set_string(m, "current_schema", schema))
+ return NULL;
return schema;
}
@@ -524,9 +525,11 @@ monet5_user_set_def_schema(mvc *m, oid u
return NULL;
}
/* reset the user and schema names */
- stack_set_string(m, "current_schema", schema);
- stack_set_string(m, "current_user", username);
- stack_set_string(m, "current_role", username);
+ if(!stack_set_string(m, "current_schema", schema) ||
+ !stack_set_string(m, "current_user", username) ||
+ !stack_set_string(m, "current_role", username)) {
+ schema = NULL;
+ }
GDKfree(username);
mvc_rollback(m, 0, NULL);
return schema;
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -230,6 +230,14 @@ mvc_debug_on(mvc *m, int flg)
return 0;
}
+void
+mvc_cancel_session(mvc *m)
+{
+ store_lock();
+ sql_trans_end(m->session);
+ store_unlock();
+}
+
int
mvc_trans(mvc *m)
{
@@ -779,7 +787,7 @@ mvc_bind_table(mvc *m, sql_schema *s, co
if (tpe) {
t = tpe;
} else { /* during exection they are in the declared table
schema */
- s = mvc_bind_schema(m, dt_schema);
+ s = mvc_bind_schema(m, dt_schema);
return mvc_bind_table(m, s, tname);
}
} else {
@@ -1653,18 +1661,23 @@ stack_nr_of_declared_tables(mvc *sql)
return dt;
}
-void
+str
stack_set_string(mvc *sql, const char *name, const char *val)
{
atom *a = stack_get_var(sql, name);
+ str new_val = _STRDUP(val);
- if (a != NULL) {
+ if (a != NULL && new_val != NULL) {
ValRecord *v = &a->data;
if (v->val.sval)
_DELETE(v->val.sval);
- v->val.sval = _STRDUP(val);
+ v->val.sval = new_val;
+ return new_val;
+ } else if(new_val) {
+ _DELETE(new_val);
}
+ return NULL;
}
str
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -142,6 +142,7 @@ extern void mvc_destroy(mvc *c);
extern int mvc_status(mvc *c);
extern int mvc_type(mvc *c);
extern int mvc_debug_on(mvc *m, int flag);
+extern void mvc_cancel_session(mvc *m);
/* since Savepoints and transactions are related the
* commit function includes the savepoint creation.
@@ -242,7 +243,7 @@ extern atom * stack_get_var(mvc *sql, co
extern void stack_set_var(mvc *sql, const char *name, ValRecord *v);
extern str stack_get_string(mvc *sql, const char *name);
-extern void stack_set_string(mvc *sql, const char *name, const char *v);
+extern str stack_set_string(mvc *sql, const char *name, const char *v);
#ifdef HAVE_HGE
extern hge val_get_number(ValRecord *val);
extern hge stack_get_number(mvc *sql, const char *name);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -5473,8 +5473,11 @@ sql_session_reset(sql_session *s, int ac
sql_schema *tmp;
char *def_schema_name = _STRDUP("sys");
- if (!s->tr || !def_schema_name)
+ if (!s->tr || !def_schema_name) {
+ if(def_schema_name)
+ _DELETE(def_schema_name);
return 0;
+ }
/* TODO cleanup "dt" schema */
tmp = find_sql_schema(s->tr, "tmp");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list