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 363368 : ALGprojectionpath(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) 20 : { 21 363368 : int i; 22 363368 : bat bid; 23 363368 : bat *r = getArgReference_bat(stk, pci, 0); 24 363368 : BAT *b, **joins = NULL; 25 : 26 363368 : (void) mb; 27 363368 : (void) cntxt; 28 : 29 363368 : if (pci->argc <= 1) 30 0 : throw(MAL, "algebra.projectionpath", SQLSTATE(HY013) "INTERNAL ERROR"); 31 363368 : joins = (BAT **) GDKzalloc(pci->argc * sizeof(BAT *)); 32 363343 : if (joins == NULL) 33 0 : throw(MAL, "algebra.projectionpath", SQLSTATE(HY013) MAL_MALLOC_FAIL); 34 3530520 : for (i = pci->retc; i < pci->argc; i++) { 35 3167249 : bid = *getArgReference_bat(stk, pci, i); 36 3167249 : b = BATdescriptor(bid); 37 3167177 : if (b == NULL 38 3167177 : || (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 3167177 : joins[i - pci->retc] = b; 48 : } 49 363271 : joins[pci->argc - pci->retc] = NULL; 50 363271 : b = BATprojectchain(joins); 51 3508008 : for (i = pci->retc; i < pci->argc; i++) 52 3144776 : BBPunfix(joins[i - pci->retc]->batCacheid); 53 363232 : GDKfree(joins); 54 363362 : if (b) { 55 363362 : *r = b->batCacheid; 56 363362 : BBPkeepref(b); 57 : } else 58 0 : throw(MAL, "algebra.projectionpath", GDK_EXCEPTION); 59 363362 : 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 324 : LIB_STARTUP_FUNC(init_projectionpath_mal) 73 324 : { mal_module("projectionpath", NULL, projectionpath_init_funcs); }