Changeset: 000f20c33802 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/000f20c33802
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_user.c
        sql/backends/monet5/vaults/fits/fits.c
        sql/server/sql_mvc.c
        sql/server/sql_privileges.c
        sql/storage/store.c
        sql/storage/store_dependency.c
Branch: Jul2021
Log Message:

on failed rids_select calls properly handle errors.


diffs (299 lines):

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
@@ -1183,6 +1183,8 @@ alter_table(Client cntxt, mvc *sql, char
                        if (c->null == 0) {
                                const void *nilptr = 
ATOMnilptr(c->type.type->localtype);
                                rids *nils = 
store->table_api.rids_select(sql->session->tr, nc, nilptr, NULL, NULL);
+                               if (!nils)
+                                       throw(SQL,"sql.alter_table", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                int has_nils = 
!is_oid_nil(store->table_api.rids_next(nils));
 
                                store->table_api.rids_destroy(nils);
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
@@ -536,7 +536,8 @@ monet5_schema_user_dependencies(ptr _tra
        /* select all authorization ids */
        A = store->table_api.rids_select(tr, auth_name, NULL, NULL);
        /* join all authorization with the selected users */
-       A = store->table_api.rids_join(tr, A, auth_name, U, users_name);
+       if (A && U)
+               A = store->table_api.rids_join(tr, A, auth_name, U, users_name);
        store->table_api.rids_destroy(U);
        return A;
 }
diff --git a/sql/backends/monet5/vaults/fits/fits.c 
b/sql/backends/monet5/vaults/fits/fits.c
--- a/sql/backends/monet5/vaults/fits/fits.c
+++ b/sql/backends/monet5/vaults/fits/fits.c
@@ -239,6 +239,8 @@ str FITSexportTable(Client cntxt, MalBlk
        col = mvc_bind_column(m, column, "table_id");
 
        rs = store->table_api.rids_select(m->session->tr, col, (void *) fid, 
(void *) fid, NULL);
+       if (!rs)
+               throw(MAL, "fits.exporttable", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        GDKfree(fid);
 
        while ((rid = store->table_api.rids_next(rs)), !is_oid_nil(rid))
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
@@ -114,11 +114,12 @@ mvc_fix_depend(mvc *m, sql_column *depid
        for (int i = 0; i < n; i++) {
                rs = store->table_api.rids_select(m->session->tr, depids,
                                             &v[i].oldid, &v[i].oldid, NULL);
-               while ((rid = store->table_api.rids_next(rs)), 
!is_oid_nil(rid)) {
-                       store->table_api.column_update_value(m->session->tr, 
depids,
-                                                       rid, &v[i].newid);
+               if (rs) {
+                       while ((rid = store->table_api.rids_next(rs)), 
!is_oid_nil(rid)) {
+                               
store->table_api.column_update_value(m->session->tr, depids, rid, &v[i].newid);
+                       }
+                       store->table_api.rids_destroy(rs);
                }
-               store->table_api.rids_destroy(rs);
        }
 }
 
@@ -290,7 +291,7 @@ mvc_init(int debug, store_type store_tpe
 
                for (int i = 0; i < 9; i++) {
                        sql_column *col = NULL;
-                       
+
                        mvc_create_column_(&col, m, t, tview[i].name, 
tview[i].type, tview[i].digits);
                        if (col == NULL) {
                                mvc_destroy(m);
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -271,7 +271,8 @@ sql_delete_priv(mvc *sql, sqlid auth_id,
 
        /* select privileges of this auth_id, privilege, obj_id */
        A = store->table_api.rids_select(tr, priv_auth, &auth_id, &auth_id, 
priv_priv, &privilege, &privilege, priv_obj, &obj_id, &obj_id, NULL );
-
+       if (!A)
+               throw(SQL, "sql.delete_prive", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        /* remove them */
        for(rid = store->table_api.rids_next(A); !is_oid_nil(rid) && log_res == 
LOG_OK; rid = store->table_api.rids_next(A))
                log_res = store->table_api.table_delete(tr, privs, rid);
@@ -440,6 +441,8 @@ sql_drop_role(mvc *m, str auth)
 
        /* select user roles of this role_id */
        A = store->table_api.rids_select(tr, find_sql_column(user_roles, 
"role_id"), &role_id, &role_id, NULL);
+       if (!A)
+               throw(SQL, "sql.drop_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
        /* remove them */
        for(rid = store->table_api.rids_next(A); !is_oid_nil(rid) && log_res == 
LOG_OK; rid = store->table_api.rids_next(A))
                log_res = store->table_api.table_delete(tr, user_roles, rid);
@@ -785,7 +788,7 @@ sql_create_user(mvc *sql, char *user, ch
                throw(SQL,"sql.create_user", SQLSTATE(42M31) "Insufficient 
privileges to create user '%s'", user);
 
        if (backend_find_user(sql, user) >= 0)
-               throw(SQL,"sql.create_user", SQLSTATE(42M31) "CREATE USER: user 
'%s' already exists", user);    
+               throw(SQL,"sql.create_user", SQLSTATE(42M31) "CREATE USER: user 
'%s' already exists", user);
 
        if (!(s = find_sql_schema(sql->session->tr, schema)))
                throw(SQL,"sql.create_user", SQLSTATE(3F000) "CREATE USER: no 
such schema '%s'", schema);
@@ -842,6 +845,8 @@ sql_drop_granted_users(mvc *sql, sqlid u
 
                /* select privileges of this user_id */
                A = store->table_api.rids_select(tr, find_sql_column(privs, 
"auth_id"), &user_id, &user_id, NULL);
+               if (!A)
+                       throw(SQL, "sql.drop_user", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                /* remove them */
                for(rid = store->table_api.rids_next(A); !is_oid_nil(rid) && 
log_res == LOG_OK; rid = store->table_api.rids_next(A))
                        log_res = store->table_api.table_delete(tr, privs, rid);
@@ -851,6 +856,8 @@ sql_drop_granted_users(mvc *sql, sqlid u
 
                /* select privileges granted by this user_id */
                A = store->table_api.rids_select(tr, find_sql_column(privs, 
"grantor"), &user_id, &user_id, NULL);
+               if (!A)
+                       throw(SQL, "sql.drop_user", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                /* remove them */
                for(rid = store->table_api.rids_next(A); !is_oid_nil(rid) && 
log_res == LOG_OK; rid = store->table_api.rids_next(A))
                        log_res = store->table_api.table_delete(tr, privs, rid);
@@ -867,6 +874,8 @@ sql_drop_granted_users(mvc *sql, sqlid u
 
                /* select user roles of this user_id */
                A = store->table_api.rids_select(tr, 
find_sql_column(user_roles, "login_id"), &user_id, &user_id, NULL);
+               if (!A)
+                       throw(SQL, "sql.drop_user", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                /* remove them */
                for(rid = store->table_api.rids_next(A); !is_oid_nil(rid) && 
log_res == LOG_OK; rid = store->table_api.rids_next(A))
                        log_res = store->table_api.table_delete(tr, user_roles, 
rid);
@@ -878,6 +887,8 @@ sql_drop_granted_users(mvc *sql, sqlid u
 
                /* select users created by this user_id */
                A = store->table_api.rids_select(tr, find_sql_column(auths, 
"grantor"), &user_id, &user_id, NULL);
+               if (!A)
+                       throw(SQL, "sql.drop_user", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                /* remove them and continue the deletion */
                for(rid = store->table_api.rids_next(A); !is_oid_nil(rid) && 
log_res == LOG_OK && msg; rid = store->table_api.rids_next(A)) {
                        sqlid nuid = store->table_api.column_find_sqlid(tr, 
find_sql_column(auths, "id"), rid);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -573,6 +573,8 @@ load_range_partition(sql_trans *tr, sql_
        sqlstore *store = tr->store;
 
        rs = store->table_api.rids_select(tr, find_sql_column(ranges, 
"table_id"), &pt->member, &pt->member, NULL);
+       if (!rs)
+               return -1;
        if ((rid = store->table_api.rids_next(rs)) != oid_nil) {
                ptr cbat;
                str v;
@@ -600,6 +602,8 @@ load_value_partition(sql_trans *tr, sql_
        oid rid;
        rids *rs = store->table_api.rids_select(tr, find_sql_column(values, 
"table_id"), &pt->member, &pt->member, NULL);
 
+       if (!rs)
+               return -1;
        vals = SA_LIST(tr->sa, (fdestroy) &part_value_destroy);
        if (!vals) {
                store->table_api.rids_destroy(rs);
@@ -1071,6 +1075,10 @@ load_schema(sql_trans *tr, res_table *rt
        type_schema = find_sql_column(types, "schema_id");
        type_id = find_sql_column(types, "id");
        rs = store->table_api.rids_select(tr, type_schema, &s->base.id, 
&s->base.id, type_id, &tmpid, NULL, NULL);
+       if (!rs) {
+               schema_destroy(store, s);
+               return NULL;
+       }
        for (oid rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)) {
                sql_type *t = load_type(tr, s, rid);
                if (os_add(s->types, tr, t->base.name, &t->base)) {
@@ -1109,11 +1117,20 @@ load_schema(sql_trans *tr, res_table *rt
        func_schema = find_sql_column(funcs, "schema_id");
        func_id = find_sql_column(funcs, "id");
        rs = store->table_api.rids_select(tr, func_schema, &s->base.id, 
&s->base.id, func_id, &tmpid, NULL, NULL);
+       if (!rs) {
+               schema_destroy(store, s);
+               return NULL;
+       }
        if (rs && !store->table_api.rids_empty(rs)) {
                sql_table *args = find_sql_table(tr, syss, "args");
                sql_column *arg_func_id = find_sql_column(args, "func_id");
                sql_column *arg_number = find_sql_column(args, "number");
                subrids *nrs = store->table_api.subrids_create(tr, rs, func_id, 
arg_func_id, arg_number);
+               if (!nrs) {
+                       store->table_api.rids_destroy(rs);
+                       schema_destroy(store, s);
+                       return NULL;
+               }
                sqlid fid;
                sql_func *f;
 
@@ -1132,6 +1149,11 @@ load_schema(sql_trans *tr, res_table *rt
                }
                /* Handle all procedures without arguments (no args) */
                rs = store->table_api.rids_diff(tr, rs, func_id, nrs, 
arg_func_id);
+               if (!rs) {
+                       store->table_api.subrids_destroy(nrs);
+                       schema_destroy(store, s);
+                       return NULL;
+               }
                for (oid rid = store->table_api.rids_next(rs); 
!is_oid_nil(rid); rid = store->table_api.rids_next(rs)) {
                        fid = store->table_api.column_find_sqlid(tr, func_id, 
rid);
                        f = load_func(tr, s, fid, NULL);
@@ -1156,6 +1178,10 @@ load_schema(sql_trans *tr, res_table *rt
        seq_schema = find_sql_column(seqs, "schema_id");
        seq_id = find_sql_column(seqs, "id");
        rs = store->table_api.rids_select(tr, seq_schema, &s->base.id, 
&s->base.id, seq_id, &tmpid, NULL, NULL);
+       if (!rs) {
+               schema_destroy(store, s);
+               return NULL;
+       }
        for (oid rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)) {
                sql_sequence *seq = load_seq(tr, s, rid);
                if (os_add(s->seqs, tr, seq->base.name, &seq->base)) {
@@ -1176,7 +1202,12 @@ load_schema(sql_trans *tr, res_table *rt
                        sql_column *mt_sub = find_sql_column(objects, "sub");
                        rids *rs = store->table_api.rids_select(tr, mt_nr, 
&t->base.id, &t->base.id, NULL);
 
-                       rs = store->table_api.rids_orderby(tr, rs, mt_sub);
+                       if (rs)
+                               rs = store->table_api.rids_orderby(tr, rs, 
mt_sub);
+                       if (!rs) {
+                               schema_destroy(store, s);
+                               return NULL;
+                       }
                        for (oid rid = store->table_api.rids_next(rs); 
!is_oid_nil(rid); rid = store->table_api.rids_next(rs)) {
                                sql_part *pt = load_part(tr, t, rid);
                                if (isRangePartitionTable(t)) {
@@ -4397,6 +4428,8 @@ sys_drop_part(sql_trans *tr, sql_part *p
        } else if (isListPartitionTable(mt)) {
                sql_table *values = find_sql_table(tr, syss, 
"value_partitions");
                rids *rs = store->table_api.rids_select(tr, 
find_sql_column(values, "table_id"), &pt->member, &pt->member, NULL);
+               if (!rs)
+                       return -1;
                for (oid rid = store->table_api.rids_next(rs); 
!is_oid_nil(rid); rid = store->table_api.rids_next(rs)) {
                        if ((res = store->table_api.table_delete(tr, values, 
rid))) {
                                store->table_api.rids_destroy(rs);
@@ -4479,6 +4512,8 @@ sys_drop_table(sql_trans *tr, sql_table 
                sql_table *partitions = find_sql_table(tr, syss, 
"table_partitions");
                sql_column *pcols = find_sql_column(partitions, "table_id");
                rids *rs = store->table_api.rids_select(tr, pcols, &t->base.id, 
&t->base.id, NULL);
+               if (!rs)
+                       return -1;
                oid poid;
                if ((poid = store->table_api.rids_next(rs)) != oid_nil) {
                        if ((res = store->table_api.table_delete(tr, 
partitions, poid))) {
@@ -5247,6 +5282,8 @@ sql_trans_add_value_partition(sql_trans 
                p = (sql_part*) n->data;
 
                rs = store->table_api.rids_select(tr, find_sql_column(values, 
"table_id"), &pt->base.id, &pt->base.id, NULL);
+               if (!rs)
+                       return -1;
                for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); 
rid = store->table_api.rids_next(rs)) {
                        if ((res = store->table_api.table_delete(tr, values, 
rid))) { /* eliminate the old values */
                                store->table_api.rids_destroy(rs);
diff --git a/sql/storage/store_dependency.c b/sql/storage/store_dependency.c
--- a/sql/storage/store_dependency.c
+++ b/sql/storage/store_dependency.c
@@ -63,6 +63,8 @@ sql_trans_drop_dependencies(sql_trans* t
        int log_res = LOG_OK;
 
        rs = store->table_api.rids_select(tr, dep_dep_id, &depend_id, 
&depend_id, NULL);
+       if (!rs)
+               return LOG_ERR;
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid) && log_res 
== LOG_OK; rid = store->table_api.rids_next(rs))
                log_res = store->table_api.table_delete(tr, deps, rid);
        store->table_api.rids_destroy(rs);
@@ -85,6 +87,8 @@ sql_trans_drop_dependency(sql_trans* tr,
        int log_res = LOG_OK;
 
        rs = store->table_api.rids_select(tr, dep_obj_id, &obj_id, &obj_id, 
dep_dep_id, &depend_id, &depend_id, dep_dep_type, &dtype, &dtype, NULL);
+       if (!rs)
+               return LOG_ERR;
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid) && log_res 
== LOG_OK; rid = store->table_api.rids_next(rs))
                log_res = store->table_api.table_delete(tr, deps, rid);
        store->table_api.rids_destroy(rs);
@@ -112,6 +116,8 @@ sql_trans_get_dependencies(sql_trans* tr
        dep_dep_type = find_sql_column(deps, "depend_type");
 
        rs = store->table_api.rids_select(tr, dep_id, &id, &id, NULL);
+       if (!rs)
+               return NULL;
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)){
                if (!(v = store->table_api.column_find_value(tr, dep_dep_id, 
rid))) {
                        list_destroy(dep_list);
@@ -140,6 +146,8 @@ sql_trans_get_dependencies(sql_trans* tr
                depend_type = TRIGGER_DEPENDENCY;
 
                rs = store->table_api.rids_select(tr, table_id, &id, &id, NULL);
+               if (!rs)
+                       return NULL;
                for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); 
rid = store->table_api.rids_next(rs)) {
                        if (!(v = store->table_api.column_find_value(tr, 
tri_id, rid))) {
                                list_destroy(dep_list);
@@ -266,7 +274,8 @@ sql_trans_owner_schema_dependencies(sql_
                return NULL;
 
        rs = store->table_api.rids_select(tr, schema_owner, &owner_id, 
&owner_id, NULL);
-
+       if (!rs)
+               return NULL;
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)) {
                if (!(v = store->table_api.column_find_value(tr, schema_id, 
rid))) {
                        list_destroy(l);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to