Changeset: cb93c474b50e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cb93c474b50e
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_scenario.c
Branch: triggers
Log Message:

clean up in case of failure


diffs (114 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -3011,7 +3011,8 @@ mvc_export_operation_wrap(Client cntxt, 
        if ((msg = checkSQLContext(cntxt)) != NULL)
                return msg;
        b = cntxt->sqlcontext;
-       ok = mvc_export_operation(b, b->out, "", cntxt->qryctx.starttime, 
mb->optimize);
+       if (b->out)
+               ok = mvc_export_operation(b, b->out, "", 
cntxt->qryctx.starttime, mb->optimize);
        cntxt->qryctx.starttime = 0;
        mb->optimize = 0;
        if (ok < 0)
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -232,7 +232,7 @@ SQLepilogue(void *ret)
 static str
 SQLexecPostLoginTriggers(Client c)
 {
-       char *msg = NULL;
+       str msg = MAL_SUCCEED;
        backend *be = (backend *) c->sqlcontext;
        if (be) {
                mvc *m = be->mvc;
@@ -248,6 +248,11 @@ SQLexecPostLoginTriggers(Client c)
                                if (t->event == LOGIN_EVENT) {
                                        const char *stmt = t->statement;
                                        sql_rel *r = NULL;
+                                       // cache state
+                                       int oldvtop = c->curprg->def->vtop;
+                                       int oldstop = c->curprg->def->stop;
+                                       int oldvid = c->curprg->def->vid;
+                                       Symbol curprg = c->curprg;
                                        sql_allocator *sa = m->sa;
 
                                        if (!(m->sa = sa_create(m->pa))) {
@@ -257,47 +262,46 @@ SQLexecPostLoginTriggers(Client c)
                                        r = rel_parse(m, sys, stmt, m_deps);
                                        if (r)
                                                r = sql_processrelation(m, r, 
0, 0, 0, 0);
-                                       if (backend_dumpstmt(be, 
c->curprg->def, r, 1, 1, NULL) < 0)
-                                               throw(SQL, 
"sql.SQLexecPostLoginTriggers", SQLSTATE(4200) "%s", "generating MAL failed");
-
-                                       if ((msg = SQLrun(c,m)) != MAL_SUCCEED)
-                                               return msg;
-
-                                       sa_destroy(m->sa);
-                                       m->sa = sa;
                                        if (!r) {
+                                               sa_destroy(m->sa);
+                                               m->sa = sa;
                                                if (strlen(m->errstr) > 6 && 
m->errstr[5] == '!')
                                                        throw(SQL, 
"sql.SQLexecPostLoginTriggers", "%s", m->errstr);
                                                else
                                                        throw(SQL, 
"sql.SQLexecPostLoginTriggers", SQLSTATE(42000) "%s", m->errstr);
                                        }
 
-
+                                       setVarType(c->curprg->def, 0, 0);
+                                       if (backend_dumpstmt(be, 
c->curprg->def, r, 1, 1, NULL) < 0) {
+                                               freeVariables(c, 
c->curprg->def, NULL, oldvtop, oldvid);
+                                               c->curprg = curprg;
+                                               sa_destroy(m->sa);
+                                               m->sa = sa;
+                                               throw(SQL, 
"sql.SQLexecPostLoginTriggers", SQLSTATE(4200) "%s", "generating MAL failed");
+                                       }
 
-                                       //if ((err = SQLstatementIntern(c, 
stmt, "sql.SQLexecPostLoginTriggers", TRUE, FALSE, NULL))) {
-                                       //      (void) sql_error(m, 02, 
SQLSTATE(42000) "%s", err);
-                                       //      freeException(err);
-                                       //      res = LOG_ERR;
-                                       //      break;
-                                       //}
+                                       stream *out = be->out;
+                                       be->out = NULL; /* no output stream */
+                                       if ((msg = SQLrun(c,m)) != MAL_SUCCEED) 
{
+                                               be->out = out;
+                                               freeVariables(c, 
c->curprg->def, NULL, oldvtop, oldvid);
+                                               sqlcleanup(be, 0);
+                                               c->curprg = curprg;
+                                               sa_destroy(m->sa);
+                                               m->sa = sa;
+                                               return msg;
+                                       }
+                                       // restore previous state
+                                       be->out = out;
+                                       MSresetInstructions(c->curprg->def, 
oldstop);
+                                       freeVariables(c, c->curprg->def, NULL, 
oldvtop, oldvid);
+                                       sqlcleanup(be, 0);
+                                       c->curprg = curprg;
+                                       sa_destroy(m->sa);
+                                       m->sa = sa;
                                }
                        }
 
-                       //sql_table *triggers = find_sys_table(tr, 
TRIGGERS_TABLE_NAME);
-                       //sql_column *eventCol = find_sql_column(triggers, 
"event");
-                       //sql_column *timeCol = find_sql_column(triggers, 
"time");
-                       //sql_column *stmtCol = find_sql_column(triggers, 
"statement");
-                       //int event = LOGIN_EVENT, time = 1;
-
-                       //oid rid = store->table_api.column_find_row(tr, 
eventCol, &event, timeCol, &time, NULL);
-                       //if (!is_oid_nil(rid)) {
-                       //      const char *stmt = 
store->table_api.column_find_value(tr, stmtCol, rid);
-                       //      if ((err = SQLstatementIntern(c, stmt, 
"sql.init", TRUE, FALSE, NULL))) {
-                       //              (void) sql_error(m, 02, SQLSTATE(42000) 
"%s", err);
-                       //              freeException(err);
-                       //              res = LOG_ERR;
-                       //      }
-                       //}
                        if (!active)
                                sql_trans_end(m->session, SQL_OK);
                }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to