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/*
10 * Collect properties for beautified variable rendering
11 * All variables are tagged with the schema.table.column name if possible.
12 */
13
14#include "monetdb_config.h"
15#include "mal_instruction.h"
16#include "opt_prelude.h"
17#include "opt_profiler.h"
18
19str
20OPTprofilerImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
21{
22 int i;
23 InstrPtr p;
24 char buf[BUFSIZ];
25 lng usec = GDKusec();
26
27 (void) pci;
28 (void) stk;
29 (void) cntxt;
30
31 for( i=0; i< mb->stop; i++){
32 p= getInstrPtr(mb,i);
33 if( p == NULL)
34 continue;
35 if ( getModuleId(p) == NULL || getFunctionId(p) == NULL)
36 continue;
37 if( getModuleId(p)== sqlRef && (getFunctionId(p)== bindRef || getFunctionId(p) == bindidxRef)){
38 getVarSTC(mb,getArg(p,0)) = i;
39 } else
40 if( getModuleId(p)== sqlRef && getFunctionId(p)== tidRef){
41 getVarSTC(mb,getArg(p,0)) = i;
42 } else
43 if( getModuleId(p)== sqlRef && (getFunctionId(p)== deltaRef || getFunctionId(p) == subdeltaRef)){
44 // inherit property of first argument
45 getVarSTC(mb,getArg(p,0)) = getVarSTC(mb,getArg(p,1));
46 } else
47 if( getModuleId(p)== sqlRef && getFunctionId(p)== projectdeltaRef){
48 getVarSTC(mb,getArg(p,0)) = getVarSTC(mb,getArg(p,1));
49 } else
50 if( getModuleId(p)== algebraRef && getFunctionId(p)== projectionRef){
51 getVarSTC(mb,getArg(p,0)) = getVarSTC(mb,getArg(p,p->argc-1));
52 } else
53 if( getModuleId(p)== algebraRef &&
54 (getFunctionId(p)== selectRef ||
55 getFunctionId(p) == thetaselectRef ||
56 getFunctionId(p) == selectNotNilRef) ){
57 getVarSTC(mb,getArg(p,0)) = getVarSTC(mb,getArg(p,p->retc));
58 } else
59 if( getModuleId(p)== algebraRef && (getFunctionId(p)== likeselectRef || getFunctionId(p) == ilikeselectRef)){
60 getVarSTC(mb,getArg(p,0)) = getVarSTC(mb,getArg(p,p->retc));
61 } else
62 if( getModuleId(p)== algebraRef &&
63 ( getFunctionId(p)== joinRef ||
64 getFunctionId(p) == leftjoinRef ||
65 getFunctionId(p) == thetajoinRef ||
66 getFunctionId(p) == antijoinRef ||
67 getFunctionId(p) == bandjoinRef ||
68 getFunctionId(p) == rangejoinRef )){
69 getVarSTC(mb,getArg(p,0)) = getVarSTC(mb,getArg(p,p->retc));
70 getVarSTC(mb,getArg(p,1)) = getVarSTC(mb,getArg(p,p->retc +1));
71 } else
72 if( getModuleId(p)== matRef && getFunctionId(p)== packIncrementRef){
73 getVarSTC(mb,getArg(p,0)) = getVarSTC(mb,getArg(p,1));
74 }
75 }
76 /* Defense line against incorrect plans */
77 /* Plan remains unaffected */
78 //chkTypes(cntxt->usermodule, mb, FALSE);
79 //chkFlow(mb);
80 //chkDeclarations(mb);
81
82 /* keep all actions taken as a post block comment */
83 usec = GDKusec()- usec;
84 snprintf(buf,256,"%-20s actions= 1 time=" LLFMT " usec","profiler", usec);
85 newComment(mb,buf);
86 addtoMalBlkHistory(mb);
87 if( OPTdebug & OPTprofiler){
88 fprintf(stderr, "#PROFILER optimizer exit\n");
89 fprintFunction(stderr, mb, 0, LIST_MAL_ALL);
90 }
91 return MAL_SUCCEED;
92}
93