Changeset: 267d133c11a5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=267d133c11a5
Modified Files:
        monetdb5/extras/bwd/optimizer.c
Branch: bwd
Log Message:

* making sure group bys get properly refined


Unterschiede (36 Zeilen):

diff --git a/monetdb5/extras/bwd/optimizer.c b/monetdb5/extras/bwd/optimizer.c
--- a/monetdb5/extras/bwd/optimizer.c
+++ b/monetdb5/extras/bwd/optimizer.c
@@ -26,10 +26,14 @@ static inline int OPTBWDImplementation(C
        size_t instructionCount = malBlock->stop;
        size_t initialNumberOfVariables = malBlock->vtop;
        int* approximations = malloc(initialNumberOfVariables*sizeof(int));
+       int* leftJoinResultLeftInputs = 
malloc(initialNumberOfVariables*sizeof(int));
+
        InstrPtr* oldProgram = malBlock->stmt;
        uint i;
-       for (i = 0; i < initialNumberOfVariables; ++i) 
+       for (i = 0; i < initialNumberOfVariables; ++i) {
     approximations[i] = 0;
+               leftJoinResultLeftInputs[i] = 0;
+       }
        for (i = 0; i < instructionCount; ++i) 
                if(oldProgram[i]->modname == sqlRef && (oldProgram[i]->fcnname 
== bindRef || oldProgram[i]->fcnname == bindidxRef))
                        approximations[getDestVar(oldProgram[i])] = 
getDestVar(oldProgram[i]);
@@ -136,6 +140,16 @@ static inline int OPTBWDImplementation(C
                                        /* refineLeftjoin = 
pushReturn(malBlock, refineLeftjoin, getArg(oldProgram[i], j)); */
                                        refineLeftjoin = pushArgument(malBlock, 
refineLeftjoin, approximations[getArg(oldProgram[i], j)]);
                                pushInstruction(malBlock, refineLeftjoin);
+                               if(match_function(oldProgram[i], algebraRef, 
leftjoinRef)){
+                                       
leftJoinResultLeftInputs[getDestVar(refineLeftjoin)] = getArg(refineLeftjoin, 
1);
+                               } else if(match_function(oldProgram[i], 
groupRef, multicolumnsRef)){
+                                       InstrPtr groupReduction = 
newInstruction(malBlock, ASSIGNsymbol);
+                                       rename_function(groupReduction, 
GDKstrdup(algebraRef), GDKstrdup(leftjoinRef), (int[]){0}, client);
+                                       groupReduction = pushReturn(malBlock, 
groupReduction, getArg(oldProgram[i], 1));
+                                       groupReduction = pushArgument(malBlock, 
groupReduction, leftJoinResultLeftInputs[getArg(oldProgram[i], 2)]);
+                                       groupReduction = pushArgument(malBlock, 
groupReduction, getArg(oldProgram[i], 1));
+                                       pushInstruction(malBlock, 
groupReduction);
+                               }
                        }
                } else {
                        pushInstruction(malBlock, oldProgram[i]);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to