LCOV - code coverage report
Current view: top level - sql/storage/bat - res_table.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 75 93 80.6 %
Date: 2024-12-20 21:24:02 Functions: 7 7 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 "res_table.h"
      15             : #include "bat_utils.h"
      16             : #include "sql_types.h"
      17             : 
      18             : static void
      19      280572 : bat_incref(bat bid)
      20             : {
      21      280572 :         BBPretain(bid);
      22      280576 : }
      23             : 
      24             : static void
      25      280557 : bat_decref(bat bid)
      26             : {
      27      280557 :         BBPrelease(bid);
      28      280576 : }
      29             : 
      30             : res_table *
      31      127326 : res_table_create(sql_trans *tr, int res_id, oid query_id, int nr_cols, mapi_query_t type, res_table *next)
      32             : {
      33      127326 :         res_table *t = MNEW(res_table);
      34      127333 :         res_col *tcols = ZNEW_ARRAY(res_col, nr_cols);
      35             : 
      36      127332 :         (void) tr;
      37      127332 :         if (!t || !tcols) {
      38           0 :                 _DELETE(t);
      39           0 :                 _DELETE(tcols);
      40           0 :                 return NULL;
      41             :         }
      42             : 
      43      127332 :         *t = (res_table) {
      44             :                 .id = res_id,
      45             :                 .query_id = query_id,
      46             :                 .query_type = type,
      47             :                 .cols = tcols,
      48             :                 .nr_cols = nr_cols,
      49             :                 .next = next,
      50             :         };
      51             : 
      52      127332 :         return t;
      53             : }
      54             : 
      55             : res_col *
      56      350890 : res_col_create(sql_trans *tr, res_table *t, const char *tn, const char *name, const char *typename, int digits, int scale, bool isbat, char mtype, void *val, bool cached)
      57             : {
      58      350890 :         res_col *c = t->cols + t->cur_col;
      59      350890 :         BAT *b;
      60             : 
      61      350890 :         if (!sql_find_subtype(&c->type, typename, digits, scale))
      62         343 :                 sql_init_subtype(&c->type, sql_trans_bind_type(tr, NULL, typename), digits, scale);
      63      350890 :         c->tn = _STRDUP(tn);
      64      350894 :         c->name = _STRDUP(name);
      65      350892 :         if (c->tn == NULL || c->name == NULL) {
      66           0 :                 _DELETE(c->tn);
      67           0 :                 _DELETE(c->name);
      68           0 :                 return NULL;
      69             :         }
      70      350892 :         c->b = 0;
      71      350892 :         c->p = NULL;
      72      350892 :         c->mtype = mtype;
      73      350892 :         if (isbat) {
      74      289447 :                 b = (BAT*)val;
      75      289447 :                 if (b && t->cur_col == 0)
      76       66575 :                         t->nr_rows = BATcount(b);
      77             :         } else { // wrap scalar values in BATs for result consistency
      78       61445 :                 b = COLnew(0, mtype, 1, TRANSIENT);
      79       61436 :                 if (b == NULL) {
      80           0 :                         _DELETE(c->tn);
      81           0 :                         _DELETE(c->name);
      82           0 :                         return NULL;
      83             :                 }
      84       61436 :                 if (BUNappend(b, val, false) != GDK_SUCCEED) {
      85           0 :                         BBPreclaim(b);
      86           0 :                         _DELETE(c->tn);
      87           0 :                         _DELETE(c->name);
      88           0 :                         return NULL;
      89             :                 }
      90       61447 :                 if (t->cur_col == 0)
      91       60751 :                         t->nr_rows = 1;
      92             :                 cached = true; /* simply keep memory pointer for this small bat */
      93             :         }
      94      350894 :         c->b = b->batCacheid;
      95      350894 :         c->cached = cached;
      96      350894 :         if (cached)
      97       70322 :                 c->p = (void*)b;
      98             :         else
      99      280572 :                 bat_incref(c->b);
     100      350898 :         t->cur_col++;
     101      350898 :         assert(t->cur_col <= t->nr_cols);
     102             :         return c;
     103             : }
     104             : 
     105             : static void
     106      350857 : res_col_destroy(res_col *c)
     107             : {
     108      350857 :         if (c->b && !c->cached) {
     109      280557 :                 bat_decref(c->b);
     110       70300 :         } else if (c->b) {
     111       70300 :                 bat_destroy((BAT*)c->p);
     112             :         } else {
     113           0 :                 _DELETE(c->p);
     114             :         }
     115      350849 :         _DELETE(c->name);
     116      350895 :         _DELETE(c->tn);
     117      350896 : }
     118             : 
     119             : void
     120      127221 : res_table_destroy(res_table *t)
     121             : {
     122      127221 :         int i;
     123             : 
     124      478189 :         for (i = 0; i < t->nr_cols; i++) {
     125      350859 :                 res_col *c = t->cols + i;
     126             : 
     127      350859 :                 if (c)
     128      350859 :                         res_col_destroy(c);
     129             :         }
     130      127330 :         _DELETE(t->cols);
     131      127333 :         _DELETE(t);
     132      127331 : }
     133             : 
     134             : res_table *
     135      123903 : res_tables_remove(res_table *results, res_table *t)
     136             : {
     137      123903 :         res_table *r = results;
     138             : 
     139      123903 :         if (r == t) {
     140      123903 :                 results = t->next;
     141             :         } else {
     142           0 :                 for (; r; r = r->next) {
     143           0 :                         if (r->next == t) {
     144           0 :                                 r->next = t->next;
     145           0 :                                 break;
     146             :                         }
     147             :                 }
     148             :         }
     149      123903 :         res_table_destroy(t);
     150      123941 :         return results;
     151             : }
     152             : 
     153             : void
     154       37586 : res_tables_destroy(res_table *tab)
     155             : {
     156       37586 :         if (tab) {
     157         178 :                 res_table *r = tab, *t;
     158             : 
     159         178 :                 for (t = r; t; t = r) {
     160         145 :                         r = t->next;
     161         145 :                         res_table_destroy(t);
     162             :                 }
     163             :         }
     164       37586 : }
     165             : 
     166             : res_table *
     167      255159 : res_tables_find(res_table *results, int res_id)
     168             : {
     169      255159 :         res_table *r = results;
     170             : 
     171      268838 :         for (; r; r = r->next) {
     172      264874 :                 if (r->id == res_id)
     173      251195 :                         return r;
     174             :         }
     175             :         return NULL;
     176             : }

Generated by: LCOV version 1.14