Changeset: b03ff9830d7e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b03ff9830d7e
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_partition.c
Branch: iso
Log Message:

Allocation checks


diffs (215 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
@@ -363,7 +363,11 @@ create_table_or_view(mvc *sql, char* sna
                                so no additional dependencies are needed */
                        if (strncmp(c->def, next_value_for, 
strlen(next_value_for)) != 0) {
                                list *blist = rel_dependencies(sql, r);
-                               mvc_create_dependencies(sql, blist, 
nt->base.id, FUNC_DEPENDENCY);
+                               if (mvc_create_dependencies(sql, blist, 
nt->base.id, FUNC_DEPENDENCY)) {
+                                       rel_destroy(r);
+                                       sa_reset(sql->sa);
+                                       throw(SQL, "sql.catalog", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               }
                        }
                        rel_destroy(r);
                        sa_reset(sql->sa);
@@ -477,7 +481,11 @@ create_table_or_view(mvc *sql, char* sna
                        r = sql_processrelation(sql, r, 0, 0);
                if (r) {
                        list *blist = rel_dependencies(sql, r);
-                       mvc_create_dependencies(sql, blist, nt->base.id, 
VIEW_DEPENDENCY);
+                       if (mvc_create_dependencies(sql, blist, nt->base.id, 
VIEW_DEPENDENCY)) {
+                               sa_reset(sql->ta);
+                               sql->sa = osa;
+                               throw(SQL, "sql.catalog", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       }
                }
                sa_reset(sql->ta);
                if (!r) {
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -517,18 +517,25 @@ create_trigger(mvc *sql, char *sname, ch
                sql_rel *r = NULL;
                sql_allocator *sa = sql->sa;
 
-               sql->sa = sa_create(sql->pa);
-               if (!sql->sa)
-                       throw(SQL, "sql.catalog",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-               buf = sa_strdup(sql->sa, query);
-               if (!buf)
-                       throw(SQL, "sql.catalog",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               if (!(sql->sa = sa_create(sql->pa))) {
+                       sql->sa = sa;
+                       throw(SQL, "sql.create_trigger", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               }
+               if (!(buf = sa_strdup(sql->sa, query))) {
+                       sa_destroy(sql->sa);
+                       sql->sa = sa;
+                       throw(SQL, "sql.create_trigger", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               }
                r = rel_parse(sql, s, buf, m_deps);
                if (r)
                        r = sql_processrelation(sql, r, 0, 0);
                if (r) {
                        list *blist = rel_dependencies(sql, r);
-                       mvc_create_dependencies(sql, blist, tri->base.id, 
TRIGGER_DEPENDENCY);
+                       if (mvc_create_dependencies(sql, blist, tri->base.id, 
TRIGGER_DEPENDENCY)) {
+                               sa_destroy(sql->sa);
+                               sql->sa = sa;
+                               throw(SQL, "sql.create_trigger", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       }
                }
                sa_destroy(sql->sa);
                sql->sa = sa;
@@ -915,10 +922,15 @@ create_func(mvc *sql, char *sname, char 
                sql_allocator *sa = sql->sa;
 
                assert(nf->query);
-               if (!(sql->sa = sa_create(sql->pa)))
+               if (!(sql->sa = sa_create(sql->pa))) {
+                       sql->sa = sa;
                        throw(SQL, "sql.create_func", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-               if (!(buf = sa_strdup(sql->sa, nf->query)))
+               }
+               if (!(buf = sa_strdup(sql->sa, nf->query))) {
+                       sa_destroy(sql->sa);
+                       sql->sa = sa;
                        throw(SQL, "sql.create_func", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               }
                r = rel_parse(sql, s, buf, m_deps);
                if (r)
                        r = sql_processrelation(sql, r, 0, 0);
@@ -930,19 +942,29 @@ create_func(mvc *sql, char *sname, char 
                                for (n = f->ops->h; n; n = n->next) {
                                        sql_arg *a = n->data;
 
-                                       if (a->type.type->s)
-                                               mvc_create_dependency(sql, 
&a->type.type->base, nf->base.id, TYPE_DEPENDENCY);
+                                       if (a->type.type->s && 
mvc_create_dependency(sql, &a->type.type->base, nf->base.id, TYPE_DEPENDENCY)) {
+                                               sa_destroy(sql->sa);
+                                               sql->sa = sa;
+                                               throw(SQL, "sql.create_func", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       }
                                }
                        }
                        if (!f->varres && f->res) {
                                for (n = f->res->h; n; n = n->next) {
                                        sql_arg *a = n->data;
 
-                                       if (a->type.type->s)
-                                               mvc_create_dependency(sql, 
&a->type.type->base, nf->base.id, TYPE_DEPENDENCY);
+                                       if (a->type.type->s && 
mvc_create_dependency(sql, &a->type.type->base, nf->base.id, TYPE_DEPENDENCY)) {
+                                               sa_destroy(sql->sa);
+                                               sql->sa = sa;
+                                               throw(SQL, "sql.create_func", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       }
                                }
                        }
-                       mvc_create_dependencies(sql, blist, nf->base.id, 
!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY);
+                       if (mvc_create_dependencies(sql, blist, nf->base.id, 
!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY)) {
+                               sa_destroy(sql->sa);
+                               sql->sa = sa;
+                               throw(SQL, "sql.create_func", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       }
                }
                sa_destroy(sql->sa);
                sql->sa = sa;
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
@@ -64,7 +64,11 @@ mvc_init_create_view(mvc *m, sql_schema 
                        r = sql_processrelation(m, r, 0, 0);
                if (r) {
                        list *blist = rel_dependencies(m, r);
-                       mvc_create_dependencies(m, blist, t->base.id, 
VIEW_DEPENDENCY);
+                       if (mvc_create_dependencies(m, blist, t->base.id, 
VIEW_DEPENDENCY)) {
+                               sa_reset(m->ta);
+                               (void) sql_error(m, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                               return NULL;
+                       }
                }
                sa_reset(m->ta);
                assert(r);
@@ -1311,29 +1315,37 @@ mvc_drop_column(mvc *m, sql_table *t, sq
                return sql_trans_drop_column(m->session->tr, t, col->base.id, 
drop_action ? DROP_CASCADE_START : DROP_RESTRICT);
 }
 
-void
+int
 mvc_create_dependency(mvc *m, sql_base *b, sqlid depend_id, sql_dependency 
depend_type)
 {
+       int res = LOG_OK;
+
        TRC_DEBUG(SQL_TRANS, "Create dependency: %d %d %d\n", b->id, depend_id, 
(int) depend_type);
        if ( (b->id != depend_id) || (depend_type == BEDROPPED_DEPENDENCY) ) {
                if (!b->new)
-                       sql_trans_add_dependency(m->session->tr, b->id, ddl);
-               sql_trans_create_dependency(m->session->tr, b->id, depend_id, 
depend_type);
+                       res = sql_trans_add_dependency(m->session->tr, b->id, 
ddl);
+               if (res == LOG_OK)
+                       res = sql_trans_create_dependency(m->session->tr, 
b->id, depend_id, depend_type);
        }
+       return res;
 }
 
-void
+int
 mvc_create_dependencies(mvc *m, list *blist, sqlid depend_id, sql_dependency 
dep_type)
 {
+       int res = LOG_OK;
+
        TRC_DEBUG(SQL_TRANS, "Create dependencies on '%d' of type: %d\n", 
depend_id, (int) dep_type);
        if (!list_empty(blist)) {
-               for (node *n = blist->h ; n ; n = n->next) {
+               for (node *n = blist->h ; n && res == LOG_OK ; n = n->next) {
                        sql_base *b = n->data;
                        if (!b->new) /* only add old objects to the transaction 
dependency list */
-                               sql_trans_add_dependency(m->session->tr, b->id, 
ddl);
-                       mvc_create_dependency(m, b, depend_id, dep_type);
+                               res = sql_trans_add_dependency(m->session->tr, 
b->id, ddl);
+                       if (res == LOG_OK)
+                               res = mvc_create_dependency(m, b, depend_id, 
dep_type);
                }
        }
+       return res;
 }
 
 int
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
@@ -237,8 +237,8 @@ extern sql_trigger * mvc_create_trigger(
 extern int mvc_drop_trigger(mvc *m, sql_schema *s, sql_trigger * tri);
 
 /*dependency control*/
-extern void mvc_create_dependency(mvc *m, sql_base *b, sqlid depend_id, 
sql_dependency depend_type);
-extern void mvc_create_dependencies(mvc *m, list *blist, sqlid depend_id, 
sql_dependency dep_type);
+extern int mvc_create_dependency(mvc *m, sql_base *b, sqlid depend_id, 
sql_dependency depend_type);
+extern int mvc_create_dependencies(mvc *m, list *blist, sqlid depend_id, 
sql_dependency dep_type);
 extern int mvc_check_dependency(mvc *m, sqlid id, sql_dependency type, list 
*ignore_ids);
 
 /* variable management */
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -293,7 +293,7 @@ bootstrap_partition_expression(mvc *sql,
                }
        }
 
-       if (instantiate) {
+       if (instantiate && !msg) {
                r = rel_project(sql->sa, r, NULL);
                sql_rel *base = r->l, *nr = r;
                r->l = NULL; /* omit table from list of dependencies */
@@ -302,7 +302,8 @@ bootstrap_partition_expression(mvc *sql,
                nr = sql_processrelation(sql, nr, 0, 0);
                if (nr) {
                        list *blist = rel_dependencies(sql, nr);
-                       mvc_create_dependencies(sql, blist, mt->base.id, 
FUNC_DEPENDENCY);
+                       if (mvc_create_dependencies(sql, blist, mt->base.id, 
FUNC_DEPENDENCY))
+                               msg = createException(SQL, "sql.partition", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                }
                r->l = base;
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to