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