void addQueryToCache(Client c) { MalBlkPtr mb; backend *be; str msg = 0, pipe; be = (backend *) c->sqlcontext; assert(be && be->mvc); /* SQL clients should always have their state set */ pipe = getSQLoptimizer(be->mvc); insertSymbol(c->nspace, c->curprg); trimMalBlk(c->curprg->def); c->blkmode = 0; mb = c->curprg->def; chkProgram(c->fdout, c->nspace, mb); #ifdef _SQL_OPTIMIZER_DEBUG mnstr_printf(GDKout, "ADD QUERY TO CACHE\n"); printFunction(GDKout, mb, 0, LIST_MAL_ALL); #endif /* * An error in the compilation should be reported to the user. * And if the debugging option is set, the debugger is called * to allow inspection. */ if (mb->errors) { showErrors(c); if (c->listing) printFunction(c->fdout, mb, 0, c->listing); if (be->mvc->debug) { msg = runMALDebugger(c, c->curprg); if (msg != MAL_SUCCEED) GDKfree(msg); /* ignore error */ } return; } addOptimizers(c, mb, pipe); msg = optimizeMALBlock(c, mb); if (msg != MAL_SUCCEED) { showScriptException(c->fdout, mb, 0, MAL, "%s", msg); GDKfree(msg); return; } /* time to execute the optimizers */ if (c->debug) optimizerCheck(c, mb, "sql.baseline", -1, 0); #ifdef _SQL_OPTIMIZER_DEBUG mnstr_printf(GDKout, "ADD optimized QUERY TO CACHE\n"); printFunction(GDKout, mb, 0, LIST_MAL_ALL); #endif }
str SQLoptimizeFunction(Client c, MalBlkPtr mb) { str msg; str pipe; backend *be = (backend *) c->sqlcontext; assert(be && be->mvc); /* SQL clients should always have their state set */ pipe = getSQLoptimizer(be->mvc); msg = addOptimizers(c, mb, pipe, TRUE); if (msg) return msg; mb->keephistory |= be->mvc->emod & mod_debug; msg = optimizeMALBlock(c, mb); mb->keephistory = FALSE; return msg; }
str SQLoptimizeQuery(Client c, MalBlkPtr mb) { backend *be; str msg = 0; str pipe; if (mb->stop > 0 && mb->stmt[mb->stop-1]->token == REMsymbol && mb->stmt[mb->stop-1]->argc > 0 && mb->var[mb->stmt[mb->stop-1]->argv[0]].value.vtype == TYPE_str && mb->var[mb->stmt[mb->stop-1]->argv[0]].value.val.sval && strncmp(mb->var[mb->stmt[mb->stop-1]->argv[0]].value.val.sval, "total", 5) == 0) return MAL_SUCCEED; /* already optimized */ be = (backend *) c->sqlcontext; assert(be && be->mvc); /* SQL clients should always have their state set */ c->blkmode = 0; chkProgram(c->usermodule, mb); /* * An error in the compilation should be reported to the user. * And if the debugging option is set, the debugger is called * to allow inspection. */ if (mb->errors) { if (c->listing) printFunction(c->fdout, mb, 0, c->listing); if (be->mvc->debug) { msg = runMALDebugger(c, c->curprg->def); if (msg != MAL_SUCCEED) freeException(msg); /* ignore error */ } return NULL; } pipe = getSQLoptimizer(be->mvc); msg = addOptimizers(c, mb, pipe, FALSE); if (msg) return msg; mb->keephistory |= be->mvc->emod & mod_debug; msg = optimizeMALBlock(c, mb); return msg; }
str optimizeQuery(Client c) { MalBlkPtr mb; backend *be; str msg = 0, pipe; be = (backend *) c->sqlcontext; assert(be && be->mvc); /* SQL clients should always have their state set */ pipe = getSQLoptimizer(be->mvc); trimMalBlk(c->curprg->def); c->blkmode = 0; mb = c->curprg->def; chkProgram(c->fdout, c->nspace, mb); #ifdef _SQL_OPTIMIZER_DEBUG mnstr_printf(GDKout, "Optimize query\n"); printFunction(GDKout, mb, 0, LIST_MAL_ALL); #endif /* * An error in the compilation should be reported to the user. * And if the debugging option is set, the debugger is called * to allow inspection. */ if (mb->errors) { showErrors(c); if (c->listing) printFunction(c->fdout, mb, 0, c->listing); return NULL; } addOptimizers(c, mb, pipe); msg = optimizeMALBlock(c, mb); if (msg) return msg; /* time to execute the optimizers */ if (c->debug) optimizerCheck(c, mb, "sql.baseline", -1, 0); #ifdef _SQL_OPTIMIZER_DEBUG mnstr_printf(GDKout, "End Optimize Query\n"); printFunction(GDKout, mb, 0, LIST_MAL_ALL); #endif return NULL; }