| 1 | /* | 
| 2 |  * This Source Code Form is subject to the terms of the Mozilla Public | 
| 3 |  * License, v. 2.0.  If a copy of the MPL was not distributed with this | 
| 4 |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | 
| 5 |  * | 
| 6 |  * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. | 
| 7 |  */ | 
| 8 |  | 
| 9 | /* Author(s) Martin Kersten | 
| 10 |  * This module contains the framework for inclusion query transformers, i.e. | 
| 11 |  * C-programs geared at optimizing a piece of MAL. | 
| 12 |  * The query transformer appears at the language level as an ordinary function, | 
| 13 |  * but it is effective only at a specific execution phase. | 
| 14 |  *  | 
| 15 |  * Each optimizer function has access to the runtime scope of the | 
| 16 |  * routine in which it is called. This can be used to maintain status | 
| 17 |  * information between successive calls.  | 
| 18 |  *  | 
| 19 |  * The routines below are linked with the kernel by default | 
| 20 | */ | 
| 21 | #include "monetdb_config.h" | 
| 22 | #include "optimizer.h" | 
| 23 | #include "mal_debugger.h" | 
| 24 | #include "optimizer_private.h" | 
| 25 | #include "opt_pipes.h" | 
| 26 |  | 
| 27 | /* | 
| 28 |  * Upon loading the module it should inspect the scenario table | 
| 29 |  * for any unresolved references to the MALoptimizer and set the  | 
| 30 |  * callback function. | 
| 31 | */ | 
| 32 | str | 
| 33 | optimizer_prelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) | 
| 34 | { | 
| 35 | 	(void) cntxt; | 
| 36 | 	(void) stk; | 
| 37 | 	(void) mb; | 
| 38 | 	(void) p; | 
| 39 | 	updateScenario("mal" , "MALoptimizer" , (MALfcn) MALoptimizer); | 
| 40 | 	optimizerInit(); | 
| 41 | 	//return compileAllOptimizers(cntxt); causes problems | 
| 42 | 	return MAL_SUCCEED; | 
| 43 | } | 
| 44 |  | 
| 45 |  | 
| 46 | /* | 
| 47 |  * MAL functions can be optimized explicitly using the routines below. | 
| 48 |  * Beware, the function names should be known as literal strings, because | 
| 49 |  * you may not know the runtime situation. | 
| 50 | */ | 
| 51 |  | 
| 52 | str | 
| 53 | QOToptimize(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) | 
| 54 | { | 
| 55 | 	str modnme; | 
| 56 | 	str fcnnme; | 
| 57 | 	Symbol s; | 
| 58 |  | 
| 59 | 	(void) stk; | 
| 60 | 	if (stk != 0) { | 
| 61 | 		modnme = *getArgReference_str(stk, pci, 1); | 
| 62 | 		fcnnme = *getArgReference_str(stk, pci, 2); | 
| 63 | 	} else { | 
| 64 | 		modnme = getArgDefault(mb, pci, 1); | 
| 65 | 		fcnnme = getArgDefault(mb, pci, 2); | 
| 66 | 	} | 
| 67 | 	s = findSymbol(cntxt->usermodule, putName(modnme), fcnnme); | 
| 68 | 	if (s == NULL) | 
| 69 | 		throw(MAL, "optimizer.optimize" , SQLSTATE(HY002) SEMANTIC_OPERATION_MISSING); | 
| 70 | 	removeInstruction(mb, pci); | 
| 71 | 	addtoMalBlkHistory(s->def); | 
| 72 | 	return optimizeMALBlock(cntxt, s->def); | 
| 73 | } | 
| 74 |  | 
| 75 |  |