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

Generated by: LCOV version 1.14