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
