LCOV - code coverage report
Current view: top level - monetdb5/optimizer - opt_aliases.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 40 41 97.6 %
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             : #include "monetdb_config.h"
      14             : #include "mal_instruction.h"
      15             : #include "opt_aliases.h"
      16             : 
      17             : /* an alias is recognized by a simple assignment */
      18             : #define OPTisAlias(X) (X->argc == 2 && X->token == ASSIGNsymbol && X->barrier == 0 )
      19             : 
      20             : str
      21     1485774 : OPTaliasesImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
      22             : {
      23     1485774 :         int i, j, k = 1, limit, actions = 0;
      24     1485774 :         int *alias = 0;
      25     1485774 :         str msg = MAL_SUCCEED;
      26     1485774 :         InstrPtr p;
      27             : 
      28     1485774 :         (void) stk;
      29     1485774 :         (void) cntxt;
      30             : 
      31     1485774 :         limit = mb->stop;
      32    44338650 :         for (i = 1; i < limit; i++) {
      33    43382326 :                 p = getInstrPtr(mb, i);
      34    43382326 :                 if (OPTisAlias(p))
      35             :                         break;
      36             :         }
      37     1485774 :         if (i == limit) {
      38             :                 // we didn't found a simple assignment that warrants a rewrite
      39      956324 :                 goto wrapup;
      40             :         }
      41      529450 :         k = i;
      42      529450 :         if (i < limit) {
      43      529450 :                 alias = GDKzalloc(sizeof(int) * mb->vtop);
      44      529449 :                 if (alias == NULL)
      45           0 :                         throw(MAL, "optimizer.aliases", SQLSTATE(HY013) MAL_MALLOC_FAIL);
      46      529449 :                 setVariableScope(mb);
      47    48575071 :                 for (j = 1; j < mb->vtop; j++)
      48    47516172 :                         alias[j] = j;
      49             :         }
      50    28107569 :         for (; i < limit; i++) {
      51    27578075 :                 p = getInstrPtr(mb, i);
      52    27578075 :                 mb->stmt[k++] = p;
      53    27578075 :                 if (OPTisAlias(p) && getLastUpdate(mb, getArg(p, 0)) == i
      54     3225089 :                         && getBeginScope(mb, getArg(p, 0)) == i
      55     3223962 :                         && getLastUpdate(mb, getArg(p, 1)) <= i) {
      56     3223550 :                         alias[getArg(p, 0)] = alias[getArg(p, 1)];
      57     3223550 :                         freeInstruction(p);
      58     3223594 :                         actions++;
      59     3223594 :                         k--;
      60     3223594 :                         mb->stmt[k] = 0;
      61             :                 } else {
      62    83042391 :                         for (int i = 0; i < p->argc; i++)
      63    58687866 :                                 getArg(p, i) = alias[getArg(p, i)];
      64             :                 }
      65             :         }
      66             : 
      67     3753037 :         for (i = k; i < limit; i++)
      68     3223543 :                 mb->stmt[i] = NULL;
      69             : 
      70      529494 :         mb->stop = k;
      71      529494 :         GDKfree(alias);
      72             : 
      73             :         /* Defense line against incorrect plans */
      74             :         /* Plan is unaffected */
      75             :         // msg = chkTypes(cntxt->usermodule, mb, FALSE);
      76             :         // if ( msg == MAL_SUCCEED)
      77             :         //      msg = chkFlow(mb);
      78             :         // if ( msg == MAL_SUCCEED)
      79             :         //      msg = chkDeclarations(mb);
      80     1485770 :   wrapup:
      81             :         /* keep actions taken as a fake argument */
      82     1485770 :         (void) pushInt(mb, pci, actions);
      83     1485770 :         return msg;
      84             : }

Generated by: LCOV version 1.14