LCOV - code coverage report
Current view: top level - monetdb5/optimizer - opt_matpack.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 56 70 80.0 %
Date: 2024-10-04 20:04:04 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*
       2             :  * SPDX-License-Identifier: MPL-2.0
       3             :  *
       4             :  * This Source Code Form is subject to the terms of the Mozilla Public
       5             :  * License, v. 2.0.  If a copy of the MPL was not distributed with this
       6             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       7             :  *
       8             :  * Copyright 2024 MonetDB Foundation;
       9             :  * Copyright August 2008 - 2023 MonetDB B.V.;
      10             :  * Copyright 1997 - July 2008 CWI.
      11             :  */
      12             : 
      13             : /*
      14             :  * This simple module unrolls the mat.pack into an incremental sequence.
      15             :  * This could speedup parallel processing and releases resources faster.
      16             :  */
      17             : #include "monetdb_config.h"
      18             : #include "opt_matpack.h"
      19             : 
      20             : str
      21      495253 : OPTmatpackImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
      22             :                                                  InstrPtr pci)
      23             : {
      24      495253 :         int v, i, j, limit, slimit;
      25      495253 :         InstrPtr p, q;
      26      495253 :         int actions = 0;
      27      495253 :         InstrPtr *old = NULL;
      28      495253 :         str msg = MAL_SUCCEED;
      29             : 
      30      495253 :         if (isOptimizerUsed(mb, pci, mergetableRef) <= 0) {
      31       32000 :                 goto wrapup;
      32             :         }
      33             : 
      34             :         (void) cntxt;
      35             :         (void) stk;                                     /* to fool compilers */
      36    18958297 :         for (i = 1; i < mb->stop; i++)
      37    18525764 :                 if (getModuleId(getInstrPtr(mb, i)) == matRef
      38       45638 :                         && getFunctionId(getInstrPtr(mb, i)) == packRef
      39       33049 :                         && isaBatType(getArgType(mb, getInstrPtr(mb, i), 1)))
      40             :                         break;
      41      463256 :         if (i == mb->stop)
      42      432533 :                 goto wrapup;
      43             : 
      44       30723 :         old = mb->stmt;
      45       30723 :         limit = mb->stop;
      46       30723 :         slimit = mb->ssize;
      47       30723 :         if (newMalBlkStmt(mb, mb->stop) < 0)
      48           0 :                 throw(MAL, "optimizer.matpack", SQLSTATE(HY013) MAL_MALLOC_FAIL);
      49             : 
      50     5374251 :         for (i = 0; mb->errors == NULL && i < limit; i++) {
      51     5343528 :                 p = old[i];
      52     5343528 :                 if (getModuleId(p) == matRef && getFunctionId(p) == packRef
      53      183441 :                         && isaBatType(getArgType(mb, p, 1))) {
      54      181307 :                         q = newInstruction(0, matRef, packIncrementRef);
      55      181307 :                         if (q == NULL) {
      56           0 :                                 msg = createException(MAL, "optimizer.matpack",
      57             :                                                                           SQLSTATE(HY013) MAL_MALLOC_FAIL);
      58           0 :                                 break;
      59             :                         }
      60      181307 :                         if (setDestVar(q, newTmpVariable(mb, getArgType(mb, p, 1))) < 0) {
      61           0 :                                 freeInstruction(q);
      62           0 :                                 msg = createException(MAL, "optimizer.matpack",
      63             :                                                                           SQLSTATE(HY013) MAL_MALLOC_FAIL);
      64           0 :                                 break;
      65             :                         }
      66      181307 :                         q = pushArgument(mb, q, getArg(p, 1));
      67      181307 :                         v = getArg(q, 0);
      68      181307 :                         q = pushInt(mb, q, p->argc - p->retc);
      69      181307 :                         pushInstruction(mb, q);
      70      181307 :                         typeChecker(cntxt->usermodule, mb, q, mb->stop - 1, TRUE);
      71             : 
      72      899999 :                         for (j = 2; j < p->argc; j++) {
      73      537385 :                                 q = newInstruction(0, matRef, packIncrementRef);
      74      537385 :                                 if (q == NULL) {
      75           0 :                                         msg = createException(MAL, "optimizer.matpack",
      76             :                                                                                   SQLSTATE(HY013) MAL_MALLOC_FAIL);
      77           0 :                                         break;
      78             :                                 }
      79      537385 :                                 q = pushArgument(mb, q, v);
      80      537385 :                                 q = pushArgument(mb, q, getArg(p, j));
      81      537385 :                                 if (setDestVar(q, newTmpVariable(mb, getVarType(mb, v))) < 0) {
      82           0 :                                         freeInstruction(q);
      83           0 :                                         msg = createException(MAL, "optimizer.matpack",
      84             :                                                                                   SQLSTATE(HY013) MAL_MALLOC_FAIL);
      85           0 :                                         break;
      86             :                                 }
      87      537385 :                                 v = getArg(q, 0);
      88      537385 :                                 pushInstruction(mb, q);
      89      537385 :                                 typeChecker(cntxt->usermodule, mb, q, mb->stop - 1, TRUE);
      90             :                         }
      91           0 :                         if (msg)
      92             :                                 break;
      93      181307 :                         getArg(q, 0) = getArg(p, 0);
      94      181307 :                         freeInstruction(p);
      95      181307 :                         actions++;
      96      181307 :                         continue;
      97             :                 }
      98     5162221 :                 pushInstruction(mb, p);
      99     5162221 :                 old[i] = NULL;
     100             :         }
     101    14844635 :         for (; i < slimit; i++)
     102    14813912 :                 if (old[i])
     103           0 :                         pushInstruction(mb, old[i]);
     104       30723 :         GDKfree(old);
     105             : 
     106             :         /* Defense line against incorrect plans */
     107       30723 :         if (msg == MAL_SUCCEED && actions > 0) {
     108       30723 :                 msg = chkTypes(cntxt->usermodule, mb, FALSE);
     109       30723 :                 if (!msg)
     110       30723 :                         msg = chkFlow(mb);
     111       30723 :                 if (!msg)
     112       30723 :                         msg = chkDeclarations(mb);
     113             :         }
     114           0 :   wrapup:
     115             :         /* keep actions taken as a fake argument */
     116      495256 :         (void) pushInt(mb, pci, actions);
     117      495256 :         return msg;
     118             : }

Generated by: LCOV version 1.14