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

Reply via email to