Changeset: 6c9085d2766d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6c9085d2766d
Modified Files:
        sql/backends/monet5/sql_user.c
        sql/storage/store.c
Branch: Jul2021
Log Message:

Don't pass backend bat heap pointer, because if the sql allocator malloc fails, 
it will jump, thus leaking the bat descriptor. Prefer the old way to minimize 
the leak


diffs (89 lines):

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
@@ -561,9 +561,8 @@ monet5_user_get_def_schema(mvc *m, int u
        sql_table *user_info = NULL;
        sql_table *schemas = NULL;
        sql_table *auths = NULL;
-       str username = NULL;
+       str username = NULL, sname = NULL;
        sqlstore *store = m->session->tr->store;
-       ptr cbat;
 
        sys = find_sql_schema(m->session->tr, "sys");
        auths = find_sql_table(m->session->tr, sys, "auths");
@@ -573,9 +572,10 @@ monet5_user_get_def_schema(mvc *m, int u
        rid = store->table_api.column_find_row(m->session->tr, 
find_sql_column(auths, "id"), &user, NULL);
        if (is_oid_nil(rid))
                return -2;
-       username = store->table_api.column_find_string_start(m->session->tr, 
find_sql_column(auths, "name"), rid, &cbat);
+       if (!(username = store->table_api.column_find_value(m->session->tr, 
find_sql_column(auths, "name"), rid)))
+               return -1;
        rid = store->table_api.column_find_row(m->session->tr, 
find_sql_column(user_info, "name"), username, NULL);
-       store->table_api.column_find_string_end(cbat);
+       _DELETE(username);
 
        if (!is_oid_nil(rid))
                schema_id = store->table_api.column_find_sqlid(m->session->tr, 
find_sql_column(user_info, "default_schema"), rid);
@@ -585,12 +585,11 @@ monet5_user_get_def_schema(mvc *m, int u
        if (is_oid_nil(rid))
                return -3;
 
-       str sname = store->table_api.column_find_string_start(m->session->tr, 
find_sql_column(schemas, "name"), rid, &cbat);
+       if (!(sname = store->table_api.column_find_value(m->session->tr, 
find_sql_column(schemas, "name"), rid)))
+               return -1;
        *schema = sa_strdup(m->session->sa, sname);
-       store->table_api.column_find_string_end(cbat);
-       if (!*schema)
-               return -1;
-       return 0;
+       _DELETE(sname);
+       return *schema ? 0 : -1;
 }
 
 int
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -983,7 +983,6 @@ sql_trans_update_schema(sql_trans *tr, o
        sql_table *ss = find_sql_table(tr, syss, "schemas");
        sqlid sid;
        str v;
-       ptr cbat;
 
        sid = store->table_api.column_find_sqlid(tr, find_sql_column(ss, "id"), 
rid);
        s = find_sql_schema_id(tr, sid);
@@ -994,9 +993,9 @@ sql_trans_update_schema(sql_trans *tr, o
        TRC_DEBUG(SQL_STORE, "Update schema: %s %d\n", s->base.name, 
s->base.id);
 
        _DELETE(s->base.name);
-       v = store->table_api.column_find_string_start(tr, find_sql_column(ss, 
"name"), rid, &cbat);
+       v = store->table_api.column_find_value(tr, find_sql_column(ss, "name"), 
rid);
        base_init(tr->sa, &s->base, sid, 0, v);
-       store->table_api.column_find_string_end(cbat);
+       _DELETE(v);
        s->auth_id = store->table_api.column_find_sqlid(tr, find_sql_column(ss, 
"authorization"), rid);
        s->system = (bit) store->table_api.column_find_bte(tr, 
find_sql_column(ss, "system"), rid);
        s->owner = store->table_api.column_find_sqlid(tr, find_sql_column(ss, 
"owner"), rid);
@@ -5975,17 +5974,16 @@ sql_trans_ranges( sql_trans *tr, sql_col
                        sql_column *stats_column_id = find_sql_column(stats, 
"column_id");
                        oid rid = store->table_api.column_find_row(tr, 
stats_column_id, &col->base.id, NULL);
                        if (!is_oid_nil(rid)) {
-                               ptr cbat;
                                char *v;
                                sql_column *stats_min = find_sql_column(stats, 
"minval");
                                sql_column *stats_max = find_sql_column(stats, 
"maxval");
 
-                               v = 
store->table_api.column_find_string_start(tr, stats_min, rid, &cbat);
+                               v = store->table_api.column_find_value(tr, 
stats_min, rid);
                                *min = col->min = SA_STRDUP(tr->sa, v);
-                               store->table_api.column_find_string_end(cbat);
-                               v = 
store->table_api.column_find_string_start(tr, stats_max, rid, &cbat);
+                               _DELETE(v);
+                               v = store->table_api.column_find_value(tr, 
stats_max, rid);
                                *max = col->max = SA_STRDUP(tr->sa, v);
-                               store->table_api.column_find_string_end(cbat);
+                               _DELETE(v);
                                return 1;
                        }
                }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to