Changeset: 1b4addd02c34 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1b4addd02c34
Modified Files:
sql/backends/monet5/sql_scenario.c
Branch: Dec2011
Log Message:
Merged from Aug2011
diffs (299 lines):
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
@@ -1126,13 +1126,20 @@ SQLparser(Client c)
str msg = NULL;
backend *be;
mvc *m;
- int oldvtop,oldstop;
+ int oldvtop, oldstop;
int pstatus = 0;
int err = 0;
be = ((backend *) c->state[MAL_SCENARIO_PARSER]);
if (be == 0) {
- showException(SQL,"sql","SQL state descriptor missing\n");
+ /* tell the client */
+ mnstr_printf(out, "!SQL state descriptor missing, aborting\n");
+ mnstr_flush(out);
+ /* leave a message in the log */
+ fprintf(stderr, "SQL state descriptor missing, cannot handle
client!\n");
+ /* stop here, instead of printing the exception below to the
+ * client in an endless loop */
+ c->mode = FINISHING;
throw(SQL, "SQLparser", "State descriptor missing");
}
oldvtop = c->curprg->def->vtop;
@@ -1140,7 +1147,7 @@ SQLparser(Client c)
be->vtop = oldvtop;
#ifdef _SQL_PARSER_DEBUG
mnstr_printf(GDKout, "#SQL compilation \n");
- printf("debugger? %d(%d)\n", (int)be->mvc->emode, (int)be->mvc->emod);
+ printf("debugger? %d(%d)\n", (int) be->mvc->emode, (int) be->mvc->emod);
#endif
m = be->mvc;
m->type = Q_PARSE;
@@ -1159,81 +1166,99 @@ SQLparser(Client c)
if (be->language == 'X') {
int n = 0, v, off, len;
- if( strncmp(in->buf + in->pos,"export ",7)==0 )
- n = sscanf(in->buf + in->pos+7, "%d %d %d", &v, &off,
&len);
+ if (strncmp(in->buf + in->pos, "export ", 7) == 0)
+ n = sscanf(in->buf + in->pos + 7, "%d %d %d", &v, &off,
&len);
if (n == 2 || n == 3) {
mvc_export_chunk(m, out, v, off, n == 3 ? len :
m->reply_size);
- in->pos = in->len; /* HACK: should use parsed
lenght */
- return NULL;
+ in->pos = in->len; /* HACK: should use parsed length */
+ return MAL_SUCCEED;
}
- if( strncmp(in->buf+in->pos,"close ",6)==0 ){
+ if (strncmp(in->buf + in->pos, "close ", 6) == 0) {
res_table *t;
- v = (int) strtol(in->buf+in->pos+6,NULL,0);
- t = res_tables_find(m->results, v);
+ v = (int) strtol(in->buf + in->pos + 6, NULL, 0);
+ t = res_tables_find(m->results, v);
if (t)
m->results = res_tables_remove(m->results, t);
- in->pos = in->len; /* HACK: should use parsed
lenght */
- return NULL;
+ in->pos = in->len; /* HACK: should use parsed length */
+ return MAL_SUCCEED;
}
- if( strncmp(in->buf+in->pos,"release ", 8)==0 ){
+ if (strncmp(in->buf + in->pos, "release ", 8) == 0) {
cq *q = NULL;
- v = (int) strtol(in->buf+in->pos+ 8,NULL,0);
+ v = (int) strtol(in->buf + in->pos + 8, NULL, 0);
if ((q = qc_find(m->qc, v)) != NULL)
- qc_delete(m->qc, q);
- in->pos = in->len; /* HACK: should use parsed
lenght */
- return NULL;
+ qc_delete(m->qc, q);
+ in->pos = in->len; /* HACK: should use parsed length */
+ return MAL_SUCCEED;
}
- if( strncmp(in->buf+in->pos,"auto_commit ", 12)==0 ){
+ if (strncmp(in->buf + in->pos, "auto_commit ", 12) == 0) {
int commit;
- v= (int) strtol(in->buf+in->pos+12,NULL,10);
+ v = (int) strtol(in->buf + in->pos + 12, NULL, 10);
commit = (!m->session->auto_commit && v);
- m->session->auto_commit = (v)?1:0;
+ m->session->auto_commit = (v) ? 1 : 0;
m->session->ac_on_commit = m->session->auto_commit;
if (m->session->active) {
- if (commit && mvc_commit(m, 0, NULL)< 0)
- throw(SQL, "SQLparser", "Xauto_commit
(commit) failed");
- else if (!commit && mvc_rollback(m, 0, NULL) <
0)
- throw(SQL, "SQLparser", "Xauto_commit
(rollback) failed");
+ 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");
+ }
}
- in->pos = in->len; /* HACK: should use parsed
lenght */
- return NULL;
+ in->pos = in->len; /* HACK: should use parsed length */
+ if (msg != NULL)
+ goto finalize;
+ return MAL_SUCCEED;
}
- if( strncmp(in->buf+in->pos,"reply_size ", 11)==0 ){
- v= (int) strtol(in->buf+in->pos+11,NULL,10);
+ if (strncmp(in->buf + in->pos, "reply_size ", 11) == 0) {
+ v = (int) strtol(in->buf + in->pos + 11, NULL, 10);
m->reply_size = v;
- in->pos = in->len; /* HACK: should use parsed
lenght */
- return NULL;
+ in->pos = in->len; /* HACK: should use parsed length */
+ return MAL_SUCCEED;
}
if (strncmp(in->buf + in->pos, "sizeheader", 10) == 0) {
v = (int) strtol(in->buf + in->pos + 10, NULL, 10);
m->sizeheader = v != 0;
- in->pos = in->len; /* HACK: should use parsed
lenght */
- return NULL;
+ in->pos = in->len; /* HACK: should use parsed length */
+ return MAL_SUCCEED;
}
- if( strncmp(in->buf + in->pos,"quit",4)==0 ) {
+ if (strncmp(in->buf + in->pos, "quit", 4) == 0) {
c->mode = FINISHING;
- return NULL;
+ return MAL_SUCCEED;
}
- throw(SQL, "SQLparser", "Unrecognized X command");
+ 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' ) {
- throw(SQL, "SQLparser", "Unrecognized language prefix");
+ 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;
}
- if ((err = sqlparse(m)) && m->debug&1){
+ if ((err = sqlparse(m)) && m->debug & 1) {
/* switch to different language mode */
- char oldlang= be->language;
- be->language= 'D';
- runMALDebugger(c,c->curprg);
- be->language= oldlang;
+ char oldlang = be->language;
+ be->language = 'D';
+ runMALDebugger(c, c->curprg);
+ be->language = oldlang;
}
- if( err ||
+ if (err ||
/* Only forget old errors on transaction boundaries */
- (mvc_status(m) && m->type != Q_TRANS) || !m->sym) {
+ (mvc_status(m) && m->type != Q_TRANS) || !m->sym) {
if (!err && m->scanner.started) /* repeat old errors, with a
parsed query */
err = mvc_status(m);
if (err) {
@@ -1256,7 +1281,13 @@ SQLparser(Client c)
be->q = qc_find(m->qc, m->sym->data.lval->h->data.i_val);
if (!be->q) {
err = -1;
- sql_error(m, 2, "no prepared statement with the given
id\n");
+ 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;
}
@@ -1267,13 +1298,13 @@ SQLparser(Client c)
SQLsetDebugger(c, m, TRUE);
if (m->emod & mod_trace)
SQLsetTrace(be, c, TRUE);
- if (m->emode != m_explain && !(m->emod & (mod_debug|mod_trace)))
+ if (m->emode != m_explain && !(m->emod & (mod_debug |
mod_trace)))
m->emode = m_inplace;
scanner_query_processed(&(m->scanner));
} else {
stmt *s = sql_symbol2stmt(m, m->sym);
- if (s==0 || (err = mvc_status(m) && m->type != Q_TRANS)) {
+ 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);
@@ -1292,7 +1323,7 @@ SQLparser(Client c)
MalBlkPtr curBlk;
scanner_query_processed(&(m->scanner));
- backend_callinline(be, c, s );
+ backend_callinline(be, c, s);
curBlk = c->curprg->def;
p = newFcnCall(curBlk, "optimizer", "remap");
@@ -1302,22 +1333,22 @@ SQLparser(Client c)
optimizeMALBlock(c, curBlk);
c->curprg->def = curBlk;
- if( m->emode == m_inplace)
+ if (m->emode == m_inplace)
m->emode = m_normal;
} else {
/* generate a factory instantiation */
be->q = qc_insert(m->qc,
- m->sa, /* the allocator */
- m->sym, /* the sql symbol tree */
- m->args, /* the argument list */
- m->argc,
- m->scanner.key ^
m->session->schema->base.id,/* the statement hash key */
- (m->emode == m_prepare)?Q_PREPARE:
- m->type,/* the type of the statement
*/
- sql_escape_str(QUERY(m->scanner)));
+ m->sa, /* the allocator */
+ m->sym, /* the sql symbol tree */
+ m->args, /* the argument list */
+ m->argc,
+ m->scanner.key ^
m->session->schema->base.id, /* the statement hash key */
+ (m->emode == m_prepare) ? Q_PREPARE :
+ m->type, /* the type of the statement
*/
+ sql_escape_str(QUERY(m->scanner)));
scanner_query_processed(&(m->scanner));
be->q->code =
- (backend_code)backend_dumpproc(be, c, be->q, s);
+ (backend_code) backend_dumpproc(be, c, be->q,
s);
be->q->stk = 0;
/* passed over to query cache, used during dumpproc */
@@ -1330,10 +1361,10 @@ SQLparser(Client c)
m->emode = m_inplace;
}
}
- if (be->q){
+ if (be->q) {
if (m->emode == m_prepare)
err = mvc_export_prepare(m, c->fdout, be->q, "");
- else if (m->emode == m_inplace ){
+ else if (m->emode == m_inplace) {
/* everything ready for a fast call */
} else /* call procedure generation (only in cache mode) */
backend_call(be, c, be->q);
@@ -1359,19 +1390,19 @@ SQLparser(Client c)
chkTypes(c->nspace, c->curprg->def, TRUE); /* resolve types */
/* we know more in this case then
- chkProgram(c->nspace, c->curprg->def); */
+ chkProgram(c->nspace, c->curprg->def); */
if (c->curprg->def->errors) {
if (m->emod & mod_debug) {
/* switch to differnt language mode */
- char oldlang= be->language;
- be->language= 'D';
- runMALDebugger(c,c->curprg);
- be->language= oldlang;
+ char oldlang = be->language;
+ be->language = 'D';
+ runMALDebugger(c, c->curprg);
+ be->language = oldlang;
}
showErrors(c);
/* restore the state */
resetMalBlk(c->curprg->def, oldstop);
- freeVariables(c,c->curprg->def, c->glb, oldvtop);
+ freeVariables(c, c->curprg->def, c->glb, oldvtop);
c->curprg->def->errors = 0;
msg = createException(PARSE, "SQLparser", "Semantic
errors");
}
@@ -1381,8 +1412,8 @@ SQLparser(Client c)
* Inspect the variables for post code-generation actions.
*/
finalize:
- if (m->emode == m_explain && be->q && be->q->code)
- printFunction(GDKout, ((Symbol)(be->q->code))->def, 0,
LIST_MAL_STMT | LIST_MAL_UDF | LIST_MAPI);
+ if (m->emode == m_explain && be->q && be->q->code)
+ printFunction(GDKout, ((Symbol) (be->q->code))->def, 0,
LIST_MAL_STMT | LIST_MAL_UDF | LIST_MAPI);
/*
* @-
* Gather the statistics for post analysis. It should preferably
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list