Update of /cvsroot/monetdb/sql/src/backends/monet5
In directory
sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22885/src/backends/monet5
Modified Files:
sql.mx sql_gencode.mx sql_scenario.mx
Log Message:
transactions are now first only parsed, and then executed via mal.
Index: sql_scenario.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_scenario.mx,v
retrieving revision 1.368
retrieving revision 1.369
diff -u -d -r1.368 -r1.369
--- sql_scenario.mx 1 Dec 2009 14:32:41 -0000 1.368
+++ sql_scenario.mx 13 Dec 2009 20:33:15 -0000 1.369
@@ -758,6 +758,7 @@
#endif
language = be->language; /* 'S' for SQL, 'D' from debugger */
m = be->mvc;
+ m->errstr[0] = 0;
@-
Continue processing any left-over input from the previous round.
@c
@@ -1150,7 +1151,7 @@
s = sql_symbol2stmt(m, m->sym);
- if (s==0 || (err = mvc_status(m))) {
+ if (s==0 || (err = mvc_status(m) && m->type != Q_TRANS)) {
msg = createException(PARSE, "SQLparser", "%s",
m->errstr);
handle_error(m, c->fdout, pstatus);
sqlcleanup(m, err);
@@ -1164,7 +1165,7 @@
SQLsetTrace(be, c, TRUE);
if (m->emod & mod_debug)
SQLsetDebugger(c, m, TRUE);
- if ((m->emode != m_inplace && m->emode != m_prepare &&
!m->cache && m->emode != m_explain) || s->type == st_none) {
+ if ((m->emode != m_inplace && m->emode != m_prepare &&
!m->cache && m->emode != m_explain) || s->type == st_none || m->type ==
Q_TRANS) {
scanner_query_processed(&(m->scanner));
backend_callinline(be, c, s );
if( m->emode == m_inplace)
Index: sql_gencode.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_gencode.mx,v
retrieving revision 1.345
retrieving revision 1.346
diff -u -d -r1.345 -r1.346
--- sql_gencode.mx 2 Dec 2009 13:05:56 -0000 1.345
+++ sql_gencode.mx 13 Dec 2009 20:33:15 -0000 1.346
@@ -1614,6 +1614,22 @@
s->nr = getDestVar(q);
break;
}
+ case st_trans:{
+ int l,r = -1;
+
+ l = _dumpstmt(sql, mb, s->op1.stval);
+ if (s->op2.stval)
+ r = _dumpstmt(sql, mb, s->op2.stval);
+ q = newStmt1(mb, sqlRef, "trans");
+ q = pushInt(mb, q, s->flag);
+ q = pushArgument(mb, q, l);
+ if (r > 0)
+ q = pushArgument(mb, q, r);
+ else
+ q = pushNil(mb, q, TYPE_str);
+ s->nr = getDestVar(q);
+ break;
+ }
case st_alias:
s->nr = _dumpstmt(sql, mb, s->op1.stval);
break;
Index: sql.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql.mx,v
retrieving revision 1.370
retrieving revision 1.371
diff -u -d -r1.370 -r1.371
--- sql.mx 2 Dec 2009 09:33:03 -0000 1.370
+++ sql.mx 13 Dec 2009 20:33:15 -0000 1.371
@@ -40,15 +40,9 @@
address SQLinitEnvironment
comment "Initialize the environment for MAL";
-pattern transaction():void
+pattern trans(type:int,chain:int,name:str):void
address SQLtransaction
-comment "Start a transaction";
-pattern commit():void
-address SQLcommit
-comment "Commit the transaction";
-pattern rollback():void
-address SQLrollback
-comment "Abort the transaction";
+comment "a transaction statement (type can be commit,release,rollback or
start)";
pattern eval(cmd:str):void
address SQLstatement
@@ -967,8 +961,6 @@
extern BAT *mvc_bind_idxbat(mvc *m, char *sname, char *tname, char *iname, int
access);
sql5_export str SQLtransaction(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
-sql5_export str SQLcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
-sql5_export str SQLrollback(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str mvc_append_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
@@ -1352,42 +1344,66 @@
str
SQLtransaction(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
- mvc *m = NULL;
- str msg = getContext(cntxt,mb, &m, NULL);
-
- (void) cntxt;
- (void) stk;
- (void) pci;
- if (msg)
- return msg;
- mvc_trans(m);
- return MAL_SUCCEED;
-}
-
-str
-SQLcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
- mvc *m = NULL;
- str msg = getContext(cntxt,mb, &m, NULL);
- int *ret = (int *) getArgReference(stk, pci, 0);
+ mvc *sql = NULL;
+ str msg = getContext(cntxt, mb, &sql, NULL);
+ int type = *(int*) getArgReference(stk, pci, 1);
+ int chain = *(int*) getArgReference(stk, pci, 2);
+ str name = *(str*) getArgReference(stk, pci, 3);
+ char buf[BUFSIZ];
+ int ret = 0;
if (msg)
return msg;
- *ret = 0;
- mvc_commit(m, 0, NULL); /* keep the changes */
- return MAL_SUCCEED;
-}
-str
-SQLrollback(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
- mvc *m=NULL;
- str msg = getContext(cntxt,mb, &m, NULL);
- int *ret = (int *) getArgReference(stk, pci, 0);
+ if (name && strcmp(name, str_nil) == 0)
+ name = NULL;
- if (msg)
- return msg;
- *ret = 0;
- mvc_rollback(m, 0, NULL); /* keep the changes */
+ switch (type) {
+ case DDL_RELEASE:
+ if (sql->session->auto_commit == 1)
+ throw(SQL, "sql.trans", "RELEASE SAVEPOINT: not allowed
in auto commit mode");
+ ret = mvc_release(sql, name);
+ if (ret < 0) {
+ snprintf(buf, BUFSIZ, "RELEASE SAVEPOINT: (%s) failed",
name);
+ throw(SQL, "sql.trans", buf);
+ }
+ break;
+ case DDL_COMMIT:
+ if (sql->session->auto_commit == 1) {
+ if (name)
+ throw(SQL,"sql.trans", "SAVEPOINT: not allowed
in auto commit mode");
+ else
+ throw(SQL,"sql.trans", "COMMIT: not allowed in
auto commit mode");
+ }
+ ret = mvc_commit(sql, chain, name);
+ if (ret < 0 && !name)
+ throw(SQL, "sql.trans", "COMMIT: failed");
+ if (ret < 0 && name) {
+ snprintf(buf, BUFSIZ, "SAVEPOINT: (%s) failed", name);
+ throw(SQL, "sql.trans", buf);
+ }
+ break;
+ case DDL_ROLLBACK:
+ if (sql->session->auto_commit == 1)
+ throw(SQL, "sql.trans", "ROLLBACK: not allowed in auto
commit mode");
+ ret = mvc_rollback(sql, chain, name);
+ if (ret < 0 && name) {
+ snprintf(buf, BUFSIZ, "ROLLBACK TO SAVEPOINT: (%s)
failed", name);
+ throw(SQL, "sql.trans", buf);
+ }
+ break;
+ case DDL_TRANS:
+ if (sql->session->auto_commit == 0)
+ throw(SQL, "sql.trans", "START TRANSACTION: cannot
start a transaction within a transaction");
+ if (sql->session->active)
+ mvc_rollback(sql, 0, NULL);
+ sql->session->auto_commit = 0;
+ sql->session->ac_on_commit = 1;
+ sql->session->level = chain;
+ (void) mvc_trans(sql);
+ break;
+ default:
+ throw(SQL, "sql.trans", "transaction unknown type");
+ }
return MAL_SUCCEED;
}
------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins