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