Changeset: e888ba2bc18b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e888ba2bc18b
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/server/rel_semantic.c
        sql/server/sql_mvc.c
        sql/server/sql_qc.c
        sql/server/sql_qc.h
        sql/storage/bat/bat_storage.c
Branch: default
Log Message:

added prepare statement recompilation after errors, this means we don't loose 
the prepared statements anymore..


diffs (228 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1458,7 +1458,7 @@ backend_create_mal_func(mvc *m, sql_func
 }
 
 static int
-backend_create_sql_func_body(backend *be, sql_func *f, list *restypes, list 
*ops, Module mod, char *fimp)
+backend_create_sql_func_body(backend *be, sql_func *f, list *restypes, list 
*ops, Module mod, char *fimp, bool prepare)
 {
        mvc *m = be->mvc;
        Client c = be->client;
@@ -1469,7 +1469,7 @@ backend_create_sql_func_body(backend *be
        sql_func *pf = NULL;
        sql_rel *r;
 
-       r = rel_parse(m, f->s, f->query, m_instantiate);
+       r = rel_parse(m, f->s, f->query, prepare?m_prepare:m_instantiate);
        if (r)
                r = sql_processrelation(m, r, 0, 1, 1, 0);
        if (!r) {
@@ -1478,7 +1478,7 @@ backend_create_sql_func_body(backend *be
 
        backend_reset(be);
 
-       if (f->res) {
+       if (f->res && !prepare) {
                sql_arg *fres = f->res->h->data;
                if (f->type == F_UNION) {
                        curInstr = table_func_create_result(curBlk, curInstr, 
f, restypes);
@@ -1544,7 +1544,7 @@ backend_create_sql_func_body(backend *be
        pf = m->forward;
        m->forward = f;
        be->fimp = fimp; /* for recursive functions keep the generated name */
-       res = backend_dumpstmt(be, curBlk, r, 0, 1, NULL);
+       res = backend_dumpstmt(be, curBlk, r, prepare, 1, NULL);
        m->forward = pf;
        if (res < 0)
                goto cleanup;
@@ -1618,8 +1618,11 @@ backend_create_sql_func(backend *be, sql
        Symbol symbackup = c->curprg;
        backend bebackup = *be;         /* backup current backend */
        exception_buffer ebsave = m->sa->eb;
+       bool prepare = f->imp;
        const char *sql_shared_module = putName(sql_shared_module_name);
-       Module mod = getModule(sql_shared_module);
+       const char *sql_private_module = putName(sql_private_module_name);
+       const char *modname = prepare?sql_private_module:sql_shared_module;
+       Module mod = prepare?c->usermodule:getModule(modname);
        char befname[IDLENGTH];
        int nargs;
        char *fimp;
@@ -1631,7 +1634,7 @@ backend_create_sql_func(backend *be, sql
        (void) snprintf(befname, IDLENGTH, "f_" LLFMT, 
store_function_counter(m->store));
        TRC_INFO(SQL_PARSER, "Mapping SQL name '%s' to MAL name '%s'\n", 
f->base.name, befname);
        nargs = (f->res && f->type == F_UNION ? list_length(f->res) : 1) + 
(f->vararg && ops ? list_length(ops) : f->ops ? list_length(f->ops) : 0);
-       c->curprg = newFunctionArgs(sql_shared_module, putName(befname), 
FUNCTIONsymbol, nargs);
+       c->curprg = newFunctionArgs(modname, putName(befname), FUNCTIONsymbol, 
nargs);
 
        if ((fimp = _STRDUP(befname)) == NULL) {
                sql_error(m, 10, SQLSTATE(HY013) MAL_MALLOC_FAIL);
@@ -1643,7 +1646,7 @@ backend_create_sql_func(backend *be, sql
                sql_error(m, 10, "%s", m->sa->eb.msg);
                freeSymbol(c->curprg);
                goto bailout;
-       } else if (backend_create_sql_func_body(be, f, restypes, ops, mod, 
fimp) < 0) {
+       } else if (backend_create_sql_func_body(be, f, restypes, ops, mod, 
fimp, prepare) < 0) {
                goto bailout;
        }
        *be = bebackup;
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -70,7 +70,7 @@ rel_parse(mvc *m, sql_schema *s, const c
        m->errstr[0] = '\0';
        m->session->status = 0;
        /* via views we give access to protected objects */
-       assert(emode == m_instantiate || emode == m_deps);
+       assert(emode == m_instantiate || emode == m_deps || emode == m_prepare);
        m->user_id = USER_MONETDB;
 
        (void) sqlparse(m);     /* blindly ignore errors */
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
@@ -478,18 +478,8 @@ mvc_trans(mvc *m)
 
        TRC_INFO(SQL_TRANS, "Starting transaction\n");
        res = sql_trans_begin(m->session);
-
-       if (m->qc && (res || err)) {
-               int seqnr = m->qc->id;
-               if (m->qc)
-                       qc_destroy(m->qc);
-               /* TODO Change into recreate all */
-               if (!(m->qc = qc_create(m->pa, m->clientid, seqnr))) {
-                       if (m->session->tr->active)
-                               (void)sql_trans_end(m->session, SQL_ERR);
-                       return -1;
-               }
-       }
+       if (m->qc && (res || err))
+               qc_restart(m->qc);
        return res;
 }
 
diff --git a/sql/server/sql_qc.c b/sql/server/sql_qc.c
--- a/sql/server/sql_qc.c
+++ b/sql/server/sql_qc.c
@@ -39,6 +39,14 @@ cq_delete(int clientid, cq *q)
                sa_destroy(q->sa);
 }
 
+static void
+cq_restart(int clientid, cq *q)
+{
+       if (q->f->imp)
+               backend_freecode(NULL, clientid, q->f->imp);
+       q->f->instantiated = false;
+}
+
 void
 qc_delete(qc *cache, cq *q)
 {
@@ -77,6 +85,16 @@ qc_clean(qc *cache)
 }
 
 void
+qc_restart(qc *cache)
+{
+       if (cache) {
+               for (cq *q = cache->q; q; q = q->next)
+                       cq_restart(cache->clientid, q);
+       }
+}
+
+
+void
 qc_destroy(qc *cache)
 {
        cq *q, *n;
@@ -156,7 +174,7 @@ qc_insert(qc *cache, sql_allocator *sa, 
        *f = (sql_func) {
                .mod = sql_private_module_name,
                .type = F_PROC,
-               .lang = FUNC_LANG_INT,
+               .lang = FUNC_LANG_SQL,
                .query = cmd,
                .ops = params,
                .res = res,
@@ -165,7 +183,7 @@ qc_insert(qc *cache, sql_allocator *sa, 
        f->base.new = 1;
        f->base.id = n->id;
        f->base.name = f->imp = name;
-       f->instantiated = TRUE;
+       f->instantiated = true;
        n->f = f;
        return n;
 }
diff --git a/sql/server/sql_qc.h b/sql/server/sql_qc.h
--- a/sql/server/sql_qc.h
+++ b/sql/server/sql_qc.h
@@ -42,6 +42,7 @@ typedef struct qc {
 
 extern qc *qc_create(sql_allocator *sa, int clientid, int seqnr);
 extern void qc_clean(qc *cache);
+extern void qc_restart(qc *cache);
 extern void qc_destroy(qc *cache);
 sql_export cq *qc_find(qc *cache, int id);
 sql_export cq *qc_insert(qc *cache, sql_allocator *sa, sql_rel *r, symbol *s, 
list *params, mapi_query_t type, char *codedstr, int no_mitosis);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -703,18 +703,6 @@ merge_updates( BAT *ui, BAT **UV, BAT *o
        int err = 0;
        BAT *uv = *UV;
        BUN cnt = BATcount(ui)+BATcount(oi);
-       BAT *ni = bat_new(TYPE_oid, cnt, SYSTRANS);
-       BAT *nv = uv?bat_new(uv->ttype, cnt, SYSTRANS):NULL;
-
-       if (!ni || (uv && !nv)) {
-               bat_destroy(ni);
-               bat_destroy(nv);
-               bat_destroy(ui);
-               bat_destroy(uv);
-               bat_destroy(oi);
-               bat_destroy(ov);
-               return NULL;
-       }
        BATiter uvi;
        BATiter ovi;
 
@@ -736,6 +724,35 @@ merge_updates( BAT *ui, BAT **UV, BAT *o
                uipt = uii.base;
        if (!BATtdensebi(&oii))
                oipt = oii.base;
+
+       if (uiseqb == oiseqb && uie == oie) { /* full overlap, no values */
+               if (uv) {
+                       bat_iterator_end(&uvi);
+                       bat_iterator_end(&ovi);
+               }
+               bat_iterator_end(&uii);
+               bat_iterator_end(&oii);
+               if (uv) {
+                       *UV = uv;
+               } else {
+                       bat_destroy(uv);
+               }
+               bat_destroy(oi);
+               bat_destroy(ov);
+               return ui;
+       }
+       BAT *ni = bat_new(TYPE_oid, cnt, SYSTRANS);
+       BAT *nv = uv?bat_new(uv->ttype, cnt, SYSTRANS):NULL;
+
+       if (!ni || (uv && !nv)) {
+               bat_destroy(ni);
+               bat_destroy(nv);
+               bat_destroy(ui);
+               bat_destroy(uv);
+               bat_destroy(oi);
+               bat_destroy(ov);
+               return NULL;
+       }
        while (uip < uie && oip < oie && !err) {
                oid uiid = (uipt)?uipt[uip]: uiseqb+uip;
                oid oiid = (oipt)?oipt[oip]: oiseqb+oip;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to