Changeset: 84a870997647 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=84a870997647
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_transaction.c
        sql/include/sql_catalog.h
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/rel_sequence.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/storage/store.c
        sql/storage/store_dependency.c
        sql/storage/store_sequence.c
        sql/storage/store_sequence.h
Branch: default
Log Message:

Defensive lines for allocations


diffs (truncated from 816 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3181,7 +3181,7 @@ sql_insert_key(backend *be, list *insert
        }
 }
 
-static void
+static int
 sql_stack_add_inserted( mvc *sql, const char *name, sql_table *t, stmt 
**updates) 
 {
        /* Put single relation of updates and old values on to the stack */
@@ -3204,7 +3204,7 @@ sql_stack_add_inserted( mvc *sql, const 
        r = rel_table_func(sql->sa, NULL, NULL, exps, 2);
        r->l = ti;
 
-       stack_push_rel_view(sql, name, r);
+       return stack_push_rel_view(sql, name, r) ? 1 : 0;
 }
 
 static int
@@ -3220,15 +3220,17 @@ sql_insert_triggers(backend *be, sql_tab
        for (n = t->triggers.set->h; n; n = n->next) {
                sql_trigger *trigger = n->data;
 
-               stack_push_frame(sql, "OLD-NEW");
+               if(!stack_push_frame(sql, "OLD-NEW"))
+                       return 0;
                if (trigger->event == 0 && trigger->time == time) { 
                        stmt *s = NULL;
                        const char *n = trigger->new_name;
 
                        /* add name for the 'inserted' to the stack */
-                       if (!n) n = "new"; 
-       
-                       sql_stack_add_inserted(sql, n, t, updates);
+                       if (!n) n = "new";
+
+                       if(!sql_stack_add_inserted(sql, n, t, updates))
+                               return 0;
                        s = sql_parse(be, sql->sa, trigger->statement, 
m_instantiate);
                        
                        if (!s) 
@@ -4096,7 +4098,7 @@ update_idxs_and_check_keys(backend *be, 
        return idx_updates;
 }
 
-static void
+static int
 sql_stack_add_updated(mvc *sql, const char *on, const char *nn, sql_table *t, 
stmt *tids, stmt **updates)
 {
        /* Put single relation of updates and old values on to the stack */
@@ -4132,8 +4134,9 @@ sql_stack_add_updated(mvc *sql, const ch
        r->l = ti;
                
        /* put single table into the stack with 2 names, needed for the psm 
code */
-       stack_push_rel_view(sql, on, r);
-       stack_push_rel_view(sql, nn, rel_dup(r));
+       if(!stack_push_rel_view(sql, on, r) || !stack_push_rel_view(sql, nn, 
rel_dup(r)))
+               return 0;
+       return 1;
 }
 
 static int
@@ -4149,7 +4152,8 @@ sql_update_triggers(backend *be, sql_tab
        for (n = t->triggers.set->h; n; n = n->next) {
                sql_trigger *trigger = n->data;
 
-               stack_push_frame(sql, "OLD-NEW");
+               if(!stack_push_frame(sql, "OLD-NEW"))
+                       return 0;
                if (trigger->event == 2 && trigger->time == time) {
                        stmt *s = NULL;
        
@@ -4159,8 +4163,9 @@ sql_update_triggers(backend *be, sql_tab
        
                        if (!n) n = "new"; 
                        if (!o) o = "old"; 
-       
-                       sql_stack_add_updated(sql, o, n, t, tids, updates);
+
+                       if(!sql_stack_add_updated(sql, o, n, t, tids, updates))
+                               return 0;
                        s = sql_parse(be, sql->sa, trigger->statement, 
m_instantiate);
                        if (!s) 
                                return 0;
@@ -4348,7 +4353,7 @@ rel2bin_update(backend *be, sql_rel *rel
        return cnt;
 }
  
-static void
+static int
 sql_stack_add_deleted(mvc *sql, const char *name, sql_table *t, stmt *tids)
 {
        /* Put single relation of updates and old values on to the stack */
@@ -4371,7 +4376,7 @@ sql_stack_add_deleted(mvc *sql, const ch
        r = rel_table_func(sql->sa, NULL, NULL, exps, 2);
        r->l = ti;
 
-       stack_push_rel_view(sql, name, r);
+       return stack_push_rel_view(sql, name, r) ? 1 : 0;
 }
 
 static int
@@ -4387,16 +4392,18 @@ sql_delete_triggers(backend *be, sql_tab
        for (n = t->triggers.set->h; n; n = n->next) {
                sql_trigger *trigger = n->data;
 
-               stack_push_frame(sql, "OLD-NEW");
+               if(!stack_push_frame(sql, "OLD-NEW"))
+                       return 0;
                if (trigger->event == 1 && trigger->time == time) {
                        stmt *s = NULL;
-       
+
                        /* add name for the 'deleted' to the stack */
                        const char *o = trigger->old_name;
-               
+
                        if (!o) o = "old"; 
-               
-                       sql_stack_add_deleted(sql, o, t, tids);
+
+                       if(!sql_stack_add_deleted(sql, o, t, tids))
+                               return 0;
                        s = sql_parse(be, sql->sa, trigger->statement, 
m_instantiate);
 
                        if (!s) 
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
@@ -899,7 +899,8 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
        /* keep copy of signature and relational expression */
        snprintf(buf, BUFSIZ, "%s %s", *sig, *expr);
 
-       stack_push_frame(m, NULL);
+       if(!stack_push_frame(m, NULL))
+               return createException(SQL,"RAstatement2",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
        ops = sa_list(m->sa);
        while (c && *c && !isspace((unsigned char) *c)) {
                char *vnme = c, *tnme;
@@ -932,7 +933,8 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
                        append(ops, exp_atom_ref(m->sa, nr, &t));
                        sql_set_arg(m, nr, a);
                } else {
-                       stack_push_var(m, vnme+1, &t);
+                       if(!stack_push_var(m, vnme+1, &t))
+                               return 
createException(SQL,"RAstatement2",SQLSTATE(HY001) MAL_MALLOC_FAIL);
                        append(ops, exp_var(m->sa, sa_strdup(m->sa, vnme+1), 
&t, m->frame));
                }
                c = strchr(p, (int)',');
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
@@ -281,9 +281,11 @@ SQLinit(void)
        return MAL_SUCCEED;
 }
 
-#define SQLglobal(name, val) \
-       stack_push_var(sql, name, &ctype);         \
-       stack_set_var(sql, name, VALset(&src, ctype.type->localtype, val));
+#define SQLglobal(name, val, failure)                                       \
+       if(stack_push_var(sql, name, &ctype))                                   
\
+               stack_set_var(sql, name, VALset(&src, ctype.type->localtype, 
val)); \
+       else                                                                    
\
+               failure++;                                                      
    \
 
 #define NR_GLOBAL_VARS 10
 /* NR_GLOBAL_VAR should match exactly the number of variables created
@@ -298,37 +300,38 @@ global_variables(mvc *sql, char *user, c
        bit F = FALSE;
        ValRecord src;
        str opt;
+       int failure = 0;
 
        typename = "int";
        sql_find_subtype(&ctype, typename, 0, 0);
-       SQLglobal("debug", &sql->debug);
-       SQLglobal("cache", &sql->cache);
+       SQLglobal("debug", &sql->debug, failure);
+       SQLglobal("cache", &sql->cache, failure);
 
        typename = "varchar";
        sql_find_subtype(&ctype, typename, 1024, 0);
-       SQLglobal("current_schema", schema);
-       SQLglobal("current_user", user);
-       SQLglobal("current_role", user);
+       SQLglobal("current_schema", schema, failure);
+       SQLglobal("current_user", user, failure);
+       SQLglobal("current_role", user, failure);
 
        /* inherit the optimizer from the server */
        opt = GDKgetenv("sql_optimizer");
        if (!opt)
                opt = "default_pipe";
-       SQLglobal("optimizer", opt);
+       SQLglobal("optimizer", opt, failure);
 
        typename = "sec_interval";
        sql_find_subtype(&ctype, typename, inttype2digits(ihour, isec), 0);
-       SQLglobal("current_timezone", &sec);
+       SQLglobal("current_timezone", &sec, failure);
 
        typename = "boolean";
        sql_find_subtype(&ctype, typename, 0, 0);
-       SQLglobal("history", &F);
+       SQLglobal("history", &F, failure);
 
        typename = "bigint";
        sql_find_subtype(&ctype, typename, 0, 0);
-       SQLglobal("last_id", &sql->last_id);
-       SQLglobal("rowcnt", &sql->rowcnt);
-       return 0;
+       SQLglobal("last_id", &sql->last_id, failure);
+       SQLglobal("rowcnt", &sql->rowcnt, failure);
+       return failure;
 }
 
 #define TRANS_ABORTED SQLSTATE(25005) "Current transaction is aborted (please 
ROLLBACK)\n"
@@ -464,17 +467,18 @@ SQLinitClient(Client c)
                m = mvc_create(c->idx, 0, SQLdebug, c->fdin, c->fdout);
                if( m == NULL)
                        throw(SQL,"sql.initClient",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
-               global_variables(m, "monetdb", "sys");
+               if(global_variables(m, "monetdb", "sys"))
+                       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)
-                       throw(SQL,"sql.init", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+                       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)
-                       throw(SQL,"sql.init", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+                       throw(SQL,"sql.initClient", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                backend_reset(be);
        }
        if (m->session->tr)
@@ -1145,16 +1149,20 @@ SQLparser(Client c)
 
                if ((!caching(m) || !cachable(m, r)) && m->emode != m_prepare) {
                        char *q = query_cleaned(QUERY(m->scanner));
-
-                       /* Query template should not be cached */
-                       scanner_query_processed(&(m->scanner));
+                       if(!q) {
+                               err = 1;
+                               msg = createException(PARSE, "SQLparser", 
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+                       } else {
+                               /* Query template should not be cached */
+                               scanner_query_processed(&(m->scanner));
 
-                       err = 0;
-                       if (backend_callinline(be, c) < 0 ||
-                           backend_dumpstmt(be, c->curprg->def, r, 1, 0, q) < 
0)
-                               err = 1;
-                       else opt = 1;
-                       GDKfree(q);
+                               err = 0;
+                               if (backend_callinline(be, c) < 0 ||
+                                       backend_dumpstmt(be, c->curprg->def, r, 
1, 0, q) < 0)
+                                       err = 1;
+                               else opt = 1;
+                               GDKfree(q);
+                       }
                } else {
                        /* Add the query tree to the SQL query cache
                         * and bake a MAL program for it.
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
@@ -36,10 +36,10 @@
 #include <orderidx.h>
 
 #define initcontext() \
-    if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)\
-        return msg;\
-    if ((msg = checkSQLContext(cntxt)) != NULL)\
-        return msg; \
+       if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)\
+               return msg;\
+       if ((msg = checkSQLContext(cntxt)) != NULL)\
+               return msg; \
        if (name && strcmp(name, str_nil) == 0)\
                name = NULL;
 
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -58,6 +58,8 @@
 #define NO_DEPENDENCY 0
 #define HAS_DEPENDENCY 1
 #define CICLE_DEPENDENCY 2
+#define DEPENDENCY_CHECK_ERROR 3
+#define DEPENDENCY_CHECK_OK 0
 
 #define NO_TRIGGER 0
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to