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-04-25 20:03:45 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      467666 : OPTmatpackImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
      22             :                                                  InstrPtr pci)
      23             : {
      24      467666 :         int v, i, j, limit, slimit;
      25      467666 :         InstrPtr p, q;
      26      467666 :         int actions = 0;
      27      467666 :         InstrPtr *old = NULL;
      28      467666 :         str msg = MAL_SUCCEED;
      29             : 
      30      467666 :         if (isOptimizerUsed(mb, pci, mergetableRef) <= 0) {
      31       32001 :                 goto wrapup;
      32             :         }
      33             : 
      34             :         (void) cntxt;
      35             :         (void) stk;                                     /* to fool compilers */
      36    17814864 :         for (i = 1; i < mb->stop; i++)
      37    17408061 :                 if (getModuleId(getInstrPtr(mb, i)) == matRef
      38       32332 :                         && getFunctionId(getInstrPtr(mb, i)) == packRef
      39       31220 :                         && isaBatType(getArgType(mb, getInstrPtr(mb, i), 1)))
      40             :                         break;
      41      435666 :         if (i == mb->stop)
      42      406803 :                 goto wrapup;
      43             : 
      44       28863 :         old = mb->stmt;
      45       28863 :         limit = mb->stop;
      46       28863 :         slimit = mb->ssize;
      47       28863 :         if (newMalBlkStmt(mb, mb->stop) < 0)
      48           0 :                 throw(MAL, "optimizer.matpack", SQLSTATE(HY013) MAL_MALLOC_FAIL);
      49             : 
      50     5097563 :         for (i = 0; mb->errors == NULL && i < limit; i++) {
      51     5068700 :                 p = old[i];
      52     5068700 :                 if (getModuleId(p) == matRef && getFunctionId(p) == packRef
      53      169552 :                         && isaBatType(getArgType(mb, p, 1))) {
      54      167418 :                         q = newInstruction(0, matRef, packIncrementRef);
      55      167418 :                         if (q == NULL) {
      56           0 :                                 msg = createException(MAL, "optimizer.matpack",
      57             :                                                                           SQLSTATE(HY013) MAL_MALLOC_FAIL);
      58           0 :                                 break;
      59             :                         }
      60      167418 :                         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      167418 :                         q = pushArgument(mb, q, getArg(p, 1));
      67      167418 :                         v = getArg(q, 0);
      68      167418 :                         q = pushInt(mb, q, p->argc - p->retc);
      69      167418 :                         pushInstruction(mb, q);
      70      167418 :                         typeChecker(cntxt->usermodule, mb, q, mb->stop - 1, TRUE);
      71             : 
      72      827564 :                         for (j = 2; j < p->argc; j++) {
      73      492728 :                                 q = newInstruction(0, matRef, packIncrementRef);
      74      492728 :                                 if (q == NULL) {
      75           0 :                                         msg = createException(MAL, "optimizer.matpack",
      76             :                                                                                   SQLSTATE(HY013) MAL_MALLOC_FAIL);
      77           0 :                                         break;
      78             :                                 }
      79      492728 :                                 q = pushArgument(mb, q, v);
      80      492728 :                                 q = pushArgument(mb, q, getArg(p, j));
      81      492728 :                                 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      492728 :                                 v = getArg(q, 0);
      88      492728 :                                 pushInstruction(mb, q);
      89      492728 :                                 typeChecker(cntxt->usermodule, mb, q, mb->stop - 1, TRUE);
      90             :                         }
      91           0 :                         if (msg)
      92             :                                 break;
      93      167418 :                         getArg(q, 0) = getArg(p, 0);
      94      167418 :                         freeInstruction(p);
      95      167418 :                         actions++;
      96      167418 :                         continue;
      97             :                 }
      98     4901282 :                 pushInstruction(mb, p);
      99     4901282 :                 old[i] = NULL;
     100             :         }
     101    14212643 :         for (; i < slimit; i++)
     102    14183780 :                 if (old[i])
     103           0 :                         pushInstruction(mb, old[i]);
     104       28863 :         GDKfree(old);
     105             : 
     106             :         /* Defense line against incorrect plans */
     107       28863 :         if (msg == MAL_SUCCEED && actions > 0) {
     108       28863 :                 msg = chkTypes(cntxt->usermodule, mb, FALSE);
     109       28863 :                 if (!msg)
     110       28863 :                         msg = chkFlow(mb);
     111       28863 :                 if (!msg)
     112       28863 :                         msg = chkDeclarations(mb);
     113             :         }
     114           0 :   wrapup:
     115             :         /* keep actions taken as a fake argument */
     116      467667 :         (void) pushInt(mb, pci, actions);
     117      467667 :         return msg;
     118             : }

Generated by: LCOV version 1.14