str QOTshowFlowGraph(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { str fname; str modnme; str fcnnme; Symbol s = NULL; (void) cntxt; if (stk != 0) { modnme = *getArgReference_str(stk, p, 1); fcnnme = *getArgReference_str(stk, p, 2); fname = *getArgReference_str(stk, p, 3); } else { modnme = getArgDefault(mb, p, 1); fcnnme = getArgDefault(mb, p, 2); fname = getArgDefault(mb, p, 3); } s = findSymbol(cntxt->nspace,putName(modnme, strlen(modnme)), putName(fcnnme, strlen(fcnnme))); if (s == NULL) { char buf[1024]; snprintf(buf,1024, "%s.%s", modnme, fcnnme); throw(MAL, "optimizer.showFlowGraph", RUNTIME_OBJECT_UNDEFINED ":%s", buf); } showFlowGraph(s->def, stk, fname); return MAL_SUCCEED; }
str MDBshowFlowGraph(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { str fname; str modnme; str fcnnme; Symbol s = NULL; (void)cntxt; if (stk != 0) { if (p->argc == 2) { modnme = fcnnme = NULL; fname = *getArgReference_str(stk, p, 1); } else { modnme = *getArgReference_str(stk, p, 1); fcnnme = *getArgReference_str(stk, p, 2); fname = *getArgReference_str(stk, p, 3); } } else { modnme = getArgDefault(mb, p, 1); fcnnme = getArgDefault(mb, p, 2); fname = getArgDefault(mb, p, 3); } if (modnme != NULL) { s = findSymbol(cntxt->nspace, putName(modnme), putName(fcnnme)); if (s == NULL) { char buf[1024]; snprintf(buf,1024, "Could not find %s.%s\n", modnme, fcnnme); throw(MAL, "mdb.dot", "%s", buf); } showFlowGraph(s->def, stk, fname); } else { showFlowGraph(mb, stk, fname); } return MAL_SUCCEED; }
str SQLengineIntern(Client c, backend *be) { str msg = MAL_SUCCEED; MalStkPtr oldglb = c->glb; char oldlang = be->language; mvc *m = be->mvc; InstrPtr p; MalBlkPtr mb; if (oldlang == 'X') { /* return directly from X-commands */ sqlcleanup(be->mvc, 0); return MAL_SUCCEED; } if (m->emod & mod_explain) { if (be->q && be->q->code) printFunction(c->fdout, ((Symbol) (be->q->code))->def, 0, LIST_MAL_NAME | LIST_MAL_VALUE | LIST_MAL_MAPI); else if (be->q) msg = createException(PARSE, "SQLparser", "%s", (*m->errstr) ? m->errstr : "39000!program contains errors"); else if (c->curprg->def) printFunction(c->fdout, c->curprg->def, 0, LIST_MAL_NAME | LIST_MAL_VALUE | LIST_MAL_MAPI); goto cleanup_engine; } if (m->emod & mod_dot) { if (be->q && be->q->code) showFlowGraph(((Symbol) (be->q->code))->def, 0, "stdout-mapi"); else if (be->q) msg = createException(PARSE, "SQLparser", "%s", (*m->errstr) ? m->errstr : "39000!program contains errors"); else if (c->curprg->def) showFlowGraph(c->curprg->def, 0, "stdout-mapi"); goto cleanup_engine; } #ifdef SQL_SCENARIO_DEBUG mnstr_printf(GDKout, "#Ready to execute SQL statement\n"); #endif if (c->curprg->def->stop == 1) { sqlcleanup(be->mvc, 0); return MAL_SUCCEED; } if (m->emode == m_inplace) { msg = SQLexecutePrepared(c, be, be->q); goto cleanup_engine; } if (m->emode == m_prepare) goto cleanup_engine; assert(c->glb == 0 || c->glb == oldglb); /* detect leak */ c->glb = 0; be->language = 'D'; /* * The code below is copied from MALengine, which handles execution * in the context of a user global environment. We have a private * environment. */ if (MALcommentsOnly(c->curprg->def)) { msg = MAL_SUCCEED; } else { msg = (str) runMAL(c, c->curprg->def, 0, 0); } cleanup_engine: if (m->type == Q_SCHEMA) qc_clean(m->qc); if (msg) { enum malexception type = getExceptionType(msg); if (type == OPTIMIZER) { MSresetInstructions(c->curprg->def, 1); freeVariables(c, c->curprg->def, NULL, be->vtop); be->language = oldlang; assert(c->glb == 0 || c->glb == oldglb); /* detect leak */ c->glb = oldglb; if ( msg) GDKfree(msg); return SQLrecompile(c, be); // retry compilation } else { /* don't print exception decoration, just the message */ char *n = NULL; char *o = msg; while ((n = strchr(o, '\n')) != NULL) { *n = '\0'; mnstr_printf(c->fdout, "!%s\n", getExceptionMessage(o)); *n++ = '\n'; o = n; } if (*o != 0) mnstr_printf(c->fdout, "!%s\n", getExceptionMessage(o)); } showErrors(c); m->session->status = -10; } mb = c->curprg->def; if (m->type != Q_SCHEMA && be->q && msg) { qc_delete(m->qc, be->q); } else if (m->type != Q_SCHEMA && be->q && mb && varGetProp(mb, getArg(p = getInstrPtr(mb, 0), 0), runonceProp)) { msg = SQLCacheRemove(c, getFunctionId(p)); qc_delete(be->mvc->qc, be->q); ///* this should invalidate any match */ //be->q->key= -1; //be->q->paramlen = -1; ///* qc_delete(be->q) */ } be->q = NULL; sqlcleanup(be->mvc, (!msg) ? 0 : -1); MSresetInstructions(c->curprg->def, 1); freeVariables(c, c->curprg->def, NULL, be->vtop); be->language = oldlang; /* * Any error encountered during execution should block further processing * unless auto_commit has been set. */ assert(c->glb == 0 || c->glb == oldglb); /* detect leak */ c->glb = oldglb; return msg; }