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*/
32str
33optimizer_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
52str
53QOToptimize(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