Changeset: 70fe76fd3895 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=70fe76fd3895
Modified Files:
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/sql_transaction.c
sql/backends/monet5/sql_user.c
sql/backends/monet5/wlr.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/storage/store.c
Branch: default
Log Message:
Defensive lines for allocation failures
diffs (truncated from 366 to 300 lines):
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
@@ -445,7 +445,7 @@ SQLstatementIntern(Client c, str *expr,
}
if (msg){
freeException(msg);
- throw(SQL, "SQLstatement", SQLSTATE(HY002) "Catalogue not
available");
+ throw(SQL, "sql.statement", SQLSTATE(HY002) "Catalogue not
available");
}
initSQLreferences();
@@ -455,7 +455,7 @@ SQLstatementIntern(Client c, str *expr,
if (!o) {
if (inited)
SQLresetClient(c);
- throw(SQL, "SQLstatement", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ throw(SQL, "sql.statement", SQLSTATE(HY001) MAL_MALLOC_FAIL);
}
*o = *m;
/* hide query cache, this causes crashes in SQLtrans() due to
uninitialized memory otherwise */
@@ -464,13 +464,23 @@ SQLstatementIntern(Client c, str *expr,
/* create private allocator */
m->sa = NULL;
SQLtrans(m);
+ if(*m->errstr) {
+ if (strlen(m->errstr) > 6 && m->errstr[5] == '!')
+ msg = createException(SQL, "sql.statement", "%s",
m->errstr);
+ else
+ msg = createException(SQL, "sql.statement",
SQLSTATE(42000) "%s", m->errstr);
+ *m->errstr=0;
+ if (inited)
+ SQLresetClient(c);
+ return msg;
+ }
status = m->session->status;
m->type = Q_PARSE;
be = sql;
sql = backend_create(m, c);
if( sql == NULL)
- throw(SQL,"SQLstatement",SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ throw(SQL,"sql.statement",SQLSTATE(HY001) MAL_MALLOC_FAIL);
sql->output_format = be->output_format;
if (!output) {
sql->output_format = OFMT_NONE;
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
@@ -387,7 +387,10 @@ SQLtrans(mvc *m)
if (!m->session->active) {
sql_session *s;
- mvc_trans(m);
+ if(mvc_trans(m) < 0) {
+ (void) sql_error(m, 02, SQLSTATE(HY001) "Allocation
failure while starting the transaction");
+ return;
+ }
s = m->session;
if (!s->schema) {
if (s->schema_name)
@@ -470,7 +473,8 @@ SQLinitClient(Client c)
} else {
be = c->sqlcontext;
m = be->mvc;
- mvc_reset(m, c->fdin, c->fdout, SQLdebug, NR_GLOBAL_VARS);
+ if(mvc_reset(m, c->fdin, c->fdout, SQLdebug, NR_GLOBAL_VARS) <
0)
+ throw(SQL,"sql.init", SQLSTATE(HY001) MAL_MALLOC_FAIL);
backend_reset(be);
}
if (m->session->tr)
@@ -976,6 +980,15 @@ SQLparser(Client c)
m->type = Q_PARSE;
if (be->language != 'X')
SQLtrans(m);
+ if(*m->errstr) {
+ if (strlen(m->errstr) > 6 && m->errstr[5] == '!')
+ msg = createException(PARSE, "SQLparser", "%s",
m->errstr);
+ else
+ msg = createException(PARSE, "SQLparser",
SQLSTATE(42000) "%s", m->errstr);
+ *m->errstr=0;
+ c->mode = FINISHCLIENT;
+ return msg;
+ }
pstatus = m->session->status;
/* sqlparse needs sql allocator to be available. It can be NULL at
diff --git a/sql/backends/monet5/sql_transaction.c
b/sql/backends/monet5/sql_transaction.c
--- a/sql/backends/monet5/sql_transaction.c
+++ b/sql/backends/monet5/sql_transaction.c
@@ -129,7 +129,8 @@ SQLtransaction_begin(Client cntxt, MalBl
sql->session->auto_commit = 0;
sql->session->ac_on_commit = 1;
sql->session->level = chain;
- (void) mvc_trans(sql);
+ if(mvc_trans(sql) < 0)
+ throw(SQL, "sql.trans", SQLSTATE(HY001) MAL_MALLOC_FAIL);
return MAL_SUCCEED;
}
@@ -154,7 +155,8 @@ SQLtransaction2(Client cntxt, MalBlkPtr
sql->session->auto_commit = 0;
sql->session->ac_on_commit = 1;
sql->session->level = 0;
- (void) mvc_trans(sql);
+ if(mvc_trans(sql) < 0)
+ throw(SQL, "sql.trans", 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
@@ -475,7 +475,10 @@ monet5_user_set_def_schema(mvc *m, oid u
return (NULL); /* don't reveal that the user doesn't exist */
}
- mvc_trans(m);
+ if(mvc_trans(m) < 0) {
+ GDKfree(username);
+ return NULL;
+ }
sys = find_sql_schema(m->session->tr, "sys");
user_info = find_sql_table(sys, "db_user_info");
diff --git a/sql/backends/monet5/wlr.c b/sql/backends/monet5/wlr.c
--- a/sql/backends/monet5/wlr.c
+++ b/sql/backends/monet5/wlr.c
@@ -266,27 +266,30 @@ WLRprocess(void *arg)
sql->session->auto_commit = 0;
sql->session->ac_on_commit = 1;
sql->session->level = 0;
- (void) mvc_trans(sql);
- //printFunction(GDKerr, mb, 0,
LIST_MAL_DEBUG );
- msg= runMAL(c,mb,0,0);
- wlr_tag++;
- WLRsetConfig( );
- // ignore warnings
- if (msg && strstr(msg,"WARNING"))
- msg = MAL_SUCCEED;
- if( msg != MAL_SUCCEED){
- // they should always succeed
- mnstr_printf(GDKerr,"ERROR in
processing batch %d :%s\n", i, msg);
- printFunction(GDKerr, mb, 0,
LIST_MAL_DEBUG );
- mvc_rollback(sql,0,NULL);
- // cleanup
- fprintFunction(stderr,mb,0,63);
-
resetMalBlkAndFreeInstructions(mb, 1);
- trimMalVariables(mb, NULL);
- pc = 0;
- } else
- if( mvc_commit(sql, 0, 0) < 0)
-
mnstr_printf(GDKerr,"#wlr.process transaction commit failed");
+ if(mvc_trans(sql) < 0) {
+ mnstr_printf(GDKerr,"Allocation
failure while starting the transaction \n");
+ } else {
+ //printFunction(GDKerr, mb, 0,
LIST_MAL_DEBUG );
+ msg= runMAL(c,mb,0,0);
+ wlr_tag++;
+ WLRsetConfig( );
+ // ignore warnings
+ if (msg &&
strstr(msg,"WARNING"))
+ msg = MAL_SUCCEED;
+ if( msg != MAL_SUCCEED){
+ // they should always
succeed
+
mnstr_printf(GDKerr,"ERROR in processing batch %d :%s\n", i, msg);
+ printFunction(GDKerr,
mb, 0, LIST_MAL_DEBUG );
+
mvc_rollback(sql,0,NULL);
+ // cleanup
+
fprintFunction(stderr,mb,0,63);
+
resetMalBlkAndFreeInstructions(mb, 1);
+ trimMalVariables(mb,
NULL);
+ pc = 0;
+ } else
+ if( mvc_commit(sql, 0, 0) < 0)
+
mnstr_printf(GDKerr,"#wlr.process transaction commit failed");
+ }
} else {
char line[PATHLENGTH];
snprintf(line,
PATHLENGTH,"#wlr.process:typechecking failed '%s':\n",path);
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
@@ -87,7 +87,11 @@ mvc_init(int debug, store_type store, in
m->history = 0;
/* disable size header */
m->sizeheader = 0;
- mvc_trans(m);
+ if(mvc_trans(m) < 0) {
+ mvc_destroy(m);
+ fprintf(stderr, "!mvc_init: failed to start
transaction\n");
+ return -1;
+ }
s = m->session->schema = mvc_bind_schema(m, "sys");
assert(m->session->schema != NULL);
@@ -226,7 +230,7 @@ mvc_debug_on(mvc *m, int flg)
return 0;
}
-void
+int
mvc_trans(mvc *m)
{
int schema_changed = 0, err = m->session->status;
@@ -240,11 +244,17 @@ mvc_trans(mvc *m)
if (m->qc)
qc_destroy(m->qc);
m->qc = qc_create(m->clientid, seqnr);
+ if (!m->qc) {
+ sql_trans_end(m->session);
+ store_unlock();
+ return -1;
+ }
} else { /* clean all but the prepared statements */
qc_clean(m->qc);
}
}
store_unlock();
+ return 0;
}
static sql_trans *
@@ -301,7 +311,7 @@ mvc_commit(mvc *m, int chain, const char
assert(tr);
assert(m->session->active); /* only commit an active transaction */
-
+
if (mvc_debug)
fprintf(stderr, "#mvc_commit %s\n", (name) ? name : "");
@@ -318,6 +328,12 @@ mvc_commit(mvc *m, int chain, const char
fprintf(stderr, "#mvc_savepoint\n");
store_lock();
m->session->tr = sql_trans_create(m->session->stk, tr, name);
+ if(!m->session->tr) {
+ store_unlock();
+ (void) sql_error(m, 02, SQLSTATE(HY001) "Allocation
failure while committing the transaction, will ROLLBACK instead");
+ mvc_rollback(m, chain, name);
+ return -1;
+ }
WLCcommit(m->clientid);
store_unlock();
m->type = Q_TRANS;
@@ -579,7 +595,7 @@ mvc_create(int clientid, backend_stack s
return m;
}
-void
+int
mvc_reset(mvc *m, bstream *rs, stream *ws, int debug, int globalvars)
{
int i;
@@ -644,6 +660,7 @@ mvc_reset(mvc *m, bstream *rs, stream *w
m->results = NULL;
scanner_init(&m->scanner, rs, ws);
+ return m->sa ? 0 : -1;
}
void
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
@@ -136,7 +136,7 @@ extern void mvc_logmanager(void);
extern void mvc_idlemanager(void);
extern mvc *mvc_create(int clientid, backend_stack stk, int debug, bstream
*rs, stream *ws);
-extern void mvc_reset(mvc *m, bstream *rs, stream *ws, int debug, int
globalvars);
+extern int mvc_reset(mvc *m, bstream *rs, stream *ws, int debug, int
globalvars);
extern void mvc_destroy(mvc *c);
extern int mvc_status(mvc *c);
@@ -150,7 +150,7 @@ extern int mvc_debug_on(mvc *m, int flag
*/
#define has_snapshots(tr) ((tr) && (tr)->parent && (tr)->parent->parent)
-extern void mvc_trans(mvc *c);
+extern int mvc_trans(mvc *c);
extern int mvc_commit(mvc *c, int chain, const char *name);
extern int mvc_rollback(mvc *c, int chain, const char *name);
extern int mvc_release(mvc *c, 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
@@ -1426,6 +1426,8 @@ store_load(void) {
sqlid id = 0;
sa = sa_create();
+ if(!sa)
+ return -1;
types_init(sa, logger_debug);
#define FUNC_OIDS 2000
@@ -1446,6 +1448,8 @@ store_load(void) {
return -1;
}
tr = sql_trans_create(backend_stk, NULL, NULL);
+ if(!tr)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list