LCOV - code coverage report
Current view: top level - gdk - gdk_calc_compare.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 218 543 40.1 %
Date: 2024-04-25 20:03:45 Functions: 38 42 90.5 %

          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             : /* this file is included multiple times by gdk_calc.c */
      14             : 
      15             : static BUN
      16     1293266 : op_typeswitchloop(const void *lft, int tp1, bool incr1, const char *hp1, int wd1,
      17             :                   const void *rgt, int tp2, bool incr2, const char *hp2, int wd2,
      18             :                   TPE *restrict dst,
      19             :                   struct canditer *restrict ci1, struct canditer *restrict ci2,
      20             :                   oid candoff1, oid candoff2,
      21             :                   bool nonil,
      22             : #ifdef NIL_MATCHES_FLAG
      23             :                   bool nil_matches,
      24             : #endif
      25             :                   const char *func)
      26             : {
      27     1293266 :         BUN nils = 0;
      28     1293266 :         BUN i = 0, j = 0, k, ncand = ci1->ncand;
      29     1293266 :         const void *restrict nil;
      30     1293266 :         int (*atomcmp)(const void *, const void *);
      31             : 
      32     1293266 :         lng timeoffset = 0;
      33     1293266 :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();
      34     1293267 :         if (qry_ctx != NULL) {
      35     1285468 :                 timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0;
      36             :         }
      37             : 
      38     1293267 :         switch (tp1) {
      39           6 :         case TYPE_void: {
      40           6 :                 assert(incr1);
      41           6 :                 assert(tp2 == TYPE_oid || incr2); /* if void, incr2==1 */
      42           6 :                 oid v = lft ? * (const oid *) lft : oid_nil;
      43          38 :                 TIMEOUT_LOOP_IDX(k, ncand, timeoffset) {
      44          20 :                         TPE res;
      45          20 :                         i = canditer_next(ci1) - candoff1;
      46          20 :                         if (incr2)
      47          20 :                                 j = canditer_next(ci2) - candoff2;
      48          20 :                         if (is_oid_nil(v) || tp2 == TYPE_void) {
      49           0 :                                 res = is_oid_nil(v) || is_oid_nil(* (const oid *) rgt) ?
      50             : #ifdef NIL_MATCHES_FLAG
      51           0 :                                         nil_matches ? OP(is_oid_nil(v), is_oid_nil(* (const oid *) rgt)) :
      52             : #endif
      53             :                                         TPE_nil :
      54           0 :                                         OP(v, * (const oid *) rgt);
      55           0 :                                 dst[k] = res;
      56           0 :                                 nils += is_TPE_nil(res);
      57             :                         } else {
      58          20 :                                 if (is_oid_nil(((const oid *) rgt)[j])) {
      59             : #ifdef NIL_MATCHES_FLAG
      60           0 :                                         if (nil_matches) {
      61           0 :                                                 dst[k] = OP(false, true);
      62             :                                         } else
      63             : #endif
      64             :                                         {
      65           0 :                                                 nils++;
      66           0 :                                                 dst[k] = TPE_nil;
      67             :                                         }
      68             :                                 } else {
      69          20 :                                         dst[k] = OP(v + i, ((const oid *) rgt)[j]);
      70             :                                 }
      71             :                         }
      72             :                 }
      73           6 :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));
      74             :                 break;
      75             :         }
      76           0 :         case TYPE_bit:
      77           0 :                 if (tp2 != TYPE_bit)
      78           0 :                         goto unsupported;
      79           0 :                 if (nonil)
      80           0 :                         BINARY_3TYPE_FUNC_nonil(bit, bit, TPE, OP);
      81             : #ifdef NIL_MATCHES_FLAG
      82           0 :                 else if (nil_matches)
      83           0 :                         BINARY_3TYPE_FUNC_nilmatch(bit, bit, TPE, OP);
      84             : #endif
      85             :                 else
      86           0 :                         BINARY_3TYPE_FUNC(bit, bit, TPE, OP);
      87             :                 break;
      88        1271 :         case TYPE_bte:
      89        1271 :                 switch (tp2) {
      90             :                 case TYPE_bte:
      91        1271 :                 btebte:
      92        1271 :                         if (nonil)
      93     8002111 :                                 BINARY_3TYPE_FUNC_nonil(bte, bte, TPE, OP);
      94             : #ifdef NIL_MATCHES_FLAG
      95        1038 :                         else if (nil_matches)
      96         275 :                                 BINARY_3TYPE_FUNC_nilmatch(bte, bte, TPE, OP);
      97             : #endif
      98             :                         else
      99    15342915 :                                 BINARY_3TYPE_FUNC(bte, bte, TPE, OP);
     100             :                         break;
     101           0 :                 case TYPE_sht:
     102           0 :                         if (nonil)
     103           0 :                                 BINARY_3TYPE_FUNC_nonil(bte, sht, TPE, OP);
     104             : #ifdef NIL_MATCHES_FLAG
     105           0 :                         else if (nil_matches)
     106           0 :                                 BINARY_3TYPE_FUNC_nilmatch(bte, sht, TPE, OP);
     107             : #endif
     108             :                         else
     109           0 :                                 BINARY_3TYPE_FUNC(bte, sht, TPE, OP);
     110             :                         break;
     111           0 :                 case TYPE_int:
     112           0 :                         if (nonil)
     113           0 :                                 BINARY_3TYPE_FUNC_nonil(bte, int, TPE, OP);
     114             : #ifdef NIL_MATCHES_FLAG
     115           0 :                         else if (nil_matches)
     116           0 :                                 BINARY_3TYPE_FUNC_nilmatch(bte, int, TPE, OP);
     117             : #endif
     118             :                         else
     119           0 :                                 BINARY_3TYPE_FUNC(bte, int, TPE, OP);
     120             :                         break;
     121           0 :                 case TYPE_lng:
     122           0 :                         if (nonil)
     123           0 :                                 BINARY_3TYPE_FUNC_nonil(bte, lng, TPE, OP);
     124             : #ifdef NIL_MATCHES_FLAG
     125           0 :                         else if (nil_matches)
     126           0 :                                 BINARY_3TYPE_FUNC_nilmatch(bte, lng, TPE, OP);
     127             : #endif
     128             :                         else
     129           0 :                                 BINARY_3TYPE_FUNC(bte, lng, TPE, OP);
     130             :                         break;
     131             : #ifdef HAVE_HGE
     132           0 :                 case TYPE_hge:
     133           0 :                         if (nonil)
     134           0 :                                 BINARY_3TYPE_FUNC_nonil(bte, hge, TPE, OP);
     135             : #ifdef NIL_MATCHES_FLAG
     136           0 :                         else if (nil_matches)
     137           0 :                                 BINARY_3TYPE_FUNC_nilmatch(bte, hge, TPE, OP);
     138             : #endif
     139             :                         else
     140           0 :                                 BINARY_3TYPE_FUNC(bte, hge, TPE, OP);
     141             :                         break;
     142             : #endif
     143           0 :                 case TYPE_flt:
     144           0 :                         if (nonil)
     145           0 :                                 BINARY_3TYPE_FUNC_nonil(bte, flt, TPE, OP);
     146             : #ifdef NIL_MATCHES_FLAG
     147           0 :                         else if (nil_matches)
     148           0 :                                 BINARY_3TYPE_FUNC_nilmatch(bte, flt, TPE, OP);
     149             : #endif
     150             :                         else
     151           0 :                                 BINARY_3TYPE_FUNC(bte, flt, TPE, OP);
     152             :                         break;
     153           0 :                 case TYPE_dbl:
     154           0 :                         if (nonil)
     155           0 :                                 BINARY_3TYPE_FUNC_nonil(bte, dbl, TPE, OP);
     156             : #ifdef NIL_MATCHES_FLAG
     157           0 :                         else if (nil_matches)
     158           0 :                                 BINARY_3TYPE_FUNC_nilmatch(bte, dbl, TPE, OP);
     159             : #endif
     160             :                         else
     161           0 :                                 BINARY_3TYPE_FUNC(bte, dbl, TPE, OP);
     162             :                         break;
     163           0 :                 default:
     164           0 :                         goto unsupported;
     165             :                 }
     166             :                 break;
     167         817 :         case TYPE_sht:
     168         817 :                 switch (tp2) {
     169           0 :                 case TYPE_bte:
     170           0 :                         if (nonil)
     171           0 :                                 BINARY_3TYPE_FUNC_nonil(sht, bte, TPE, OP);
     172             : #ifdef NIL_MATCHES_FLAG
     173           0 :                         else if (nil_matches)
     174           0 :                                 BINARY_3TYPE_FUNC_nilmatch(sht, bte, TPE, OP);
     175             : #endif
     176             :                         else
     177           0 :                                 BINARY_3TYPE_FUNC(sht, bte, TPE, OP);
     178             :                         break;
     179             :                 case TYPE_sht:
     180         817 :                 shtsht:
     181         817 :                         if (nonil)
     182       38875 :                                 BINARY_3TYPE_FUNC_nonil(sht, sht, TPE, OP);
     183             : #ifdef NIL_MATCHES_FLAG
     184         465 :                         else if (nil_matches)
     185          24 :                                 BINARY_3TYPE_FUNC_nilmatch(sht, sht, TPE, OP);
     186             : #endif
     187             :                         else
     188      209293 :                                 BINARY_3TYPE_FUNC(sht, sht, TPE, OP);
     189             :                         break;
     190           0 :                 case TYPE_int:
     191           0 :                         if (nonil)
     192           0 :                                 BINARY_3TYPE_FUNC_nonil(sht, int, TPE, OP);
     193             : #ifdef NIL_MATCHES_FLAG
     194           0 :                         else if (nil_matches)
     195           0 :                                 BINARY_3TYPE_FUNC_nilmatch(sht, int, TPE, OP);
     196             : #endif
     197             :                         else
     198           0 :                                 BINARY_3TYPE_FUNC(sht, int, TPE, OP);
     199             :                         break;
     200           0 :                 case TYPE_lng:
     201           0 :                         if (nonil)
     202           0 :                                 BINARY_3TYPE_FUNC_nonil(sht, lng, TPE, OP);
     203             : #ifdef NIL_MATCHES_FLAG
     204           0 :                         else if (nil_matches)
     205           0 :                                 BINARY_3TYPE_FUNC_nilmatch(sht, lng, TPE, OP);
     206             : #endif
     207             :                         else
     208           0 :                                 BINARY_3TYPE_FUNC(sht, lng, TPE, OP);
     209             :                         break;
     210             : #ifdef HAVE_HGE
     211           0 :                 case TYPE_hge:
     212           0 :                         if (nonil)
     213           0 :                                 BINARY_3TYPE_FUNC_nonil(sht, hge, TPE, OP);
     214             : #ifdef NIL_MATCHES_FLAG
     215           0 :                         else if (nil_matches)
     216           0 :                                 BINARY_3TYPE_FUNC_nilmatch(sht, hge, TPE, OP);
     217             : #endif
     218             :                         else
     219           0 :                                 BINARY_3TYPE_FUNC(sht, hge, TPE, OP);
     220             :                         break;
     221             : #endif
     222           0 :                 case TYPE_flt:
     223           0 :                         if (nonil)
     224           0 :                                 BINARY_3TYPE_FUNC_nonil(sht, flt, TPE, OP);
     225             : #ifdef NIL_MATCHES_FLAG
     226           0 :                         else if (nil_matches)
     227           0 :                                 BINARY_3TYPE_FUNC_nilmatch(sht, flt, TPE, OP);
     228             : #endif
     229             :                         else
     230           0 :                                 BINARY_3TYPE_FUNC(sht, flt, TPE, OP);
     231             :                         break;
     232           0 :                 case TYPE_dbl:
     233           0 :                         if (nonil)
     234           0 :                                 BINARY_3TYPE_FUNC_nonil(sht, dbl, TPE, OP);
     235             : #ifdef NIL_MATCHES_FLAG
     236           0 :                         else if (nil_matches)
     237           0 :                                 BINARY_3TYPE_FUNC_nilmatch(sht, dbl, TPE, OP);
     238             : #endif
     239             :                         else
     240           0 :                                 BINARY_3TYPE_FUNC(sht, dbl, TPE, OP);
     241             :                         break;
     242           0 :                 default:
     243           0 :                         goto unsupported;
     244             :                 }
     245             :                 break;
     246       91382 :         case TYPE_int:
     247       91382 :                 switch (tp2) {
     248           0 :                 case TYPE_bte:
     249           0 :                         if (nonil)
     250           0 :                                 BINARY_3TYPE_FUNC_nonil(int, bte, TPE, OP);
     251             : #ifdef NIL_MATCHES_FLAG
     252           0 :                         else if (nil_matches)
     253           0 :                                 BINARY_3TYPE_FUNC_nilmatch(int, bte, TPE, OP);
     254             : #endif
     255             :                         else
     256           0 :                                 BINARY_3TYPE_FUNC(int, bte, TPE, OP);
     257             :                         break;
     258           0 :                 case TYPE_sht:
     259           0 :                         if (nonil)
     260           0 :                                 BINARY_3TYPE_FUNC_nonil(int, sht, TPE, OP);
     261             : #ifdef NIL_MATCHES_FLAG
     262           0 :                         else if (nil_matches)
     263           0 :                                 BINARY_3TYPE_FUNC_nilmatch(int, sht, TPE, OP);
     264             : #endif
     265             :                         else
     266           0 :                                 BINARY_3TYPE_FUNC(int, sht, TPE, OP);
     267             :                         break;
     268             :                 case TYPE_int:
     269       91382 :                 intint:
     270       91382 :                         if (nonil)
     271   105767453 :                                 BINARY_3TYPE_FUNC_nonil(int, int, TPE, OP);
     272             : #ifdef NIL_MATCHES_FLAG
     273       66888 :                         else if (nil_matches)
     274     1465320 :                                 BINARY_3TYPE_FUNC_nilmatch(int, int, TPE, OP);
     275             : #endif
     276             :                         else
     277    21489068 :                                 BINARY_3TYPE_FUNC(int, int, TPE, OP);
     278             :                         break;
     279           0 :                 case TYPE_lng:
     280           0 :                         if (nonil)
     281           0 :                                 BINARY_3TYPE_FUNC_nonil(int, lng, TPE, OP);
     282             : #ifdef NIL_MATCHES_FLAG
     283           0 :                         else if (nil_matches)
     284           0 :                                 BINARY_3TYPE_FUNC_nilmatch(int, lng, TPE, OP);
     285             : #endif
     286             :                         else
     287           0 :                                 BINARY_3TYPE_FUNC(int, lng, TPE, OP);
     288             :                         break;
     289             : #ifdef HAVE_HGE
     290           0 :                 case TYPE_hge:
     291           0 :                         if (nonil)
     292           0 :                                 BINARY_3TYPE_FUNC_nonil(int, hge, TPE, OP);
     293             : #ifdef NIL_MATCHES_FLAG
     294           0 :                         else if (nil_matches)
     295           0 :                                 BINARY_3TYPE_FUNC_nilmatch(int, hge, TPE, OP);
     296             : #endif
     297             :                         else
     298           0 :                                 BINARY_3TYPE_FUNC(int, hge, TPE, OP);
     299             :                         break;
     300             : #endif
     301           0 :                 case TYPE_flt:
     302           0 :                         if (nonil)
     303           0 :                                 BINARY_3TYPE_FUNC_nonil(int, flt, TPE, OP);
     304             : #ifdef NIL_MATCHES_FLAG
     305           0 :                         else if (nil_matches)
     306           0 :                                 BINARY_3TYPE_FUNC_nilmatch(int, flt, TPE, OP);
     307             : #endif
     308             :                         else
     309           0 :                                 BINARY_3TYPE_FUNC(int, flt, TPE, OP);
     310             :                         break;
     311           0 :                 case TYPE_dbl:
     312           0 :                         if (nonil)
     313           0 :                                 BINARY_3TYPE_FUNC_nonil(int, dbl, TPE, OP);
     314             : #ifdef NIL_MATCHES_FLAG
     315           0 :                         else if (nil_matches)
     316           0 :                                 BINARY_3TYPE_FUNC_nilmatch(int, dbl, TPE, OP);
     317             : #endif
     318             :                         else
     319           0 :                                 BINARY_3TYPE_FUNC(int, dbl, TPE, OP);
     320             :                         break;
     321           0 :                 default:
     322           0 :                         goto unsupported;
     323             :                 }
     324             :                 break;
     325       35695 :         case TYPE_lng:
     326       35695 :                 switch (tp2) {
     327           0 :                 case TYPE_bte:
     328           0 :                         if (nonil)
     329           0 :                                 BINARY_3TYPE_FUNC_nonil(lng, bte, TPE, OP);
     330             : #ifdef NIL_MATCHES_FLAG
     331           0 :                         else if (nil_matches)
     332           0 :                                 BINARY_3TYPE_FUNC_nilmatch(lng, bte, TPE, OP);
     333             : #endif
     334             :                         else
     335           0 :                                 BINARY_3TYPE_FUNC(lng, bte, TPE, OP);
     336             :                         break;
     337           0 :                 case TYPE_sht:
     338           0 :                         if (nonil)
     339           0 :                                 BINARY_3TYPE_FUNC_nonil(lng, sht, TPE, OP);
     340             : #ifdef NIL_MATCHES_FLAG
     341           0 :                         else if (nil_matches)
     342           0 :                                 BINARY_3TYPE_FUNC_nilmatch(lng, sht, TPE, OP);
     343             : #endif
     344             :                         else
     345           0 :                                 BINARY_3TYPE_FUNC(lng, sht, TPE, OP);
     346             :                         break;
     347           0 :                 case TYPE_int:
     348           0 :                         if (nonil)
     349           0 :                                 BINARY_3TYPE_FUNC_nonil(lng, int, TPE, OP);
     350             : #ifdef NIL_MATCHES_FLAG
     351           0 :                         else if (nil_matches)
     352           0 :                                 BINARY_3TYPE_FUNC_nilmatch(lng, int, TPE, OP);
     353             : #endif
     354             :                         else
     355           0 :                                 BINARY_3TYPE_FUNC(lng, int, TPE, OP);
     356             :                         break;
     357             :                 case TYPE_lng:
     358       35695 :                 lnglng:
     359       35695 :                         if (nonil)
     360    12625506 :                                 BINARY_3TYPE_FUNC_nonil(lng, lng, TPE, OP);
     361             : #ifdef NIL_MATCHES_FLAG
     362       21895 :                         else if (nil_matches)
     363          22 :                                 BINARY_3TYPE_FUNC_nilmatch(lng, lng, TPE, OP);
     364             : #endif
     365             :                         else
     366     5334206 :                                 BINARY_3TYPE_FUNC(lng, lng, TPE, OP);
     367             :                         break;
     368             : #ifdef HAVE_HGE
     369           0 :                 case TYPE_hge:
     370           0 :                         if (nonil)
     371           0 :                                 BINARY_3TYPE_FUNC_nonil(lng, hge, TPE, OP);
     372             : #ifdef NIL_MATCHES_FLAG
     373           0 :                         else if (nil_matches)
     374           0 :                                 BINARY_3TYPE_FUNC_nilmatch(lng, hge, TPE, OP);
     375             : #endif
     376             :                         else
     377           0 :                                 BINARY_3TYPE_FUNC(lng, hge, TPE, OP);
     378             :                         break;
     379             : #endif
     380           0 :                 case TYPE_flt:
     381           0 :                         if (nonil)
     382           0 :                                 BINARY_3TYPE_FUNC_nonil(lng, flt, TPE, OP);
     383             : #ifdef NIL_MATCHES_FLAG
     384           0 :                         else if (nil_matches)
     385           0 :                                 BINARY_3TYPE_FUNC_nilmatch(lng, flt, TPE, OP);
     386             : #endif
     387             :                         else
     388           0 :                                 BINARY_3TYPE_FUNC(lng, flt, TPE, OP);
     389             :                         break;
     390           0 :                 case TYPE_dbl:
     391           0 :                         if (nonil)
     392           0 :                                 BINARY_3TYPE_FUNC_nonil(lng, dbl, TPE, OP);
     393             : #ifdef NIL_MATCHES_FLAG
     394           0 :                         else if (nil_matches)
     395           0 :                                 BINARY_3TYPE_FUNC_nilmatch(lng, dbl, TPE, OP);
     396             : #endif
     397             :                         else
     398           0 :                                 BINARY_3TYPE_FUNC(lng, dbl, TPE, OP);
     399             :                         break;
     400           0 :                 default:
     401           0 :                         goto unsupported;
     402             :                 }
     403             :                 break;
     404             : #ifdef HAVE_HGE
     405         597 :         case TYPE_hge:
     406         597 :                 switch (tp2) {
     407           0 :                 case TYPE_bte:
     408           0 :                         if (nonil)
     409           0 :                                 BINARY_3TYPE_FUNC_nonil(hge, bte, TPE, OP);
     410             : #ifdef NIL_MATCHES_FLAG
     411           0 :                         else if (nil_matches)
     412           0 :                                 BINARY_3TYPE_FUNC_nilmatch(hge, bte, TPE, OP);
     413             : #endif
     414             :                         else
     415           0 :                                 BINARY_3TYPE_FUNC(hge, bte, TPE, OP);
     416             :                         break;
     417           0 :                 case TYPE_sht:
     418           0 :                         if (nonil)
     419           0 :                                 BINARY_3TYPE_FUNC_nonil(hge, sht, TPE, OP);
     420             : #ifdef NIL_MATCHES_FLAG
     421           0 :                         else if (nil_matches)
     422           0 :                                 BINARY_3TYPE_FUNC_nilmatch(hge, sht, TPE, OP);
     423             : #endif
     424             :                         else
     425           0 :                                 BINARY_3TYPE_FUNC(hge, sht, TPE, OP);
     426             :                         break;
     427           0 :                 case TYPE_int:
     428           0 :                         if (nonil)
     429           0 :                                 BINARY_3TYPE_FUNC_nonil(hge, int, TPE, OP);
     430             : #ifdef NIL_MATCHES_FLAG
     431           0 :                         else if (nil_matches)
     432           0 :                                 BINARY_3TYPE_FUNC_nilmatch(hge, int, TPE, OP);
     433             : #endif
     434             :                         else
     435           0 :                                 BINARY_3TYPE_FUNC(hge, int, TPE, OP);
     436             :                         break;
     437           0 :                 case TYPE_lng:
     438           0 :                         if (nonil)
     439           0 :                                 BINARY_3TYPE_FUNC_nonil(hge, lng, TPE, OP);
     440             : #ifdef NIL_MATCHES_FLAG
     441           0 :                         else if (nil_matches)
     442           0 :                                 BINARY_3TYPE_FUNC_nilmatch(hge, lng, TPE, OP);
     443             : #endif
     444             :                         else
     445           0 :                                 BINARY_3TYPE_FUNC(hge, lng, TPE, OP);
     446             :                         break;
     447             :                 case TYPE_hge:
     448         597 :                 hgehge:
     449         597 :                         if (nonil)
     450    34389741 :                                 BINARY_3TYPE_FUNC_nonil(hge, hge, TPE, OP);
     451             : #ifdef NIL_MATCHES_FLAG
     452         138 :                         else if (nil_matches)
     453          34 :                                 BINARY_3TYPE_FUNC_nilmatch(hge, hge, TPE, OP);
     454             : #endif
     455             :                         else
     456     4743908 :                                 BINARY_3TYPE_FUNC(hge, hge, TPE, OP);
     457             :                         break;
     458           0 :                 case TYPE_flt:
     459           0 :                         if (nonil)
     460           0 :                                 BINARY_3TYPE_FUNC_nonil(hge, flt, TPE, OP);
     461             : #ifdef NIL_MATCHES_FLAG
     462           0 :                         else if (nil_matches)
     463           0 :                                 BINARY_3TYPE_FUNC_nilmatch(hge, flt, TPE, OP);
     464             : #endif
     465             :                         else
     466           0 :                                 BINARY_3TYPE_FUNC(hge, flt, TPE, OP);
     467             :                         break;
     468           0 :                 case TYPE_dbl:
     469           0 :                         if (nonil)
     470           0 :                                 BINARY_3TYPE_FUNC_nonil(hge, dbl, TPE, OP);
     471             : #ifdef NIL_MATCHES_FLAG
     472           0 :                         else if (nil_matches)
     473           0 :                                 BINARY_3TYPE_FUNC_nilmatch(hge, dbl, TPE, OP);
     474             : #endif
     475             :                         else
     476           0 :                                 BINARY_3TYPE_FUNC(hge, dbl, TPE, OP);
     477             :                         break;
     478           0 :                 default:
     479           0 :                         goto unsupported;
     480             :                 }
     481             :                 break;
     482             : #endif
     483          41 :         case TYPE_flt:
     484          41 :                 switch (tp2) {
     485           0 :                 case TYPE_bte:
     486           0 :                         if (nonil)
     487           0 :                                 BINARY_3TYPE_FUNC_nonil(flt, bte, TPE, OP);
     488             : #ifdef NIL_MATCHES_FLAG
     489           0 :                         else if (nil_matches)
     490           0 :                                 BINARY_3TYPE_FUNC_nilmatch(flt, bte, TPE, OP);
     491             : #endif
     492             :                         else
     493           0 :                                 BINARY_3TYPE_FUNC(flt, bte, TPE, OP);
     494             :                         break;
     495           0 :                 case TYPE_sht:
     496           0 :                         if (nonil)
     497           0 :                                 BINARY_3TYPE_FUNC_nonil(flt, sht, TPE, OP);
     498             : #ifdef NIL_MATCHES_FLAG
     499           0 :                         else if (nil_matches)
     500           0 :                                 BINARY_3TYPE_FUNC_nilmatch(flt, sht, TPE, OP);
     501             : #endif
     502             :                         else
     503           0 :                                 BINARY_3TYPE_FUNC(flt, sht, TPE, OP);
     504             :                         break;
     505           0 :                 case TYPE_int:
     506           0 :                         if (nonil)
     507           0 :                                 BINARY_3TYPE_FUNC_nonil(flt, int, TPE, OP);
     508             : #ifdef NIL_MATCHES_FLAG
     509           0 :                         else if (nil_matches)
     510           0 :                                 BINARY_3TYPE_FUNC_nilmatch(flt, int, TPE, OP);
     511             : #endif
     512             :                         else
     513           0 :                                 BINARY_3TYPE_FUNC(flt, int, TPE, OP);
     514             :                         break;
     515           0 :                 case TYPE_lng:
     516           0 :                         if (nonil)
     517           0 :                                 BINARY_3TYPE_FUNC_nonil(flt, lng, TPE, OP);
     518             : #ifdef NIL_MATCHES_FLAG
     519           0 :                         else if (nil_matches)
     520           0 :                                 BINARY_3TYPE_FUNC_nilmatch(flt, lng, TPE, OP);
     521             : #endif
     522             :                         else
     523           0 :                                 BINARY_3TYPE_FUNC(flt, lng, TPE, OP);
     524             :                         break;
     525             : #ifdef HAVE_HGE
     526           0 :                 case TYPE_hge:
     527           0 :                         if (nonil)
     528           0 :                                 BINARY_3TYPE_FUNC_nonil(flt, hge, TPE, OP);
     529             : #ifdef NIL_MATCHES_FLAG
     530           0 :                         else if (nil_matches)
     531           0 :                                 BINARY_3TYPE_FUNC_nilmatch(flt, hge, TPE, OP);
     532             : #endif
     533             :                         else
     534           0 :                                 BINARY_3TYPE_FUNC(flt, hge, TPE, OP);
     535             :                         break;
     536             : #endif
     537             :                 case TYPE_flt:
     538          41 :                 fltflt:
     539          41 :                         if (nonil)
     540         220 :                                 BINARY_3TYPE_FUNC_nonil(flt, flt, TPE, OP);
     541             : #ifdef NIL_MATCHES_FLAG
     542          33 :                         else if (nil_matches)
     543           0 :                                 BINARY_3TYPE_FUNC_nilmatch(flt, flt, TPE, OP);
     544             : #endif
     545             :                         else
     546     1529610 :                                 BINARY_3TYPE_FUNC(flt, flt, TPE, OP);
     547             :                         break;
     548           0 :                 case TYPE_dbl:
     549           0 :                         if (nonil)
     550           0 :                                 BINARY_3TYPE_FUNC_nonil(flt, dbl, TPE, OP);
     551             : #ifdef NIL_MATCHES_FLAG
     552           0 :                         else if (nil_matches)
     553           0 :                                 BINARY_3TYPE_FUNC_nilmatch(flt, dbl, TPE, OP);
     554             : #endif
     555             :                         else
     556           0 :                                 BINARY_3TYPE_FUNC(flt, dbl, TPE, OP);
     557             :                         break;
     558           0 :                 default:
     559           0 :                         goto unsupported;
     560             :                 }
     561             :                 break;
     562        1212 :         case TYPE_dbl:
     563        1212 :                 switch (tp2) {
     564           0 :                 case TYPE_bte:
     565           0 :                         if (nonil)
     566           0 :                                 BINARY_3TYPE_FUNC_nonil(dbl, bte, TPE, OP);
     567             : #ifdef NIL_MATCHES_FLAG
     568           0 :                         else if (nil_matches)
     569           0 :                                 BINARY_3TYPE_FUNC_nilmatch(dbl, bte, TPE, OP);
     570             : #endif
     571             :                         else
     572           0 :                                 BINARY_3TYPE_FUNC(dbl, bte, TPE, OP);
     573             :                         break;
     574           0 :                 case TYPE_sht:
     575           0 :                         if (nonil)
     576           0 :                                 BINARY_3TYPE_FUNC_nonil(dbl, sht, TPE, OP);
     577             : #ifdef NIL_MATCHES_FLAG
     578           0 :                         else if (nil_matches)
     579           0 :                                 BINARY_3TYPE_FUNC_nilmatch(dbl, sht, TPE, OP);
     580             : #endif
     581             :                         else
     582           0 :                                 BINARY_3TYPE_FUNC(dbl, sht, TPE, OP);
     583             :                         break;
     584           0 :                 case TYPE_int:
     585           0 :                         if (nonil)
     586           0 :                                 BINARY_3TYPE_FUNC_nonil(dbl, int, TPE, OP);
     587             : #ifdef NIL_MATCHES_FLAG
     588           0 :                         else if (nil_matches)
     589           0 :                                 BINARY_3TYPE_FUNC_nilmatch(dbl, int, TPE, OP);
     590             : #endif
     591             :                         else
     592           0 :                                 BINARY_3TYPE_FUNC(dbl, int, TPE, OP);
     593             :                         break;
     594           0 :                 case TYPE_lng:
     595           0 :                         if (nonil)
     596           0 :                                 BINARY_3TYPE_FUNC_nonil(dbl, lng, TPE, OP);
     597             : #ifdef NIL_MATCHES_FLAG
     598           0 :                         else if (nil_matches)
     599           0 :                                 BINARY_3TYPE_FUNC_nilmatch(dbl, lng, TPE, OP);
     600             : #endif
     601             :                         else
     602           0 :                                 BINARY_3TYPE_FUNC(dbl, lng, TPE, OP);
     603             :                         break;
     604             : #ifdef HAVE_HGE
     605           0 :                 case TYPE_hge:
     606           0 :                         if (nonil)
     607           0 :                                 BINARY_3TYPE_FUNC_nonil(dbl, hge, TPE, OP);
     608             : #ifdef NIL_MATCHES_FLAG
     609           0 :                         else if (nil_matches)
     610           0 :                                 BINARY_3TYPE_FUNC_nilmatch(dbl, hge, TPE, OP);
     611             : #endif
     612             :                         else
     613           0 :                                 BINARY_3TYPE_FUNC(dbl, hge, TPE, OP);
     614             :                         break;
     615             : #endif
     616           0 :                 case TYPE_flt:
     617           0 :                         if (nonil)
     618           0 :                                 BINARY_3TYPE_FUNC_nonil(dbl, flt, TPE, OP);
     619             : #ifdef NIL_MATCHES_FLAG
     620           0 :                         else if (nil_matches)
     621           0 :                                 BINARY_3TYPE_FUNC_nilmatch(dbl, flt, TPE, OP);
     622             : #endif
     623             :                         else
     624           0 :                                 BINARY_3TYPE_FUNC(dbl, flt, TPE, OP);
     625             :                         break;
     626             :                 case TYPE_dbl:
     627        1212 :                 dbldbl:
     628        1212 :                         if (nonil)
     629     7148836 :                                 BINARY_3TYPE_FUNC_nonil(dbl, dbl, TPE, OP);
     630             : #ifdef NIL_MATCHES_FLAG
     631         106 :                         else if (nil_matches)
     632          42 :                                 BINARY_3TYPE_FUNC_nilmatch(dbl, dbl, TPE, OP);
     633             : #endif
     634             :                         else
     635     1573288 :                                 BINARY_3TYPE_FUNC(dbl, dbl, TPE, OP);
     636             :                         break;
     637           0 :                 default:
     638           0 :                         goto unsupported;
     639             :                 }
     640             :                 break;
     641           5 :         case TYPE_oid:
     642           5 :                 if (tp2 == TYPE_void) {
     643           0 :                         oid v = * (const oid *) rgt;
     644           0 :                         TIMEOUT_LOOP_IDX(k, ncand, timeoffset) {
     645           0 :                                 if (incr1)
     646           0 :                                         i = canditer_next(ci1) - candoff1;
     647           0 :                                 j = canditer_next(ci2) - candoff2;
     648           0 :                                 if (is_oid_nil(v)) {
     649             : #ifdef NIL_MATCHES_FLAG
     650           0 :                                         if (nil_matches) {
     651           0 :                                                 dst[k] = OP(is_oid_nil(((const oid *) lft)[i]), true);
     652             :                                         } else
     653             : #endif
     654             :                                         {
     655           0 :                                                 dst[k] = TPE_nil;
     656           0 :                                                 nils++;
     657             :                                         }
     658             :                                 } else {
     659           0 :                                         if (is_oid_nil(((const oid *) lft)[i])) {
     660             : #ifdef NIL_MATCHES_FLAG
     661           0 :                                                 if (nil_matches) {
     662           0 :                                                         dst[k] = OP(true, false);
     663             :                                                 } else
     664             : #endif
     665             :                                                 {
     666           0 :                                                         nils++;
     667           0 :                                                         dst[k] = TPE_nil;
     668             :                                                 }
     669             :                                         } else {
     670           0 :                                                 dst[k] = OP(((const oid *) lft)[i], v + j);
     671             :                                         }
     672             :                                 }
     673             :                         }
     674           0 :                         TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));
     675           5 :                 } else if (tp2 == TYPE_oid) {
     676           5 :                         if (nonil)
     677          37 :                                 BINARY_3TYPE_FUNC_nonil(oid, oid, TPE, OP);
     678             : #ifdef NIL_MATCHES_FLAG
     679           0 :                         else if (nil_matches)
     680           0 :                                 BINARY_3TYPE_FUNC_nilmatch(oid, oid, TPE, OP);
     681             : #endif
     682             :                         else
     683           0 :                                 BINARY_3TYPE_FUNC(oid, oid, TPE, OP);
     684             :                 } else {
     685           0 :                         goto unsupported;
     686             :                 }
     687             :                 break;
     688     1162211 :         case TYPE_str:
     689     1162211 :                 if (tp1 != tp2)
     690           0 :                         goto unsupported;
     691    22817666 :                 TIMEOUT_LOOP_IDX(k, ncand, timeoffset) {
     692    19328340 :                         if (incr1)
     693    18157781 :                                 i = canditer_next(ci1) - candoff1;
     694    19326540 :                         if (incr2)
     695     5868288 :                                 j = canditer_next(ci2) - candoff2;
     696    19326271 :                         const char *s1, *s2;
     697    19326271 :                         s1 = hp1 ? hp1 + VarHeapVal(lft, i, wd1) : (const char *) lft;
     698    19325471 :                         s2 = hp2 ? hp2 + VarHeapVal(rgt, j, wd2) : (const char *) rgt;
     699    38634450 :                         if (strNil(s1) || strNil(s2)) {
     700             : #ifdef NIL_MATCHES_FLAG
     701       57160 :                                 if (nil_matches) {
     702        4092 :                                         dst[k] = OP(strNil(s1), strNil(s2));
     703             :                                 } else
     704             : #endif
     705             :                                 {
     706       55859 :                                         nils++;
     707       55859 :                                         dst[k] = TPE_nil;
     708             :                                 }
     709             :                         } else {
     710    19271115 :                                 int x = strcmp(s1, s2);
     711    19271115 :                                 dst[k] = OP(x, 0);
     712             :                         }
     713             :                 }
     714     1162210 :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));
     715             :                 break;
     716          30 :         default:
     717          30 :                 if (tp1 != tp2 ||
     718          30 :                     !ATOMlinear(tp1) ||
     719          30 :                     (atomcmp = ATOMcompare(tp1)) == NULL)
     720           0 :                         goto unsupported;
     721             :                 /* a bit of a hack: for inherited types, use
     722             :                  * type-expanded version if comparison function is
     723             :                  * equal to the inherited-from comparison function,
     724             :                  * and yes, we jump right into the middle of a switch,
     725             :                  * but that is legal (although not encouraged) C */
     726          30 :                 if (atomcmp == ATOMcompare(TYPE_bte))
     727           0 :                         goto btebte;
     728          30 :                 if (atomcmp == ATOMcompare(TYPE_sht))
     729           0 :                         goto shtsht;
     730          30 :                 if (atomcmp == ATOMcompare(TYPE_int))
     731           0 :                         goto intint;
     732          30 :                 if (atomcmp == ATOMcompare(TYPE_lng))
     733           0 :                         goto lnglng;
     734             : #ifdef HAVE_HGE
     735          30 :                 if (atomcmp == ATOMcompare(TYPE_hge))
     736           0 :                         goto hgehge;
     737             : #endif
     738          30 :                 if (atomcmp == ATOMcompare(TYPE_flt))
     739           0 :                         goto fltflt;
     740          30 :                 if (atomcmp == ATOMcompare(TYPE_dbl))
     741           0 :                         goto dbldbl;
     742          30 :                 nil = ATOMnilptr(tp1);
     743         204 :                 TIMEOUT_LOOP_IDX(k, ncand, timeoffset) {
     744         114 :                         if (incr1)
     745         105 :                                 i = canditer_next(ci1) - candoff1;
     746         114 :                         if (incr2)
     747         106 :                                 j = canditer_next(ci2) - candoff2;
     748         114 :                         const void *p1, *p2;
     749         228 :                         p1 = hp1
     750          40 :                                 ? (const void *) (hp1 + VarHeapVal(lft, i, wd1))
     751         154 :                                 : (const void *) ((const char *) lft + i * wd1);
     752         228 :                         p2 = hp2
     753          40 :                                 ? (const void *) (hp2 + VarHeapVal(rgt, j, wd2))
     754         154 :                                 : (const void *) ((const char *) rgt + j * wd2);
     755         228 :                         if (p1 == NULL || p2 == NULL ||
     756         224 :                             (*atomcmp)(p1, nil) == 0 ||
     757         110 :                             (*atomcmp)(p2, nil) == 0) {
     758             : #ifdef NIL_MATCHES_FLAG
     759          48 :                                 if (nil_matches) {
     760           0 :                                         dst[k] = OP(p1 == NULL || (*atomcmp)(p1, nil) == 0,
     761             :                                                     p2 == NULL || (*atomcmp)(p2, nil) == 0);
     762             :                                 } else
     763             : #endif
     764             :                                 {
     765          49 :                                         nils++;
     766          49 :                                         dst[k] = TPE_nil;
     767             :                                 }
     768             :                         } else {
     769          65 :                                 int x = (*atomcmp)(p1, p2);
     770          65 :                                 dst[k] = OP(x, 0);
     771             :                         }
     772             :                 }
     773          30 :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));
     774             :                 break;
     775             :         }
     776             : 
     777             :         return nils;
     778             : 
     779           0 :   unsupported:
     780           0 :         GDKerror("%s: bad input types %s,%s.\n", func,
     781             :                  ATOMname(tp1), ATOMname(tp2));
     782           0 :         return BUN_NONE;
     783             : }
     784             : 
     785             : static BAT *
     786       50935 : BATcalcop_intern(const void *lft, int tp1, bool incr1, const char *hp1, int wd1,
     787             :                  const void *rgt, int tp2, bool incr2, const char *hp2, int wd2,
     788             :                  struct canditer *restrict ci1, struct canditer *restrict ci2,
     789             :                  oid candoff1, oid candoff2, bool nonil, oid seqbase,
     790             : #ifdef NIL_MATCHES_FLAG
     791             :                  bool nil_matches,
     792             : #endif
     793             :                  const char *func)
     794             : {
     795       50935 :         BAT *bn;
     796       50935 :         BUN nils = 0, ncand = ci1->ncand;
     797       50935 :         TPE *restrict dst;
     798             : 
     799       50935 :         bn = COLnew(seqbase, TYPE_TPE, ncand, TRANSIENT);
     800       50935 :         if (bn == NULL)
     801             :                 return NULL;
     802             : 
     803       50935 :         dst = (TPE *) Tloc(bn, 0);
     804             : 
     805       50935 :         nils = op_typeswitchloop(lft, tp1, incr1, hp1, wd1,
     806             :                                  rgt, tp2, incr2, hp2, wd2,
     807             :                                  dst, ci1, ci2, candoff1, candoff2,
     808             :                                  nonil,
     809             : #ifdef NIL_MATCHES_FLAG
     810             :                                  nil_matches,
     811             : #endif
     812             :                                  func);
     813             : 
     814       50928 :         if (nils == BUN_NONE) {
     815           0 :                 BBPunfix(bn->batCacheid);
     816           0 :                 return NULL;
     817             :         }
     818             : 
     819       50928 :         BATsetcount(bn, ncand);
     820             : 
     821       50928 :         bn->tsorted = ncand <= 1 || nils == ncand;
     822       50928 :         bn->trevsorted = ncand <= 1 || nils == ncand;
     823       50928 :         bn->tkey = ncand <= 1;
     824       50928 :         bn->tnil = nils != 0;
     825       50928 :         bn->tnonil = nils == 0;
     826             : 
     827       50928 :         return bn;
     828             : }
     829             : 
     830             : BAT *
     831       76800 : BATcalcop(BAT *b1, BAT *b2, BAT *s1, BAT *s2
     832             : #ifdef NIL_MATCHES_FLAG
     833             :           , bool nil_matches
     834             : #endif
     835             :         )
     836             : {
     837       76800 :         struct canditer ci1, ci2;
     838             : 
     839       76800 :         BATcheck(b1, NULL);
     840       76800 :         BATcheck(b2, NULL);
     841             : 
     842       76800 :         canditer_init(&ci1, b1, s1);
     843       76785 :         canditer_init(&ci2, b2, s2);
     844       76790 :         if (ci1.ncand != ci2.ncand || ci1.hseq != ci2.hseq) {
     845           0 :                 GDKerror("inputs not the same size.\n");
     846           0 :                 return NULL;
     847             :         }
     848       76790 :         if (ci1.ncand == 0)
     849       29437 :                 return COLnew(ci1.hseq, TYPE_TPE, 0, TRANSIENT);
     850             : 
     851       47353 :         if (BATtvoid(b1) && BATtvoid(b2) && ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
     852           4 :                 TPE res;
     853             : 
     854           4 :                 if ((is_oid_nil(b1->tseqbase) || is_oid_nil(b2->tseqbase))
     855             : #ifdef NIL_MATCHES_FLAG
     856           0 :                     && !nil_matches
     857             : #endif
     858             :                    )
     859           0 :                         res = TPE_nil;
     860             :                 else
     861           4 :                         res = OP(b1->tseqbase + ci1.seq, b2->tseqbase + ci2.seq);
     862             : 
     863           4 :                 return BATconstant(b1->hseqbase, TYPE_TPE, &res, ci1.ncand, TRANSIENT);
     864             :         }
     865             : 
     866       47349 :         BATiter b1i = bat_iterator(b1);
     867       47348 :         BATiter b2i = bat_iterator(b2);
     868       99937 :         BAT *bn = BATcalcop_intern(b1i.type == TYPE_void ? (const void *) &b1->tseqbase : (const void *) b1i.base,
     869       47354 :                                 ATOMtype(b1i.type) == TYPE_oid ? b1i.type : ATOMbasetype(b1i.type),
     870             :                                 true,
     871       47354 :                                 b1->tvheap ? b1->tvheap->base : NULL,
     872       47354 :                                 b1i.width,
     873             :                                 b2i.type == TYPE_void ? (const void *) &b2->tseqbase : (const void *) b2i.base,
     874       47354 :                                 ATOMtype(b2i.type) == TYPE_oid ? b2i.type : ATOMbasetype(b2i.type),
     875             :                                 true,
     876       47354 :                                 b2->tvheap ? b2->tvheap->base : NULL,
     877       47354 :                                 b2i.width,
     878             :                                 &ci1, &ci2,
     879             :                                 b1->hseqbase, b2->hseqbase,
     880       47354 :                                 b1i.nonil && b2i.nonil,
     881             :                                 ci1.hseq,
     882             : #ifdef NIL_MATCHES_FLAG
     883             :                                 nil_matches,
     884             : #endif
     885             :                                 __func__);
     886       47347 :         bat_iterator_end(&b1i);
     887       47352 :         bat_iterator_end(&b2i);
     888       47352 :         return bn;
     889             : }
     890             : 
     891             : BAT *
     892        9534 : BATcalcopcst(BAT *b, const ValRecord *v, BAT *s
     893             : #ifdef NIL_MATCHES_FLAG
     894             :           , bool nil_matches
     895             : #endif
     896             :         )
     897             : {
     898        9534 :         struct canditer ci;
     899             : 
     900        9534 :         BATcheck(b, NULL);
     901             : 
     902        9534 :         canditer_init(&ci, b, s);
     903        9534 :         if (ci.ncand == 0)
     904        6206 :                 return COLnew(ci.hseq, TYPE_TPE, 0, TRANSIENT);
     905             : 
     906        3328 :         BATiter bi = bat_iterator(b);
     907        4314 :         BAT *bn = BATcalcop_intern(bi.type == TYPE_void ? (const void *) &b->tseqbase : (const void *) bi.base,
     908        3328 :                                 ATOMtype(bi.type) == TYPE_oid ? bi.type : ATOMbasetype(bi.type),
     909             :                                 true,
     910        3328 :                                 bi.vh ? bi.vh->base : NULL,
     911        3328 :                                 bi.width,
     912             :                                 VALptr(v),
     913        3328 :                                 ATOMtype(v->vtype) == TYPE_oid ? v->vtype : ATOMbasetype(v->vtype),
     914             :                                 false,
     915             :                                 NULL,
     916             :                                 0,
     917             :                                 &ci,
     918        3328 :                                 &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
     919             :                                 b->hseqbase, 0,
     920        3328 :                                 bi.nonil && ATOMcmp(v->vtype, VALptr(v), ATOMnilptr(v->vtype)) != 0,
     921             :                                 ci.hseq,
     922             : #ifdef NIL_MATCHES_FLAG
     923             :                                 nil_matches,
     924             : #endif
     925             :                                 __func__);
     926        3324 :         bat_iterator_end(&bi);
     927        3324 :         return bn;
     928             : }
     929             : 
     930             : BAT *
     931         275 : BATcalccstop(const ValRecord *v, BAT *b, BAT *s
     932             : #ifdef NIL_MATCHES_FLAG
     933             :           , bool nil_matches
     934             : #endif
     935             :         )
     936             : {
     937         275 :         struct canditer ci;
     938             : 
     939         275 :         BATcheck(b, NULL);
     940             : 
     941         275 :         canditer_init(&ci, b, s);
     942         275 :         if (ci.ncand == 0)
     943          21 :                 return COLnew(ci.hseq, TYPE_TPE, 0, TRANSIENT);
     944             : 
     945         254 :         BATiter bi = bat_iterator(b);
     946         559 :         BAT *bn = BATcalcop_intern(VALptr(v),
     947         254 :                                 ATOMtype(v->vtype) == TYPE_oid ? v->vtype : ATOMbasetype(v->vtype),
     948             :                                 false,
     949             :                                 NULL,
     950             :                                 0,
     951             :                                 bi.type == TYPE_void ? (const void *) &b->tseqbase : (const void *) bi.base,
     952         254 :                                 ATOMtype(bi.type) == TYPE_oid ? bi.type : ATOMbasetype(bi.type),
     953             :                                 true,
     954         254 :                                 bi.vh ? bi.vh->base : NULL,
     955         254 :                                 bi.width,
     956         254 :                                 &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
     957             :                                 &ci,
     958             :                                 0, b->hseqbase,
     959         254 :                                 bi.nonil && ATOMcmp(v->vtype, VALptr(v), ATOMnilptr(v->vtype)) != 0,
     960             :                                 ci.hseq,
     961             : #ifdef NIL_MATCHES_FLAG
     962             :                                 nil_matches,
     963             : #endif
     964             :                                 __func__);
     965         254 :         bat_iterator_end(&bi);
     966         254 :         return bn;
     967             : }
     968             : 
     969             : gdk_return
     970     1242334 : VARcalcop(ValPtr ret, const ValRecord *lft, const ValRecord *rgt
     971             : #ifdef NIL_MATCHES_FLAG
     972             :           , bool nil_matches
     973             : #endif
     974             :         )
     975             : {
     976     1242334 :         ret->vtype = TYPE_TPE;
     977     1242334 :         if (op_typeswitchloop(VALptr(lft),
     978     1242334 :                               ATOMtype(lft->vtype) == TYPE_oid ? lft->vtype : ATOMbasetype(lft->vtype),
     979             :                               false,
     980             :                               NULL,
     981             :                               0,
     982             :                               VALptr(rgt),
     983     1242334 :                               ATOMtype(rgt->vtype) == TYPE_oid ? rgt->vtype : ATOMbasetype(rgt->vtype),
     984             :                               false,
     985             :                               NULL,
     986             :                               0,
     987     1242334 :                               VALget(ret),
     988     1242334 :                               &(struct canditer){.tpe=cand_dense, .ncand=1},
     989     1242334 :                               &(struct canditer){.tpe=cand_dense, .ncand=1},
     990             :                               0, 0,
     991             :                               false,
     992             : #ifdef NIL_MATCHES_FLAG
     993             :                               nil_matches,
     994             : #endif
     995             :                               __func__) == BUN_NONE)
     996           0 :                 return GDK_FAIL;
     997     1242333 :         return GDK_SUCCEED;
     998             : }

Generated by: LCOV version 1.14