LCOV - code coverage report
Current view: top level - monetdb5/modules/mal - projectionpath.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 27 36 75.0 %
Date: 2024-11-14 20:04:02 Functions: 2 2 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_client.h"
      15             : #include "mal_interpreter.h"
      16             : #include "mal_exception.h"
      17             : 
      18             : static str
      19      363046 : ALGprojectionpath(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
      20             : {
      21      363046 :         int i;
      22      363046 :         bat bid;
      23      363046 :         bat *r = getArgReference_bat(stk, pci, 0);
      24      363046 :         BAT *b, **joins = NULL;
      25             : 
      26      363046 :         (void) mb;
      27      363046 :         (void) cntxt;
      28             : 
      29      363046 :         if (pci->argc <= 1)
      30           0 :                 throw(MAL, "algebra.projectionpath", SQLSTATE(HY013) "INTERNAL ERROR");
      31      363046 :         joins = (BAT **) GDKzalloc(pci->argc * sizeof(BAT *));
      32      363026 :         if (joins == NULL)
      33           0 :                 throw(MAL, "algebra.projectionpath", SQLSTATE(HY013) MAL_MALLOC_FAIL);
      34     3518520 :         for (i = pci->retc; i < pci->argc; i++) {
      35     3155608 :                 bid = *getArgReference_bat(stk, pci, i);
      36     3155608 :                 b = BATdescriptor(bid);
      37     3155494 :                 if (b == NULL
      38     3155494 :                         || (i + 1 < pci->argc && ATOMtype(b->ttype) != TYPE_oid
      39           0 :                                 && b->ttype != TYPE_msk)) {
      40           0 :                         while (--i >= pci->retc)
      41           0 :                                 BBPunfix(joins[i - pci->retc]->batCacheid);
      42           0 :                         GDKfree(joins);
      43           0 :                         BBPreclaim(b);
      44           0 :                         throw(MAL, "algebra.projectionpath", "%s",
      45             :                                   b ? SEMANTIC_TYPE_MISMATCH : INTERNAL_BAT_ACCESS);
      46             :                 }
      47     3155494 :                 joins[i - pci->retc] = b;
      48             :         }
      49      362912 :         joins[pci->argc - pci->retc] = NULL;
      50      362912 :         b = BATprojectchain(joins);
      51     3519583 :         for (i = pci->retc; i < pci->argc; i++)
      52     3156624 :                 BBPunfix(joins[i - pci->retc]->batCacheid);
      53      362959 :         GDKfree(joins);
      54      363022 :         if (b) {
      55      363022 :                 *r = b->batCacheid;
      56      363022 :                 BBPkeepref(b);
      57             :         } else
      58           0 :                 throw(MAL, "algebra.projectionpath", GDK_EXCEPTION);
      59      363022 :         return MAL_SUCCEED;
      60             : }
      61             : 
      62             : #include "mel.h"
      63             : mel_func projectionpath_init_funcs[] = {
      64             :  pattern("algebra", "projectionpath", ALGprojectionpath, false, "Routine to handle join paths.  The type analysis is rather tricky.", args(1,2, batargany("",0),batvarargany("l",0))),
      65             :  { .imp=NULL }
      66             : };
      67             : #include "mal_import.h"
      68             : #ifdef _MSC_VER
      69             : #undef read
      70             : #pragma section(".CRT$XCU",read)
      71             : #endif
      72         321 : LIB_STARTUP_FUNC(init_projectionpath_mal)
      73         321 : { mal_module("projectionpath", NULL, projectionpath_init_funcs); }

Generated by: LCOV version 1.14