Changeset: 8d5eedc9f690 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8d5eedc9f690
Modified Files:
        tools/monetdbe/monetdbe.c
Branch: default
Log Message:

Merge with Jul2021.


diffs (151 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
@@ -1907,26 +1907,26 @@ exp2bin_args(backend *be, sql_exp *e, li
                } else if (e->f) {
                        return exps2bin_args(be, e->f, args);
                } else if (e->r) {
-                       char *nme;
                        sql_var_name *vname = (sql_var_name*) e->r;
+                       const char *nme = sql_escape_ident(sql->sa, 
vname->name);
+                       char *buf = NULL;
 
                        if (vname->sname) { /* Global variable */
-                               nme = SA_NEW_ARRAY(be->mvc->sa, char, 
strlen(vname->sname) + strlen(vname->name) + 5);
-                               if (!nme)
+                               const char *sname = sql_escape_ident(sql->sa, 
vname->sname);
+                               if (!nme || !sname || !(buf = 
SA_NEW_ARRAY(be->mvc->sa, char, strlen(sname) + strlen(nme) + 6)))
                                        return NULL;
-                               stpcpy(stpcpy(stpcpy(stpcpy(nme, "A0%"), 
vname->sname), "%"), vname->name); /* mangle variable name */
+                               stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(buf, "0\""), 
sname), "\"\""), nme), "\""); /* escape variable name */
                        } else { /* Parameter or local variable */
                                char levelstr[16];
                                snprintf(levelstr, sizeof(levelstr), "%u", 
e->flag);
-                               nme = SA_NEW_ARRAY(be->mvc->sa, char, 
strlen(levelstr) + strlen(vname->name) + 3);
-                               if (!nme)
+                               if (!nme || !(buf = SA_NEW_ARRAY(be->mvc->sa, 
char, strlen(levelstr) + strlen(nme) + 3)))
                                        return NULL;
-                               stpcpy(stpcpy(stpcpy(stpcpy(nme, "A"), 
levelstr), "%"), vname->name); /* mangle variable name */
+                               stpcpy(stpcpy(stpcpy(stpcpy(buf, levelstr), 
"\""), nme), "\""); /* escape variable name */
                        }
-                       if (!list_find(args, nme, (fcmp)&alias_cmp)) {
+                       if (!list_find(args, buf, (fcmp)&alias_cmp)) {
                                stmt *s = stmt_var(be, vname->sname, 
vname->name, &e->tpe, 0, 0);
 
-                               s = stmt_alias(be, s, NULL, sa_strdup(sql->sa, 
nme));
+                               s = stmt_alias(be, s, NULL, sa_strdup(sql->sa, 
buf));
                                list_append(args, s);
                        }
                }
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3397,7 +3397,7 @@ clean_predicates_and_propagate_to_parent
 }
 
 static void
-sql_trans_rollback(sql_trans *tr)
+sql_trans_rollback(sql_trans *tr, bool commit_lock)
 {
        sqlstore *store = tr->store;
 
@@ -3418,7 +3418,8 @@ sql_trans_rollback(sql_trans *tr)
                        list_prepend(nl, n->data);
 
                /* rollback */
-               MT_lock_set(&store->commit);
+               if (!commit_lock)
+                       MT_lock_set(&store->commit);
                store_lock(store);
                ulng oldest = store_oldest(store);
                ulng commit_ts = store_get_timestamp(store); /* use most recent 
timestamp such that we can cleanup savely */
@@ -3441,18 +3442,21 @@ sql_trans_rollback(sql_trans *tr)
                                _DELETE(c);
                }
                store_unlock(store);
-               MT_lock_unset(&store->commit);
+               if (!commit_lock)
+                       MT_lock_unset(&store->commit);
                list_destroy(nl);
                list_destroy(tr->changes);
                tr->changes = NULL;
                tr->logchanges = 0;
        } else if (ATOMIC_GET(&store->nr_active) == 1) { /* just me cleanup */
-               MT_lock_set(&store->commit);
+               if (!commit_lock)
+                       MT_lock_set(&store->commit);
                store_lock(store);
                ulng oldest = store_timestamp(store);
                store_pending_changes(store, oldest);
                store_unlock(store);
-               MT_lock_unset(&store->commit);
+               if (!commit_lock)
+                       MT_lock_unset(&store->commit);
        }
        if (tr->localtmps.dset) {
                list_destroy2(tr->localtmps.dset, tr->store);
@@ -3505,7 +3509,7 @@ sql_trans_destroy(sql_trans *tr)
                tr->name = NULL;
        }
        if (!list_empty(tr->changes))
-               sql_trans_rollback(tr);
+               sql_trans_rollback(tr, false);
        sqlstore *store = tr->store;
        store_lock(store);
        cs_destroy(&tr->localtmps, tr->store);
@@ -3705,8 +3709,8 @@ sql_trans_commit(sql_trans *tr)
                if (!tr->parent && !list_empty(tr->predicates)) {
                        ok = sql_trans_valid(tr);
                        if (ok != LOG_OK) {
+                               sql_trans_rollback(tr, true);
                                MT_lock_unset(&store->commit);
-                               sql_trans_rollback(tr);
                                return ok == LOG_CONFLICT ? SQL_CONFLICT : 
SQL_ERR;
                        }
                }
@@ -3714,8 +3718,8 @@ sql_trans_commit(sql_trans *tr)
                if (!tr->parent && (!list_empty(tr->dependencies) || 
!list_empty(tr->depchanges))) {
                        ok = transaction_check_dependencies_and_removals(tr);
                        if (ok != LOG_OK) {
+                               sql_trans_rollback(tr, true);
                                MT_lock_unset(&store->commit);
-                               sql_trans_rollback(tr);
                                return ok == LOG_CONFLICT ? SQL_CONFLICT : 
SQL_ERR;
                        }
                }
@@ -6727,7 +6731,7 @@ sql_trans_end(sql_session *s, int ok)
        if (ok == SQL_OK) {
                ok = sql_trans_commit(s->tr);
        } else if (ok == SQL_ERR) { /* if a conflict happened, it was already 
rollbacked */
-               sql_trans_rollback(s->tr);
+               sql_trans_rollback(s->tr, false);
        }
        assert(s->tr->active);
        s->tr->active = 0;
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -1586,6 +1586,8 @@ monetdbe_bind(monetdbe_statement *stmt, 
                        memcpy(b->data, be->data, len);
                }
                VALset(&stmt_internal->data[i], tpe, b);
+       } else if (tpe == TYPE_str) {
+               VALset(&stmt_internal->data[i], tpe, GDKstrdup(data));
        } else {
                VALset(&stmt_internal->data[i], tpe, data);
        }
@@ -1645,6 +1647,14 @@ monetdbe_cleanup_statement(monetdbe_data
        cq *q = stmt_internal->q;
 
        assert(!stmt_internal->mdbe || mdbe == stmt_internal->mdbe);
+
+       for (size_t i = 0; i < stmt_internal->res.nparam + 1; i++) {
+               ValPtr data = &stmt_internal->data[i];
+               if (data->vtype == TYPE_str || data->vtype == TYPE_blob) {
+                       GDKfree(data->val.pval);
+               }
+       }
+
        GDKfree(stmt_internal->data);
        GDKfree(stmt_internal->args);
        GDKfree(stmt_internal->res.type);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to