Changeset: cd5fce670755 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cd5fce670755
Modified Files:
        monetdb5/modules/mal/batExtensions.c
        sql/backends/monet5/sql.c
Branch: default
Log Message:

Some defensive lines for non persisted tables and allocation checks


diffs (85 lines):

diff --git a/monetdb5/modules/mal/batExtensions.c 
b/monetdb5/modules/mal/batExtensions.c
--- a/monetdb5/modules/mal/batExtensions.c
+++ b/monetdb5/modules/mal/batExtensions.c
@@ -289,8 +289,10 @@ CMDBATvacuum(bat *r, const bat *bid)
 
        if ((b = BATdescriptor(*bid)) == NULL)
                throw(MAL, "bat.vacuum", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
-       if ((bn = COLcopy(b, b->ttype, true, b->batRole)) == NULL)
+       if ((bn = COLcopy(b, b->ttype, true, b->batRole)) == NULL) {
+               BBPunfix(b->batCacheid);
                throw(MAL, "bat.vacuum", GDK_EXCEPTION);
+       }
 
        BBPkeepref(*r = bn->batCacheid);
        BBPunfix(b->batCacheid);
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
@@ -5078,10 +5078,13 @@ SQLstr_column_vacuum(Client cntxt, MalBl
        sql_table *t = NULL;
        sql_column *c = NULL;
 
-       if((s = mvc_bind_schema(m, sname)) == NULL)
+       if ((s = mvc_bind_schema(m, sname)) == NULL)
                throw(SQL, "sql.str_column_vacuum", SQLSTATE(3F000) "Invalid or 
missing schema %s",sname);
-       if((t = mvc_bind_table(m, s, tname)) == NULL)
+       if ((t = mvc_bind_table(m, s, tname)) == NULL)
                throw(SQL, "sql.str_column_vacuum", SQLSTATE(42S02) "Invalid or 
missing table %s.%s",sname,tname);
+       if (!isTable(t))
+               throw(SQL, "sql.str_column_vacuum", SQLSTATE(42000) "%s '%s' is 
not persistent",
+                         TABLE_TYPE_DESCRIPTION(t->type, t->properties), 
t->base.name);
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
                throw(SQL, "sql.str_column_vacuum", SQLSTATE(42S22) "Column not 
found %s.%s",sname,tname);
 
@@ -5171,6 +5174,7 @@ SQLstr_column_auto_vacuum(Client cntxt, 
        char *tname = *getArgReference_str(stk, pci, 2);
        char *cname = *getArgReference_str(stk, pci, 3);
        int interval = *getArgReference_int(stk, pci, 4); // in sec
+       char *sname_copy = NULL, *tname_copy = NULL, *cname_copy = NULL;
 
        if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
                return msg;
@@ -5181,14 +5185,23 @@ SQLstr_column_auto_vacuum(Client cntxt, 
        sql_table *t = NULL;
        sql_column *c = NULL;
 
-       if((s = mvc_bind_schema(m, sname)) == NULL)
+       if ((s = mvc_bind_schema(m, sname)) == NULL)
                throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(3F000) 
"Invalid or missing schema %s",sname);
-       if((t = mvc_bind_table(m, s, tname)) == NULL)
+       if ((t = mvc_bind_table(m, s, tname)) == NULL)
                throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S02) 
"Invalid or missing table %s.%s",sname,tname);
+       if (!isTable(t))
+               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) "%s 
'%s' is not persistent",
+                         TABLE_TYPE_DESCRIPTION(t->type, t->properties), 
t->base.name);
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
                throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S22) 
"Column not found %s.%s",sname,tname);
 
-       void *argv[4] = {m->store, GDKstrdup(sname), GDKstrdup(tname), 
GDKstrdup(cname)};
+       if (!(sname_copy = GDKstrdup(sname)) || !(tname_copy = 
GDKstrdup(tname)) || !(cname_copy = GDKstrdup(cname))) {
+               GDKfree(sname_copy);
+               GDKfree(tname_copy);
+               GDKfree(cname_copy);
+               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       }
+       void *argv[4] = {m->store, sname_copy, tname_copy, cname_copy};
 
        gdk_return res;
        if((res = gdk_add_callback("str_column_vacuum", 
str_column_vacuum_callback, 4, argv, interval)) != GDK_SUCCEED) {
@@ -5217,10 +5230,13 @@ SQLstr_column_stop_vacuum(Client cntxt, 
        sql_table *t = NULL;
        sql_column *c = NULL;
 
-       if((s = mvc_bind_schema(m, sname)) == NULL)
+       if ((s = mvc_bind_schema(m, sname)) == NULL)
                throw(SQL, "sql.str_column_stop_vacuum", SQLSTATE(3F000) 
"Invalid or missing schema %s",sname);
-       if((t = mvc_bind_table(m, s, tname)) == NULL)
+       if ((t = mvc_bind_table(m, s, tname)) == NULL)
                throw(SQL, "sql.str_column_stop_vacuum", SQLSTATE(42S02) 
"Invalid or missing table %s.%s",sname,tname);
+       if (!isTable(t))
+               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) "%s 
'%s' is not persistent",
+                         TABLE_TYPE_DESCRIPTION(t->type, t->properties), 
t->base.name);
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
                throw(SQL, "sql.str_column_stop_vacuum", SQLSTATE(42S22) 
"Column not found %s.%s",sname,tname);
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to