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 -- [email protected]
To unsubscribe send an email to [email protected]