Changeset: 20996cf6e55e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=20996cf6e55e
Modified Files:
        sql/backends/monet5/sql_scenario.c
        sql/server/sql_mvc.c
Branch: Dec2011
Log Message:

Merged from Aug2011


diffs (120 lines):

diff --git a/sql/ChangeLog.Aug2011 b/sql/ChangeLog.Aug2011
--- a/sql/ChangeLog.Aug2011
+++ b/sql/ChangeLog.Aug2011
@@ -1,3 +1,7 @@
 # ChangeLog file for sql
 # This file is updated with Maddlog
 
+* Wed Oct 26 2011 Fabian Groffen <[email protected]>
+- Added a fix for bug #2834, which caused weird (failing) behaviour
+  with PreparedStatements.
+
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
@@ -1204,13 +1204,11 @@ SQLparser(Client c)
                                if (commit && mvc_commit(m, 0, NULL) < 0) {
                                        mnstr_printf(out, "!COMMIT: commit 
failed while "
                                                        "enabling 
auto_commit\n");
-                                       mnstr_flush(out);
                                        msg = createException(SQL, "SQLparser",
                                                        "Xauto_commit (commit) 
failed");
                                } else if (!commit && mvc_rollback(m, 0, NULL) 
< 0) {
                                        mnstr_printf(out, "!COMMIT: rollback 
failed while "
                                                        "disabling 
auto_commit\n");
-                                       mnstr_flush(out);
                                        msg = createException(SQL, "SQLparser",
                                                        "Xauto_commit 
(rollback) failed");
                                }
@@ -1237,13 +1235,11 @@ SQLparser(Client c)
                        return MAL_SUCCEED;
                }
                mnstr_printf(out, "!unrecognized X command: %s\n", in->buf + 
in->pos);
-               mnstr_flush(out);
                msg = createException(SQL, "SQLparser", "unrecognized X 
command");
                goto finalize;
        }
        if (be->language != 'S') {
                mnstr_printf(out, "!unrecognized language prefix: %ci\n", 
be->language);
-               mnstr_flush(out);
                msg = createException(SQL, "SQLparser",
                                "unrecognized language prefix: %c", 
be->language);
                goto finalize;
@@ -1283,13 +1279,23 @@ SQLparser(Client c)
                        err = -1;
                        mnstr_printf(out, "!EXEC: no prepared statement with 
id: %d\n",
                                        m->sym->data.lval->h->data.i_val);
-                       mnstr_flush(out);
                        msg = createException(SQL, "PREPARE",
                                        "no prepared statement with id: %d",
                                        m->sym->data.lval->h->data.i_val);
                        handle_error(m, c->fdout, pstatus);
                        sqlcleanup(m, err);
                        goto finalize;
+               } else if (be->q->type != Q_PREPARE) {
+                       err = -1;
+                       mnstr_printf(out, "!EXEC: given handle id is not for a "
+                                       "prepared statement: %d\n",
+                                       m->sym->data.lval->h->data.i_val);
+                       msg = createException(SQL, "PREPARE",
+                                       "is not a prepared statement: %d",
+                                       m->sym->data.lval->h->data.i_val);
+                       handle_error(m, c->fdout, pstatus);
+                       sqlcleanup(m, err);
+                       goto finalize;
                }
                m->emode = m_inplace;
                scanner_query_processed(&(m->scanner));
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
@@ -164,9 +164,10 @@ mvc_trans(mvc *m)
        schema_changed = sql_trans_begin(m->session);
        if (m->qc && (schema_changed || m->qc->nr > 20000 || err)){
                if (schema_changed || err) {
+                       int seqnr = m->qc->id;
                        if (m->qc)
                                qc_destroy(m->qc);
-                       m->qc = qc_create(m->clientid);
+                       m->qc = qc_create(m->clientid, seqnr);
                } else { /* clean all but the prepared statements */
                        qc_clean(m->qc);
                }
@@ -379,7 +380,7 @@ mvc_create(int clientid, backend_stack s
        /* if an error exceeds the buffer we don't want garbage at the end */
        m->errstr[ERRSIZE-1] = '\0';
 
-       m->qc = qc_create(clientid);
+       m->qc = qc_create(clientid, 0);
        m->sa = sa_create();
 
        m->params = NULL;
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
@@ -54,11 +54,11 @@
 #include "sql_atom.h"
 
 qc *
-qc_create(int clientid)
+qc_create(int clientid, int seqnr)
 {
        qc *r = NEW(qc);
        r->clientid = clientid;
-       r->id = 0;
+       r->id = seqnr;
        r->nr = 0;
 
        r->q = NULL;
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
@@ -48,7 +48,7 @@ typedef struct qc {
        cq *q;
 } qc;
 
-extern qc *qc_create(int clientid);
+extern qc *qc_create(int clientid, int seqnr);
 extern void qc_destroy(qc *cache);
 extern void qc_clean(qc *cache);
 extern cq *qc_find(qc *cache, int id);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to