LCOV - code coverage report
Current view: top level - gdk - gdk_calc_addsub.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 465 1921 24.2 %
Date: 2024-04-26 00:35:57 Functions: 47 296 15.9 %

          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 "gdk.h"
      15             : #include "gdk_private.h"
      16             : #include "gdk_calc_private.h"
      17             : 
      18             : /* ---------------------------------------------------------------------- */
      19             : /* addition (any numeric type) */
      20             : 
      21             : #define ADD_3TYPE(TYPE1, TYPE2, TYPE3, IF)                              \
      22             : static BUN                                                              \
      23             : add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,           \
      24             :                                 const TYPE2 *rgt, bool incr2,           \
      25             :                                 TYPE3 *restrict dst, TYPE3 max,         \
      26             :                                 struct canditer *restrict ci1,          \
      27             :                                 struct canditer *restrict ci2,          \
      28             :                                 oid candoff1, oid candoff2)             \
      29             : {                                                                       \
      30             :         BUN nils = 0;                                                   \
      31             :         BUN i = 0, j = 0, ncand = ci1->ncand;                                \
      32             :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();                      \
      33             :                                                                         \
      34             :         if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {           \
      35             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) {              \
      36             :                         if (incr1)                                      \
      37             :                                 i = canditer_next_dense(ci1) - candoff1; \
      38             :                         if (incr2)                                      \
      39             :                                 j = canditer_next_dense(ci2) - candoff2; \
      40             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
      41             :                                 dst[k] = TYPE3##_nil;                   \
      42             :                                 nils++;                                 \
      43             :                         } else {                                        \
      44             :                                 ADD##IF##_WITH_CHECK(lft[i], rgt[j],    \
      45             :                                                      TYPE3, dst[k],     \
      46             :                                                      max,               \
      47             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
      48             :                         }                                               \
      49             :                 }                                                       \
      50             :                 TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
      51             :         } else {                                                        \
      52             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) {              \
      53             :                         if (incr1)                                      \
      54             :                                 i = canditer_next(ci1) - candoff1;      \
      55             :                         if (incr2)                                      \
      56             :                                 j = canditer_next(ci2) - candoff2;      \
      57             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
      58             :                                 dst[k] = TYPE3##_nil;                   \
      59             :                                 nils++;                                 \
      60             :                         } else {                                        \
      61             :                                 ADD##IF##_WITH_CHECK(lft[i], rgt[j],    \
      62             :                                                      TYPE3, dst[k],     \
      63             :                                                      max,               \
      64             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
      65             :                         }                                               \
      66             :                 }                                                       \
      67             :                 TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
      68             :         }                                                               \
      69             :         return nils;                                                    \
      70             : }
      71             : 
      72             : #define ADD_3TYPE_enlarge(TYPE1, TYPE2, TYPE3, IF)                      \
      73             : static BUN                                                              \
      74             : add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,           \
      75             :                                 const TYPE2 *rgt, bool incr2,           \
      76             :                                 TYPE3 *restrict dst, TYPE3 max,         \
      77             :                                 struct canditer *restrict ci1,          \
      78             :                                 struct canditer *restrict ci2,          \
      79             :                                 oid candoff1, oid candoff2)             \
      80             : {                                                                       \
      81             :         BUN nils = 0;                                                   \
      82             :         BUN i = 0, j = 0, ncand = ci1->ncand;                                \
      83             :         const bool couldoverflow = (max < (TYPE3) GDK_##TYPE1##_max + (TYPE3) GDK_##TYPE2##_max); \
      84             :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();                      \
      85             :                                                                         \
      86             :         if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {           \
      87             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) {              \
      88             :                         if (incr1)                                      \
      89             :                                 i = canditer_next_dense(ci1) - candoff1; \
      90             :                         if (incr2)                                      \
      91             :                                 j = canditer_next_dense(ci2) - candoff2; \
      92             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
      93             :                                 dst[k] = TYPE3##_nil;                   \
      94             :                                 nils++;                                 \
      95             :                         } else if (couldoverflow) {                     \
      96             :                                 ADD##IF##_WITH_CHECK(lft[i], rgt[j],    \
      97             :                                                      TYPE3, dst[k],     \
      98             :                                                      max,               \
      99             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
     100             :                         } else {                                        \
     101             :                                 dst[k] = (TYPE3) lft[i] + rgt[j];       \
     102             :                         }                                               \
     103             :                 }                                                       \
     104             :                 TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
     105             :         } else {                                                        \
     106             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) {              \
     107             :                         if (incr1)                                      \
     108             :                                 i = canditer_next(ci1) - candoff1;      \
     109             :                         if (incr2)                                      \
     110             :                                 j = canditer_next(ci2) - candoff2;      \
     111             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
     112             :                                 dst[k] = TYPE3##_nil;                   \
     113             :                                 nils++;                                 \
     114             :                         } else if (couldoverflow) {                     \
     115             :                                 ADD##IF##_WITH_CHECK(lft[i], rgt[j],    \
     116             :                                                      TYPE3, dst[k],     \
     117             :                                                      max,               \
     118             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
     119             :                         } else {                                        \
     120             :                                 dst[k] = (TYPE3) lft[i] + rgt[j];       \
     121             :                         }                                               \
     122             :                 }                                                       \
     123             :                 TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
     124             :         }                                                               \
     125             :         return nils;                                                    \
     126             : }
     127             : 
     128        2616 : ADD_3TYPE(bte, bte, bte, I)
     129         824 : ADD_3TYPE_enlarge(bte, bte, sht, I)
     130           0 : ADD_3TYPE_enlarge(bte, bte, int, I)
     131           0 : ADD_3TYPE_enlarge(bte, bte, lng, I)
     132             : #ifdef HAVE_HGE
     133           0 : ADD_3TYPE_enlarge(bte, bte, hge, I)
     134             : #endif
     135           0 : ADD_3TYPE_enlarge(bte, bte, flt, F)
     136           0 : ADD_3TYPE_enlarge(bte, bte, dbl, F)
     137           0 : ADD_3TYPE(bte, sht, sht, I)
     138           0 : ADD_3TYPE_enlarge(bte, sht, int, I)
     139           0 : ADD_3TYPE_enlarge(bte, sht, lng, I)
     140             : #ifdef HAVE_HGE
     141           0 : ADD_3TYPE_enlarge(bte, sht, hge, I)
     142             : #endif
     143           0 : ADD_3TYPE_enlarge(bte, sht, flt, F)
     144           0 : ADD_3TYPE_enlarge(bte, sht, dbl, F)
     145           0 : ADD_3TYPE(bte, int, int, I)
     146           0 : ADD_3TYPE_enlarge(bte, int, lng, I)
     147             : #ifdef HAVE_HGE
     148           0 : ADD_3TYPE_enlarge(bte, int, hge, I)
     149             : #endif
     150           0 : ADD_3TYPE_enlarge(bte, int, flt, F)
     151           0 : ADD_3TYPE_enlarge(bte, int, dbl, F)
     152           0 : ADD_3TYPE(bte, lng, lng, I)
     153             : #ifdef HAVE_HGE
     154           0 : ADD_3TYPE_enlarge(bte, lng, hge, I)
     155             : #endif
     156           0 : ADD_3TYPE_enlarge(bte, lng, flt, F)
     157           0 : ADD_3TYPE_enlarge(bte, lng, dbl, F)
     158             : #ifdef HAVE_HGE
     159           0 : ADD_3TYPE(bte, hge, hge, I)
     160           0 : ADD_3TYPE_enlarge(bte, hge, flt, F)
     161           0 : ADD_3TYPE_enlarge(bte, hge, dbl, F)
     162             : #endif
     163           0 : ADD_3TYPE(bte, flt, flt, F)
     164           0 : ADD_3TYPE_enlarge(bte, flt, dbl, F)
     165           0 : ADD_3TYPE(bte, dbl, dbl, F)
     166         308 : ADD_3TYPE(sht, bte, sht, I)
     167           0 : ADD_3TYPE_enlarge(sht, bte, int, I)
     168           0 : ADD_3TYPE_enlarge(sht, bte, lng, I)
     169             : #ifdef HAVE_HGE
     170           0 : ADD_3TYPE_enlarge(sht, bte, hge, I)
     171             : #endif
     172           0 : ADD_3TYPE_enlarge(sht, bte, flt, F)
     173           0 : ADD_3TYPE_enlarge(sht, bte, dbl, F)
     174      100458 : ADD_3TYPE(sht, sht, sht, I)
     175     1126463 : ADD_3TYPE_enlarge(sht, sht, int, I)
     176           0 : ADD_3TYPE_enlarge(sht, sht, lng, I)
     177             : #ifdef HAVE_HGE
     178           0 : ADD_3TYPE_enlarge(sht, sht, hge, I)
     179             : #endif
     180           0 : ADD_3TYPE_enlarge(sht, sht, flt, F)
     181           0 : ADD_3TYPE_enlarge(sht, sht, dbl, F)
     182           0 : ADD_3TYPE(sht, int, int, I)
     183           0 : ADD_3TYPE_enlarge(sht, int, lng, I)
     184             : #ifdef HAVE_HGE
     185           0 : ADD_3TYPE_enlarge(sht, int, hge, I)
     186             : #endif
     187           0 : ADD_3TYPE_enlarge(sht, int, flt, F)
     188           0 : ADD_3TYPE_enlarge(sht, int, dbl, F)
     189           0 : ADD_3TYPE(sht, lng, lng, I)
     190             : #ifdef HAVE_HGE
     191           0 : ADD_3TYPE_enlarge(sht, lng, hge, I)
     192             : #endif
     193           0 : ADD_3TYPE_enlarge(sht, lng, flt, F)
     194           0 : ADD_3TYPE_enlarge(sht, lng, dbl, F)
     195             : #ifdef HAVE_HGE
     196           0 : ADD_3TYPE(sht, hge, hge, I)
     197           0 : ADD_3TYPE_enlarge(sht, hge, flt, F)
     198           0 : ADD_3TYPE_enlarge(sht, hge, dbl, F)
     199             : #endif
     200           0 : ADD_3TYPE(sht, flt, flt, F)
     201           0 : ADD_3TYPE_enlarge(sht, flt, dbl, F)
     202           0 : ADD_3TYPE(sht, dbl, dbl, F)
     203       67732 : ADD_3TYPE(int, bte, int, I)
     204           0 : ADD_3TYPE_enlarge(int, bte, lng, I)
     205             : #ifdef HAVE_HGE
     206           0 : ADD_3TYPE_enlarge(int, bte, hge, I)
     207             : #endif
     208           0 : ADD_3TYPE_enlarge(int, bte, flt, F)
     209           0 : ADD_3TYPE_enlarge(int, bte, dbl, F)
     210           0 : ADD_3TYPE(int, sht, int, I)
     211           0 : ADD_3TYPE_enlarge(int, sht, lng, I)
     212             : #ifdef HAVE_HGE
     213           0 : ADD_3TYPE_enlarge(int, sht, hge, I)
     214             : #endif
     215           0 : ADD_3TYPE_enlarge(int, sht, flt, F)
     216           0 : ADD_3TYPE_enlarge(int, sht, dbl, F)
     217     2737208 : ADD_3TYPE(int, int, int, I)
     218    10410248 : ADD_3TYPE_enlarge(int, int, lng, I)
     219             : #ifdef HAVE_HGE
     220           0 : ADD_3TYPE_enlarge(int, int, hge, I)
     221             : #endif
     222           0 : ADD_3TYPE_enlarge(int, int, flt, F)
     223           0 : ADD_3TYPE_enlarge(int, int, dbl, F)
     224           0 : ADD_3TYPE(int, lng, lng, I)
     225             : #ifdef HAVE_HGE
     226           0 : ADD_3TYPE_enlarge(int, lng, hge, I)
     227             : #endif
     228           0 : ADD_3TYPE_enlarge(int, lng, flt, F)
     229           0 : ADD_3TYPE_enlarge(int, lng, dbl, F)
     230             : #ifdef HAVE_HGE
     231           0 : ADD_3TYPE(int, hge, hge, I)
     232           0 : ADD_3TYPE_enlarge(int, hge, flt, F)
     233           0 : ADD_3TYPE_enlarge(int, hge, dbl, F)
     234             : #endif
     235           0 : ADD_3TYPE(int, flt, flt, F)
     236           0 : ADD_3TYPE_enlarge(int, flt, dbl, F)
     237           0 : ADD_3TYPE(int, dbl, dbl, F)
     238         196 : ADD_3TYPE(lng, bte, lng, I)
     239             : #ifdef HAVE_HGE
     240           0 : ADD_3TYPE_enlarge(lng, bte, hge, I)
     241             : #endif
     242           0 : ADD_3TYPE_enlarge(lng, bte, flt, F)
     243           0 : ADD_3TYPE_enlarge(lng, bte, dbl, F)
     244       59331 : ADD_3TYPE(lng, sht, lng, I)
     245             : #ifdef HAVE_HGE
     246           0 : ADD_3TYPE_enlarge(lng, sht, hge, I)
     247             : #endif
     248           0 : ADD_3TYPE_enlarge(lng, sht, flt, F)
     249           0 : ADD_3TYPE_enlarge(lng, sht, dbl, F)
     250          48 : ADD_3TYPE(lng, int, lng, I)
     251             : #ifdef HAVE_HGE
     252          84 : ADD_3TYPE_enlarge(lng, int, hge, I)
     253             : #endif
     254           0 : ADD_3TYPE_enlarge(lng, int, flt, F)
     255           0 : ADD_3TYPE_enlarge(lng, int, dbl, F)
     256     1282602 : ADD_3TYPE(lng, lng, lng, I)
     257             : #ifdef HAVE_HGE
     258         559 : ADD_3TYPE_enlarge(lng, lng, hge, I)
     259             : #endif
     260           0 : ADD_3TYPE_enlarge(lng, lng, flt, F)
     261           0 : ADD_3TYPE_enlarge(lng, lng, dbl, F)
     262             : #ifdef HAVE_HGE
     263           0 : ADD_3TYPE(lng, hge, hge, I)
     264           0 : ADD_3TYPE_enlarge(lng, hge, flt, F)
     265           0 : ADD_3TYPE_enlarge(lng, hge, dbl, F)
     266             : #endif
     267           0 : ADD_3TYPE(lng, flt, flt, F)
     268           0 : ADD_3TYPE_enlarge(lng, flt, dbl, F)
     269           0 : ADD_3TYPE(lng, dbl, dbl, F)
     270             : #ifdef HAVE_HGE
     271          12 : ADD_3TYPE(hge, bte, hge, I)
     272           0 : ADD_3TYPE_enlarge(hge, bte, flt, F)
     273           0 : ADD_3TYPE_enlarge(hge, bte, dbl, F)
     274           0 : ADD_3TYPE(hge, sht, hge, I)
     275           0 : ADD_3TYPE_enlarge(hge, sht, flt, F)
     276           0 : ADD_3TYPE_enlarge(hge, sht, dbl, F)
     277           0 : ADD_3TYPE(hge, int, hge, I)
     278           0 : ADD_3TYPE_enlarge(hge, int, flt, F)
     279           0 : ADD_3TYPE_enlarge(hge, int, dbl, F)
     280          42 : ADD_3TYPE(hge, lng, hge, I)
     281           0 : ADD_3TYPE_enlarge(hge, lng, flt, F)
     282           0 : ADD_3TYPE_enlarge(hge, lng, dbl, F)
     283        1795 : ADD_3TYPE(hge, hge, hge, I)
     284           0 : ADD_3TYPE_enlarge(hge, hge, flt, F)
     285           0 : ADD_3TYPE_enlarge(hge, hge, dbl, F)
     286           0 : ADD_3TYPE(hge, flt, flt, F)
     287           0 : ADD_3TYPE_enlarge(hge, flt, dbl, F)
     288           0 : ADD_3TYPE(hge, dbl, dbl, F)
     289             : #endif
     290           0 : ADD_3TYPE(flt, bte, flt, F)
     291           0 : ADD_3TYPE_enlarge(flt, bte, dbl, F)
     292           0 : ADD_3TYPE(flt, sht, flt, F)
     293           0 : ADD_3TYPE_enlarge(flt, sht, dbl, F)
     294           4 : ADD_3TYPE(flt, int, flt, F)
     295           0 : ADD_3TYPE_enlarge(flt, int, dbl, F)
     296           0 : ADD_3TYPE(flt, lng, flt, F)
     297           0 : ADD_3TYPE_enlarge(flt, lng, dbl, F)
     298             : #ifdef HAVE_HGE
     299           0 : ADD_3TYPE(flt, hge, flt, F)
     300           0 : ADD_3TYPE_enlarge(flt, hge, dbl, F)
     301             : #endif
     302     2759172 : ADD_3TYPE(flt, flt, flt, F)
     303           0 : ADD_3TYPE_enlarge(flt, flt, dbl, F)
     304           0 : ADD_3TYPE(flt, dbl, dbl, F)
     305           0 : ADD_3TYPE(dbl, bte, dbl, F)
     306           0 : ADD_3TYPE(dbl, sht, dbl, F)
     307           0 : ADD_3TYPE(dbl, int, dbl, F)
     308           0 : ADD_3TYPE(dbl, lng, dbl, F)
     309             : #ifdef HAVE_HGE
     310           0 : ADD_3TYPE(dbl, hge, dbl, F)
     311             : #endif
     312           0 : ADD_3TYPE(dbl, flt, dbl, F)
     313        2598 : ADD_3TYPE(dbl, dbl, dbl, F)
     314             : 
     315             : static BUN
     316      243057 : add_typeswitchloop(const void *lft, int tp1, bool incr1,
     317             :                    const void *rgt, int tp2, bool incr2,
     318             :                    void *restrict dst, int tp,
     319             :                    struct canditer *restrict ci1, struct canditer *restrict ci2,
     320             :                    oid candoff1, oid candoff2,
     321             :                    const char *func)
     322             : {
     323      243057 :         BUN nils;
     324             : 
     325      243057 :         tp1 = ATOMbasetype(tp1);
     326      243057 :         tp2 = ATOMbasetype(tp2);
     327      243057 :         tp = ATOMbasetype(tp);
     328      243057 :         switch (tp1) {
     329         732 :         case TYPE_bte:
     330         732 :                 switch (tp2) {
     331         732 :                 case TYPE_bte:
     332         732 :                         switch (tp) {
     333         661 :                         case TYPE_bte:
     334         661 :                                 nils = add_bte_bte_bte(lft, incr1, rgt, incr2,
     335             :                                                        dst, GDK_bte_max,
     336             :                                                        ci1, ci2, candoff1, candoff2);
     337         661 :                                 break;
     338          71 :                         case TYPE_sht:
     339          71 :                                 nils = add_bte_bte_sht(lft, incr1, rgt, incr2,
     340             :                                                        dst, GDK_sht_max,
     341             :                                                        ci1, ci2, candoff1, candoff2);
     342          71 :                                 break;
     343           0 :                         case TYPE_int:
     344           0 :                                 nils = add_bte_bte_int(lft, incr1, rgt, incr2,
     345             :                                                        dst, GDK_int_max,
     346             :                                                        ci1, ci2, candoff1, candoff2);
     347           0 :                                 break;
     348           0 :                         case TYPE_lng:
     349           0 :                                 nils = add_bte_bte_lng(lft, incr1, rgt, incr2,
     350             :                                                        dst, GDK_lng_max,
     351             :                                                        ci1, ci2, candoff1, candoff2);
     352           0 :                                 break;
     353             : #ifdef HAVE_HGE
     354           0 :                         case TYPE_hge:
     355           0 :                                 nils = add_bte_bte_hge(lft, incr1, rgt, incr2,
     356             :                                                        dst, GDK_hge_max,
     357             :                                                        ci1, ci2, candoff1, candoff2);
     358           0 :                                 break;
     359             : #endif
     360           0 :                         case TYPE_flt:
     361           0 :                                 nils = add_bte_bte_flt(lft, incr1, rgt, incr2,
     362             :                                                        dst, GDK_flt_max,
     363             :                                                        ci1, ci2, candoff1, candoff2);
     364           0 :                                 break;
     365           0 :                         case TYPE_dbl:
     366           0 :                                 nils = add_bte_bte_dbl(lft, incr1, rgt, incr2,
     367             :                                                        dst, GDK_dbl_max,
     368             :                                                        ci1, ci2, candoff1, candoff2);
     369           0 :                                 break;
     370           0 :                         default:
     371           0 :                                 goto unsupported;
     372             :                         }
     373             :                         break;
     374           0 :                 case TYPE_sht:
     375           0 :                         switch (tp) {
     376           0 :                         case TYPE_sht:
     377           0 :                                 nils = add_bte_sht_sht(lft, incr1, rgt, incr2,
     378             :                                                        dst, GDK_sht_max,
     379             :                                                        ci1, ci2, candoff1, candoff2);
     380           0 :                                 break;
     381           0 :                         case TYPE_int:
     382           0 :                                 nils = add_bte_sht_int(lft, incr1, rgt, incr2,
     383             :                                                        dst, GDK_int_max,
     384             :                                                        ci1, ci2, candoff1, candoff2);
     385           0 :                                 break;
     386           0 :                         case TYPE_lng:
     387           0 :                                 nils = add_bte_sht_lng(lft, incr1, rgt, incr2,
     388             :                                                        dst, GDK_lng_max,
     389             :                                                        ci1, ci2, candoff1, candoff2);
     390           0 :                                 break;
     391             : #ifdef HAVE_HGE
     392           0 :                         case TYPE_hge:
     393           0 :                                 nils = add_bte_sht_hge(lft, incr1, rgt, incr2,
     394             :                                                        dst, GDK_hge_max,
     395             :                                                        ci1, ci2, candoff1, candoff2);
     396           0 :                                 break;
     397             : #endif
     398           0 :                         case TYPE_flt:
     399           0 :                                 nils = add_bte_sht_flt(lft, incr1, rgt, incr2,
     400             :                                                        dst, GDK_flt_max,
     401             :                                                        ci1, ci2, candoff1, candoff2);
     402           0 :                                 break;
     403           0 :                         case TYPE_dbl:
     404           0 :                                 nils = add_bte_sht_dbl(lft, incr1, rgt, incr2,
     405             :                                                        dst, GDK_dbl_max,
     406             :                                                        ci1, ci2, candoff1, candoff2);
     407           0 :                                 break;
     408           0 :                         default:
     409           0 :                                 goto unsupported;
     410             :                         }
     411             :                         break;
     412           0 :                 case TYPE_int:
     413           0 :                         switch (tp) {
     414           0 :                         case TYPE_int:
     415           0 :                                 nils = add_bte_int_int(lft, incr1, rgt, incr2,
     416             :                                                        dst, GDK_int_max,
     417             :                                                        ci1, ci2, candoff1, candoff2);
     418           0 :                                 break;
     419           0 :                         case TYPE_lng:
     420           0 :                                 nils = add_bte_int_lng(lft, incr1, rgt, incr2,
     421             :                                                        dst, GDK_lng_max,
     422             :                                                        ci1, ci2, candoff1, candoff2);
     423           0 :                                 break;
     424             : #ifdef HAVE_HGE
     425           0 :                         case TYPE_hge:
     426           0 :                                 nils = add_bte_int_hge(lft, incr1, rgt, incr2,
     427             :                                                        dst, GDK_hge_max,
     428             :                                                        ci1, ci2, candoff1, candoff2);
     429           0 :                                 break;
     430             : #endif
     431           0 :                         case TYPE_flt:
     432           0 :                                 nils = add_bte_int_flt(lft, incr1, rgt, incr2,
     433             :                                                        dst, GDK_flt_max,
     434             :                                                        ci1, ci2, candoff1, candoff2);
     435           0 :                                 break;
     436           0 :                         case TYPE_dbl:
     437           0 :                                 nils = add_bte_int_dbl(lft, incr1, rgt, incr2,
     438             :                                                        dst, GDK_dbl_max,
     439             :                                                        ci1, ci2, candoff1, candoff2);
     440           0 :                                 break;
     441           0 :                         default:
     442           0 :                                 goto unsupported;
     443             :                         }
     444             :                         break;
     445           0 :                 case TYPE_lng:
     446           0 :                         switch (tp) {
     447           0 :                         case TYPE_lng:
     448           0 :                                 nils = add_bte_lng_lng(lft, incr1, rgt, incr2,
     449             :                                                        dst, GDK_lng_max,
     450             :                                                        ci1, ci2, candoff1, candoff2);
     451           0 :                                 break;
     452             : #ifdef HAVE_HGE
     453           0 :                         case TYPE_hge:
     454           0 :                                 nils = add_bte_lng_hge(lft, incr1, rgt, incr2,
     455             :                                                        dst, GDK_hge_max,
     456             :                                                        ci1, ci2, candoff1, candoff2);
     457           0 :                                 break;
     458             : #endif
     459           0 :                         case TYPE_flt:
     460           0 :                                 nils = add_bte_lng_flt(lft, incr1, rgt, incr2,
     461             :                                                        dst, GDK_flt_max,
     462             :                                                        ci1, ci2, candoff1, candoff2);
     463           0 :                                 break;
     464           0 :                         case TYPE_dbl:
     465           0 :                                 nils = add_bte_lng_dbl(lft, incr1, rgt, incr2,
     466             :                                                        dst, GDK_dbl_max,
     467             :                                                        ci1, ci2, candoff1, candoff2);
     468           0 :                                 break;
     469           0 :                         default:
     470           0 :                                 goto unsupported;
     471             :                         }
     472             :                         break;
     473             : #ifdef HAVE_HGE
     474           0 :                 case TYPE_hge:
     475           0 :                         switch (tp) {
     476           0 :                         case TYPE_hge:
     477           0 :                                 nils = add_bte_hge_hge(lft, incr1, rgt, incr2,
     478             :                                                        dst, GDK_hge_max,
     479             :                                                        ci1, ci2, candoff1, candoff2);
     480           0 :                                 break;
     481           0 :                         case TYPE_flt:
     482           0 :                                 nils = add_bte_hge_flt(lft, incr1, rgt, incr2,
     483             :                                                        dst, GDK_flt_max,
     484             :                                                        ci1, ci2, candoff1, candoff2);
     485           0 :                                 break;
     486           0 :                         case TYPE_dbl:
     487           0 :                                 nils = add_bte_hge_dbl(lft, incr1, rgt, incr2,
     488             :                                                        dst, GDK_dbl_max,
     489             :                                                        ci1, ci2, candoff1, candoff2);
     490           0 :                                 break;
     491           0 :                         default:
     492           0 :                                 goto unsupported;
     493             :                         }
     494             :                         break;
     495             : #endif
     496           0 :                 case TYPE_flt:
     497           0 :                         switch (tp) {
     498           0 :                         case TYPE_flt:
     499           0 :                                 nils = add_bte_flt_flt(lft, incr1, rgt, incr2,
     500             :                                                        dst, GDK_flt_max,
     501             :                                                        ci1, ci2, candoff1, candoff2);
     502           0 :                                 break;
     503           0 :                         case TYPE_dbl:
     504           0 :                                 nils = add_bte_flt_dbl(lft, incr1, rgt, incr2,
     505             :                                                        dst, GDK_dbl_max,
     506             :                                                        ci1, ci2, candoff1, candoff2);
     507           0 :                                 break;
     508           0 :                         default:
     509           0 :                                 goto unsupported;
     510             :                         }
     511             :                         break;
     512           0 :                 case TYPE_dbl:
     513           0 :                         switch (tp) {
     514           0 :                         case TYPE_dbl:
     515           0 :                                 nils = add_bte_dbl_dbl(lft, incr1, rgt, incr2,
     516             :                                                        dst, GDK_dbl_max,
     517             :                                                        ci1, ci2, candoff1, candoff2);
     518           0 :                                 break;
     519           0 :                         default:
     520           0 :                                 goto unsupported;
     521             :                         }
     522           0 :                         break;
     523           0 :                 default:
     524           0 :                         goto unsupported;
     525             :                 }
     526             :                 break;
     527       15856 :         case TYPE_sht:
     528       15856 :                 switch (tp2) {
     529          77 :                 case TYPE_bte:
     530          77 :                         switch (tp) {
     531          77 :                         case TYPE_sht:
     532          77 :                                 nils = add_sht_bte_sht(lft, incr1, rgt, incr2,
     533             :                                                        dst, GDK_sht_max,
     534             :                                                        ci1, ci2, candoff1, candoff2);
     535          77 :                                 break;
     536           0 :                         case TYPE_int:
     537           0 :                                 nils = add_sht_bte_int(lft, incr1, rgt, incr2,
     538             :                                                        dst, GDK_int_max,
     539             :                                                        ci1, ci2, candoff1, candoff2);
     540           0 :                                 break;
     541           0 :                         case TYPE_lng:
     542           0 :                                 nils = add_sht_bte_lng(lft, incr1, rgt, incr2,
     543             :                                                        dst, GDK_lng_max,
     544             :                                                        ci1, ci2, candoff1, candoff2);
     545           0 :                                 break;
     546             : #ifdef HAVE_HGE
     547           0 :                         case TYPE_hge:
     548           0 :                                 nils = add_sht_bte_hge(lft, incr1, rgt, incr2,
     549             :                                                        dst, GDK_hge_max,
     550             :                                                        ci1, ci2, candoff1, candoff2);
     551           0 :                                 break;
     552             : #endif
     553           0 :                         case TYPE_flt:
     554           0 :                                 nils = add_sht_bte_flt(lft, incr1, rgt, incr2,
     555             :                                                        dst, GDK_flt_max,
     556             :                                                        ci1, ci2, candoff1, candoff2);
     557           0 :                                 break;
     558           0 :                         case TYPE_dbl:
     559           0 :                                 nils = add_sht_bte_dbl(lft, incr1, rgt, incr2,
     560             :                                                        dst, GDK_dbl_max,
     561             :                                                        ci1, ci2, candoff1, candoff2);
     562           0 :                                 break;
     563           0 :                         default:
     564           0 :                                 goto unsupported;
     565             :                         }
     566             :                         break;
     567       15779 :                 case TYPE_sht:
     568       15779 :                         switch (tp) {
     569       15728 :                         case TYPE_sht:
     570       15728 :                                 nils = add_sht_sht_sht(lft, incr1, rgt, incr2,
     571             :                                                        dst, GDK_sht_max,
     572             :                                                        ci1, ci2, candoff1, candoff2);
     573       15728 :                                 break;
     574          51 :                         case TYPE_int:
     575          51 :                                 nils = add_sht_sht_int(lft, incr1, rgt, incr2,
     576             :                                                        dst, GDK_int_max,
     577             :                                                        ci1, ci2, candoff1, candoff2);
     578          51 :                                 break;
     579           0 :                         case TYPE_lng:
     580           0 :                                 nils = add_sht_sht_lng(lft, incr1, rgt, incr2,
     581             :                                                        dst, GDK_lng_max,
     582             :                                                        ci1, ci2, candoff1, candoff2);
     583           0 :                                 break;
     584             : #ifdef HAVE_HGE
     585           0 :                         case TYPE_hge:
     586           0 :                                 nils = add_sht_sht_hge(lft, incr1, rgt, incr2,
     587             :                                                        dst, GDK_hge_max,
     588             :                                                        ci1, ci2, candoff1, candoff2);
     589           0 :                                 break;
     590             : #endif
     591           0 :                         case TYPE_flt:
     592           0 :                                 nils = add_sht_sht_flt(lft, incr1, rgt, incr2,
     593             :                                                        dst, GDK_flt_max,
     594             :                                                        ci1, ci2, candoff1, candoff2);
     595           0 :                                 break;
     596           0 :                         case TYPE_dbl:
     597           0 :                                 nils = add_sht_sht_dbl(lft, incr1, rgt, incr2,
     598             :                                                        dst, GDK_dbl_max,
     599             :                                                        ci1, ci2, candoff1, candoff2);
     600           0 :                                 break;
     601           0 :                         default:
     602           0 :                                 goto unsupported;
     603             :                         }
     604             :                         break;
     605           0 :                 case TYPE_int:
     606           0 :                         switch (tp) {
     607           0 :                         case TYPE_int:
     608           0 :                                 nils = add_sht_int_int(lft, incr1, rgt, incr2,
     609             :                                                        dst, GDK_int_max,
     610             :                                                        ci1, ci2, candoff1, candoff2);
     611           0 :                                 break;
     612           0 :                         case TYPE_lng:
     613           0 :                                 nils = add_sht_int_lng(lft, incr1, rgt, incr2,
     614             :                                                        dst, GDK_lng_max,
     615             :                                                        ci1, ci2, candoff1, candoff2);
     616           0 :                                 break;
     617             : #ifdef HAVE_HGE
     618           0 :                         case TYPE_hge:
     619           0 :                                 nils = add_sht_int_hge(lft, incr1, rgt, incr2,
     620             :                                                        dst, GDK_hge_max,
     621             :                                                        ci1, ci2, candoff1, candoff2);
     622           0 :                                 break;
     623             : #endif
     624           0 :                         case TYPE_flt:
     625           0 :                                 nils = add_sht_int_flt(lft, incr1, rgt, incr2,
     626             :                                                        dst, GDK_flt_max,
     627             :                                                        ci1, ci2, candoff1, candoff2);
     628           0 :                                 break;
     629           0 :                         case TYPE_dbl:
     630           0 :                                 nils = add_sht_int_dbl(lft, incr1, rgt, incr2,
     631             :                                                        dst, GDK_dbl_max,
     632             :                                                        ci1, ci2, candoff1, candoff2);
     633           0 :                                 break;
     634           0 :                         default:
     635           0 :                                 goto unsupported;
     636             :                         }
     637             :                         break;
     638           0 :                 case TYPE_lng:
     639           0 :                         switch (tp) {
     640           0 :                         case TYPE_lng:
     641           0 :                                 nils = add_sht_lng_lng(lft, incr1, rgt, incr2,
     642             :                                                        dst, GDK_lng_max,
     643             :                                                        ci1, ci2, candoff1, candoff2);
     644           0 :                                 break;
     645             : #ifdef HAVE_HGE
     646           0 :                         case TYPE_hge:
     647           0 :                                 nils = add_sht_lng_hge(lft, incr1, rgt, incr2,
     648             :                                                        dst, GDK_hge_max,
     649             :                                                        ci1, ci2, candoff1, candoff2);
     650           0 :                                 break;
     651             : #endif
     652           0 :                         case TYPE_flt:
     653           0 :                                 nils = add_sht_lng_flt(lft, incr1, rgt, incr2,
     654             :                                                        dst, GDK_flt_max,
     655             :                                                        ci1, ci2, candoff1, candoff2);
     656           0 :                                 break;
     657           0 :                         case TYPE_dbl:
     658           0 :                                 nils = add_sht_lng_dbl(lft, incr1, rgt, incr2,
     659             :                                                        dst, GDK_dbl_max,
     660             :                                                        ci1, ci2, candoff1, candoff2);
     661           0 :                                 break;
     662           0 :                         default:
     663           0 :                                 goto unsupported;
     664             :                         }
     665             :                         break;
     666             : #ifdef HAVE_HGE
     667           0 :                 case TYPE_hge:
     668           0 :                         switch (tp) {
     669           0 :                         case TYPE_hge:
     670           0 :                                 nils = add_sht_hge_hge(lft, incr1, rgt, incr2,
     671             :                                                        dst, GDK_hge_max,
     672             :                                                        ci1, ci2, candoff1, candoff2);
     673           0 :                                 break;
     674           0 :                         case TYPE_flt:
     675           0 :                                 nils = add_sht_hge_flt(lft, incr1, rgt, incr2,
     676             :                                                        dst, GDK_flt_max,
     677             :                                                        ci1, ci2, candoff1, candoff2);
     678           0 :                                 break;
     679           0 :                         case TYPE_dbl:
     680           0 :                                 nils = add_sht_hge_dbl(lft, incr1, rgt, incr2,
     681             :                                                        dst, GDK_dbl_max,
     682             :                                                        ci1, ci2, candoff1, candoff2);
     683           0 :                                 break;
     684           0 :                         default:
     685           0 :                                 goto unsupported;
     686             :                         }
     687             :                         break;
     688             : #endif
     689           0 :                 case TYPE_flt:
     690           0 :                         switch (tp) {
     691           0 :                         case TYPE_flt:
     692           0 :                                 nils = add_sht_flt_flt(lft, incr1, rgt, incr2,
     693             :                                                        dst, GDK_flt_max,
     694             :                                                        ci1, ci2, candoff1, candoff2);
     695           0 :                                 break;
     696           0 :                         case TYPE_dbl:
     697           0 :                                 nils = add_sht_flt_dbl(lft, incr1, rgt, incr2,
     698             :                                                        dst, GDK_dbl_max,
     699             :                                                        ci1, ci2, candoff1, candoff2);
     700           0 :                                 break;
     701           0 :                         default:
     702           0 :                                 goto unsupported;
     703             :                         }
     704             :                         break;
     705           0 :                 case TYPE_dbl:
     706           0 :                         switch (tp) {
     707           0 :                         case TYPE_dbl:
     708           0 :                                 nils = add_sht_dbl_dbl(lft, incr1, rgt, incr2,
     709             :                                                        dst, GDK_dbl_max,
     710             :                                                        ci1, ci2, candoff1, candoff2);
     711           0 :                                 break;
     712           0 :                         default:
     713           0 :                                 goto unsupported;
     714             :                         }
     715           0 :                         break;
     716           0 :                 default:
     717           0 :                         goto unsupported;
     718             :                 }
     719             :                 break;
     720      185710 :         case TYPE_int:
     721      185710 :                 switch (tp2) {
     722       16933 :                 case TYPE_bte:
     723       16933 :                         switch (tp) {
     724       16933 :                         case TYPE_int:
     725       16933 :                                 nils = add_int_bte_int(lft, incr1, rgt, incr2,
     726             :                                                        dst, GDK_int_max,
     727             :                                                        ci1, ci2, candoff1, candoff2);
     728       16933 :                                 break;
     729           0 :                         case TYPE_lng:
     730           0 :                                 nils = add_int_bte_lng(lft, incr1, rgt, incr2,
     731             :                                                        dst, GDK_lng_max,
     732             :                                                        ci1, ci2, candoff1, candoff2);
     733           0 :                                 break;
     734             : #ifdef HAVE_HGE
     735           0 :                         case TYPE_hge:
     736           0 :                                 nils = add_int_bte_hge(lft, incr1, rgt, incr2,
     737             :                                                        dst, GDK_hge_max,
     738             :                                                        ci1, ci2, candoff1, candoff2);
     739           0 :                                 break;
     740             : #endif
     741           0 :                         case TYPE_flt:
     742           0 :                                 nils = add_int_bte_flt(lft, incr1, rgt, incr2,
     743             :                                                        dst, GDK_flt_max,
     744             :                                                        ci1, ci2, candoff1, candoff2);
     745           0 :                                 break;
     746           0 :                         case TYPE_dbl:
     747           0 :                                 nils = add_int_bte_dbl(lft, incr1, rgt, incr2,
     748             :                                                        dst, GDK_dbl_max,
     749             :                                                        ci1, ci2, candoff1, candoff2);
     750           0 :                                 break;
     751           0 :                         default:
     752           0 :                                 goto unsupported;
     753             :                         }
     754             :                         break;
     755           0 :                 case TYPE_sht:
     756           0 :                         switch (tp) {
     757           0 :                         case TYPE_int:
     758           0 :                                 nils = add_int_sht_int(lft, incr1, rgt, incr2,
     759             :                                                        dst, GDK_int_max,
     760             :                                                        ci1, ci2, candoff1, candoff2);
     761           0 :                                 break;
     762           0 :                         case TYPE_lng:
     763           0 :                                 nils = add_int_sht_lng(lft, incr1, rgt, incr2,
     764             :                                                        dst, GDK_lng_max,
     765             :                                                        ci1, ci2, candoff1, candoff2);
     766           0 :                                 break;
     767             : #ifdef HAVE_HGE
     768           0 :                         case TYPE_hge:
     769           0 :                                 nils = add_int_sht_hge(lft, incr1, rgt, incr2,
     770             :                                                        dst, GDK_hge_max,
     771             :                                                        ci1, ci2, candoff1, candoff2);
     772           0 :                                 break;
     773             : #endif
     774           0 :                         case TYPE_flt:
     775           0 :                                 nils = add_int_sht_flt(lft, incr1, rgt, incr2,
     776             :                                                        dst, GDK_flt_max,
     777             :                                                        ci1, ci2, candoff1, candoff2);
     778           0 :                                 break;
     779           0 :                         case TYPE_dbl:
     780           0 :                                 nils = add_int_sht_dbl(lft, incr1, rgt, incr2,
     781             :                                                        dst, GDK_dbl_max,
     782             :                                                        ci1, ci2, candoff1, candoff2);
     783           0 :                                 break;
     784           0 :                         default:
     785           0 :                                 goto unsupported;
     786             :                         }
     787             :                         break;
     788      168777 :                 case TYPE_int:
     789      168777 :                         switch (tp) {
     790      151588 :                         case TYPE_int:
     791      151588 :                                 nils = add_int_int_int(lft, incr1, rgt, incr2,
     792             :                                                        dst, GDK_int_max,
     793             :                                                        ci1, ci2, candoff1, candoff2);
     794      151588 :                                 break;
     795       17189 :                         case TYPE_lng:
     796       17189 :                                 nils = add_int_int_lng(lft, incr1, rgt, incr2,
     797             :                                                        dst, GDK_lng_max,
     798             :                                                        ci1, ci2, candoff1, candoff2);
     799       17189 :                                 break;
     800             : #ifdef HAVE_HGE
     801           0 :                         case TYPE_hge:
     802           0 :                                 nils = add_int_int_hge(lft, incr1, rgt, incr2,
     803             :                                                        dst, GDK_hge_max,
     804             :                                                        ci1, ci2, candoff1, candoff2);
     805           0 :                                 break;
     806             : #endif
     807           0 :                         case TYPE_flt:
     808           0 :                                 nils = add_int_int_flt(lft, incr1, rgt, incr2,
     809             :                                                        dst, GDK_flt_max,
     810             :                                                        ci1, ci2, candoff1, candoff2);
     811           0 :                                 break;
     812           0 :                         case TYPE_dbl:
     813           0 :                                 nils = add_int_int_dbl(lft, incr1, rgt, incr2,
     814             :                                                        dst, GDK_dbl_max,
     815             :                                                        ci1, ci2, candoff1, candoff2);
     816           0 :                                 break;
     817           0 :                         default:
     818           0 :                                 goto unsupported;
     819             :                         }
     820             :                         break;
     821           0 :                 case TYPE_lng:
     822           0 :                         switch (tp) {
     823           0 :                         case TYPE_lng:
     824           0 :                                 nils = add_int_lng_lng(lft, incr1, rgt, incr2,
     825             :                                                        dst, GDK_lng_max,
     826             :                                                        ci1, ci2, candoff1, candoff2);
     827           0 :                                 break;
     828             : #ifdef HAVE_HGE
     829           0 :                         case TYPE_hge:
     830           0 :                                 nils = add_int_lng_hge(lft, incr1, rgt, incr2,
     831             :                                                        dst, GDK_hge_max,
     832             :                                                        ci1, ci2, candoff1, candoff2);
     833           0 :                                 break;
     834             : #endif
     835           0 :                         case TYPE_flt:
     836           0 :                                 nils = add_int_lng_flt(lft, incr1, rgt, incr2,
     837             :                                                        dst, GDK_flt_max,
     838             :                                                        ci1, ci2, candoff1, candoff2);
     839           0 :                                 break;
     840           0 :                         case TYPE_dbl:
     841           0 :                                 nils = add_int_lng_dbl(lft, incr1, rgt, incr2,
     842             :                                                        dst, GDK_dbl_max,
     843             :                                                        ci1, ci2, candoff1, candoff2);
     844           0 :                                 break;
     845           0 :                         default:
     846           0 :                                 goto unsupported;
     847             :                         }
     848             :                         break;
     849             : #ifdef HAVE_HGE
     850           0 :                 case TYPE_hge:
     851           0 :                         switch (tp) {
     852           0 :                         case TYPE_hge:
     853           0 :                                 nils = add_int_hge_hge(lft, incr1, rgt, incr2,
     854             :                                                        dst, GDK_hge_max,
     855             :                                                        ci1, ci2, candoff1, candoff2);
     856           0 :                                 break;
     857           0 :                         case TYPE_flt:
     858           0 :                                 nils = add_int_hge_flt(lft, incr1, rgt, incr2,
     859             :                                                        dst, GDK_flt_max,
     860             :                                                        ci1, ci2, candoff1, candoff2);
     861           0 :                                 break;
     862           0 :                         case TYPE_dbl:
     863           0 :                                 nils = add_int_hge_dbl(lft, incr1, rgt, incr2,
     864             :                                                        dst, GDK_dbl_max,
     865             :                                                        ci1, ci2, candoff1, candoff2);
     866           0 :                                 break;
     867           0 :                         default:
     868           0 :                                 goto unsupported;
     869             :                         }
     870             :                         break;
     871             : #endif
     872           0 :                 case TYPE_flt:
     873           0 :                         switch (tp) {
     874           0 :                         case TYPE_flt:
     875           0 :                                 nils = add_int_flt_flt(lft, incr1, rgt, incr2,
     876             :                                                        dst, GDK_flt_max,
     877             :                                                        ci1, ci2, candoff1, candoff2);
     878           0 :                                 break;
     879           0 :                         case TYPE_dbl:
     880           0 :                                 nils = add_int_flt_dbl(lft, incr1, rgt, incr2,
     881             :                                                        dst, GDK_dbl_max,
     882             :                                                        ci1, ci2, candoff1, candoff2);
     883           0 :                                 break;
     884           0 :                         default:
     885           0 :                                 goto unsupported;
     886             :                         }
     887             :                         break;
     888           0 :                 case TYPE_dbl:
     889           0 :                         switch (tp) {
     890           0 :                         case TYPE_dbl:
     891           0 :                                 nils = add_int_dbl_dbl(lft, incr1, rgt, incr2,
     892             :                                                        dst, GDK_dbl_max,
     893             :                                                        ci1, ci2, candoff1, candoff2);
     894           0 :                                 break;
     895           0 :                         default:
     896           0 :                                 goto unsupported;
     897             :                         }
     898           0 :                         break;
     899           0 :                 default:
     900           0 :                         goto unsupported;
     901             :                 }
     902             :                 break;
     903       40341 :         case TYPE_lng:
     904       40341 :                 switch (tp2) {
     905          49 :                 case TYPE_bte:
     906          49 :                         switch (tp) {
     907          49 :                         case TYPE_lng:
     908          49 :                                 nils = add_lng_bte_lng(lft, incr1, rgt, incr2,
     909             :                                                        dst, GDK_lng_max,
     910             :                                                        ci1, ci2, candoff1, candoff2);
     911          49 :                                 break;
     912             : #ifdef HAVE_HGE
     913           0 :                         case TYPE_hge:
     914           0 :                                 nils = add_lng_bte_hge(lft, incr1, rgt, incr2,
     915             :                                                        dst, GDK_hge_max,
     916             :                                                        ci1, ci2, candoff1, candoff2);
     917           0 :                                 break;
     918             : #endif
     919           0 :                         case TYPE_flt:
     920           0 :                                 nils = add_lng_bte_flt(lft, incr1, rgt, incr2,
     921             :                                                        dst, GDK_flt_max,
     922             :                                                        ci1, ci2, candoff1, candoff2);
     923           0 :                                 break;
     924           0 :                         case TYPE_dbl:
     925           0 :                                 nils = add_lng_bte_dbl(lft, incr1, rgt, incr2,
     926             :                                                        dst, GDK_dbl_max,
     927             :                                                        ci1, ci2, candoff1, candoff2);
     928           0 :                                 break;
     929           0 :                         default:
     930           0 :                                 goto unsupported;
     931             :                         }
     932             :                         break;
     933           8 :                 case TYPE_sht:
     934           8 :                         switch (tp) {
     935           8 :                         case TYPE_lng:
     936           8 :                                 nils = add_lng_sht_lng(lft, incr1, rgt, incr2,
     937             :                                                        dst, GDK_lng_max,
     938             :                                                        ci1, ci2, candoff1, candoff2);
     939           8 :                                 break;
     940             : #ifdef HAVE_HGE
     941           0 :                         case TYPE_hge:
     942           0 :                                 nils = add_lng_sht_hge(lft, incr1, rgt, incr2,
     943             :                                                        dst, GDK_hge_max,
     944             :                                                        ci1, ci2, candoff1, candoff2);
     945           0 :                                 break;
     946             : #endif
     947           0 :                         case TYPE_flt:
     948           0 :                                 nils = add_lng_sht_flt(lft, incr1, rgt, incr2,
     949             :                                                        dst, GDK_flt_max,
     950             :                                                        ci1, ci2, candoff1, candoff2);
     951           0 :                                 break;
     952           0 :                         case TYPE_dbl:
     953           0 :                                 nils = add_lng_sht_dbl(lft, incr1, rgt, incr2,
     954             :                                                        dst, GDK_dbl_max,
     955             :                                                        ci1, ci2, candoff1, candoff2);
     956           0 :                                 break;
     957           0 :                         default:
     958           0 :                                 goto unsupported;
     959             :                         }
     960             :                         break;
     961          16 :                 case TYPE_int:
     962          16 :                         switch (tp) {
     963          12 :                         case TYPE_lng:
     964          12 :                                 nils = add_lng_int_lng(lft, incr1, rgt, incr2,
     965             :                                                        dst, GDK_lng_max,
     966             :                                                        ci1, ci2, candoff1, candoff2);
     967          12 :                                 break;
     968             : #ifdef HAVE_HGE
     969           4 :                         case TYPE_hge:
     970           4 :                                 nils = add_lng_int_hge(lft, incr1, rgt, incr2,
     971             :                                                        dst, GDK_hge_max,
     972             :                                                        ci1, ci2, candoff1, candoff2);
     973           4 :                                 break;
     974             : #endif
     975           0 :                         case TYPE_flt:
     976           0 :                                 nils = add_lng_int_flt(lft, incr1, rgt, incr2,
     977             :                                                        dst, GDK_flt_max,
     978             :                                                        ci1, ci2, candoff1, candoff2);
     979           0 :                                 break;
     980           0 :                         case TYPE_dbl:
     981           0 :                                 nils = add_lng_int_dbl(lft, incr1, rgt, incr2,
     982             :                                                        dst, GDK_dbl_max,
     983             :                                                        ci1, ci2, candoff1, candoff2);
     984           0 :                                 break;
     985           0 :                         default:
     986           0 :                                 goto unsupported;
     987             :                         }
     988             :                         break;
     989       40268 :                 case TYPE_lng:
     990       40268 :                         switch (tp) {
     991       40161 :                         case TYPE_lng:
     992       40161 :                                 nils = add_lng_lng_lng(lft, incr1, rgt, incr2,
     993             :                                                        dst, GDK_lng_max,
     994             :                                                        ci1, ci2, candoff1, candoff2);
     995       40161 :                                 break;
     996             : #ifdef HAVE_HGE
     997         107 :                         case TYPE_hge:
     998         107 :                                 nils = add_lng_lng_hge(lft, incr1, rgt, incr2,
     999             :                                                        dst, GDK_hge_max,
    1000             :                                                        ci1, ci2, candoff1, candoff2);
    1001         107 :                                 break;
    1002             : #endif
    1003           0 :                         case TYPE_flt:
    1004           0 :                                 nils = add_lng_lng_flt(lft, incr1, rgt, incr2,
    1005             :                                                        dst, GDK_flt_max,
    1006             :                                                        ci1, ci2, candoff1, candoff2);
    1007           0 :                                 break;
    1008           0 :                         case TYPE_dbl:
    1009           0 :                                 nils = add_lng_lng_dbl(lft, incr1, rgt, incr2,
    1010             :                                                        dst, GDK_dbl_max,
    1011             :                                                        ci1, ci2, candoff1, candoff2);
    1012           0 :                                 break;
    1013           0 :                         default:
    1014           0 :                                 goto unsupported;
    1015             :                         }
    1016             :                         break;
    1017             : #ifdef HAVE_HGE
    1018           0 :                 case TYPE_hge:
    1019           0 :                         switch (tp) {
    1020           0 :                         case TYPE_hge:
    1021           0 :                                 nils = add_lng_hge_hge(lft, incr1, rgt, incr2,
    1022             :                                                        dst, GDK_hge_max,
    1023             :                                                        ci1, ci2, candoff1, candoff2);
    1024           0 :                                 break;
    1025           0 :                         case TYPE_flt:
    1026           0 :                                 nils = add_lng_hge_flt(lft, incr1, rgt, incr2,
    1027             :                                                        dst, GDK_flt_max,
    1028             :                                                        ci1, ci2, candoff1, candoff2);
    1029           0 :                                 break;
    1030           0 :                         case TYPE_dbl:
    1031           0 :                                 nils = add_lng_hge_dbl(lft, incr1, rgt, incr2,
    1032             :                                                        dst, GDK_dbl_max,
    1033             :                                                        ci1, ci2, candoff1, candoff2);
    1034           0 :                                 break;
    1035           0 :                         default:
    1036           0 :                                 goto unsupported;
    1037             :                         }
    1038             :                         break;
    1039             : #endif
    1040           0 :                 case TYPE_flt:
    1041           0 :                         switch (tp) {
    1042           0 :                         case TYPE_flt:
    1043           0 :                                 nils = add_lng_flt_flt(lft, incr1, rgt, incr2,
    1044             :                                                        dst, GDK_flt_max,
    1045             :                                                        ci1, ci2, candoff1, candoff2);
    1046           0 :                                 break;
    1047           0 :                         case TYPE_dbl:
    1048           0 :                                 nils = add_lng_flt_dbl(lft, incr1, rgt, incr2,
    1049             :                                                        dst, GDK_dbl_max,
    1050             :                                                        ci1, ci2, candoff1, candoff2);
    1051           0 :                                 break;
    1052           0 :                         default:
    1053           0 :                                 goto unsupported;
    1054             :                         }
    1055             :                         break;
    1056           0 :                 case TYPE_dbl:
    1057           0 :                         switch (tp) {
    1058           0 :                         case TYPE_dbl:
    1059           0 :                                 nils = add_lng_dbl_dbl(lft, incr1, rgt, incr2,
    1060             :                                                        dst, GDK_dbl_max,
    1061             :                                                        ci1, ci2, candoff1, candoff2);
    1062           0 :                                 break;
    1063           0 :                         default:
    1064           0 :                                 goto unsupported;
    1065             :                         }
    1066           0 :                         break;
    1067           0 :                 default:
    1068           0 :                         goto unsupported;
    1069             :                 }
    1070             :                 break;
    1071             : #ifdef HAVE_HGE
    1072         238 :         case TYPE_hge:
    1073         238 :                 switch (tp2) {
    1074           3 :                 case TYPE_bte:
    1075           3 :                         switch (tp) {
    1076           3 :                         case TYPE_hge:
    1077           3 :                                 nils = add_hge_bte_hge(lft, incr1, rgt, incr2,
    1078             :                                                        dst, GDK_hge_max,
    1079             :                                                        ci1, ci2, candoff1, candoff2);
    1080           3 :                                 break;
    1081           0 :                         case TYPE_flt:
    1082           0 :                                 nils = add_hge_bte_flt(lft, incr1, rgt, incr2,
    1083             :                                                        dst, GDK_flt_max,
    1084             :                                                        ci1, ci2, candoff1, candoff2);
    1085           0 :                                 break;
    1086           0 :                         case TYPE_dbl:
    1087           0 :                                 nils = add_hge_bte_dbl(lft, incr1, rgt, incr2,
    1088             :                                                        dst, GDK_dbl_max,
    1089             :                                                        ci1, ci2, candoff1, candoff2);
    1090           0 :                                 break;
    1091           0 :                         default:
    1092           0 :                                 goto unsupported;
    1093             :                         }
    1094             :                         break;
    1095           0 :                 case TYPE_sht:
    1096           0 :                         switch (tp) {
    1097           0 :                         case TYPE_hge:
    1098           0 :                                 nils = add_hge_sht_hge(lft, incr1, rgt, incr2,
    1099             :                                                        dst, GDK_hge_max,
    1100             :                                                        ci1, ci2, candoff1, candoff2);
    1101           0 :                                 break;
    1102           0 :                         case TYPE_flt:
    1103           0 :                                 nils = add_hge_sht_flt(lft, incr1, rgt, incr2,
    1104             :                                                        dst, GDK_flt_max,
    1105             :                                                        ci1, ci2, candoff1, candoff2);
    1106           0 :                                 break;
    1107           0 :                         case TYPE_dbl:
    1108           0 :                                 nils = add_hge_sht_dbl(lft, incr1, rgt, incr2,
    1109             :                                                        dst, GDK_dbl_max,
    1110             :                                                        ci1, ci2, candoff1, candoff2);
    1111           0 :                                 break;
    1112           0 :                         default:
    1113           0 :                                 goto unsupported;
    1114             :                         }
    1115             :                         break;
    1116           0 :                 case TYPE_int:
    1117           0 :                         switch (tp) {
    1118           0 :                         case TYPE_hge:
    1119           0 :                                 nils = add_hge_int_hge(lft, incr1, rgt, incr2,
    1120             :                                                        dst, GDK_hge_max,
    1121             :                                                        ci1, ci2, candoff1, candoff2);
    1122           0 :                                 break;
    1123           0 :                         case TYPE_flt:
    1124           0 :                                 nils = add_hge_int_flt(lft, incr1, rgt, incr2,
    1125             :                                                        dst, GDK_flt_max,
    1126             :                                                        ci1, ci2, candoff1, candoff2);
    1127           0 :                                 break;
    1128           0 :                         case TYPE_dbl:
    1129           0 :                                 nils = add_hge_int_dbl(lft, incr1, rgt, incr2,
    1130             :                                                        dst, GDK_dbl_max,
    1131             :                                                        ci1, ci2, candoff1, candoff2);
    1132           0 :                                 break;
    1133           0 :                         default:
    1134           0 :                                 goto unsupported;
    1135             :                         }
    1136             :                         break;
    1137           2 :                 case TYPE_lng:
    1138           2 :                         switch (tp) {
    1139           2 :                         case TYPE_hge:
    1140           2 :                                 nils = add_hge_lng_hge(lft, incr1, rgt, incr2,
    1141             :                                                        dst, GDK_hge_max,
    1142             :                                                        ci1, ci2, candoff1, candoff2);
    1143           2 :                                 break;
    1144           0 :                         case TYPE_flt:
    1145           0 :                                 nils = add_hge_lng_flt(lft, incr1, rgt, incr2,
    1146             :                                                        dst, GDK_flt_max,
    1147             :                                                        ci1, ci2, candoff1, candoff2);
    1148           0 :                                 break;
    1149           0 :                         case TYPE_dbl:
    1150           0 :                                 nils = add_hge_lng_dbl(lft, incr1, rgt, incr2,
    1151             :                                                        dst, GDK_dbl_max,
    1152             :                                                        ci1, ci2, candoff1, candoff2);
    1153           0 :                                 break;
    1154           0 :                         default:
    1155           0 :                                 goto unsupported;
    1156             :                         }
    1157             :                         break;
    1158         233 :                 case TYPE_hge:
    1159         233 :                         switch (tp) {
    1160         233 :                         case TYPE_hge:
    1161         233 :                                 nils = add_hge_hge_hge(lft, incr1, rgt, incr2,
    1162             :                                                        dst, GDK_hge_max,
    1163             :                                                        ci1, ci2, candoff1, candoff2);
    1164         233 :                                 break;
    1165           0 :                         case TYPE_flt:
    1166           0 :                                 nils = add_hge_hge_flt(lft, incr1, rgt, incr2,
    1167             :                                                        dst, GDK_flt_max,
    1168             :                                                        ci1, ci2, candoff1, candoff2);
    1169           0 :                                 break;
    1170           0 :                         case TYPE_dbl:
    1171           0 :                                 nils = add_hge_hge_dbl(lft, incr1, rgt, incr2,
    1172             :                                                        dst, GDK_dbl_max,
    1173             :                                                        ci1, ci2, candoff1, candoff2);
    1174           0 :                                 break;
    1175           0 :                         default:
    1176           0 :                                 goto unsupported;
    1177             :                         }
    1178             :                         break;
    1179           0 :                 case TYPE_flt:
    1180           0 :                         switch (tp) {
    1181           0 :                         case TYPE_flt:
    1182           0 :                                 nils = add_hge_flt_flt(lft, incr1, rgt, incr2,
    1183             :                                                        dst, GDK_flt_max,
    1184             :                                                        ci1, ci2, candoff1, candoff2);
    1185           0 :                                 break;
    1186           0 :                         case TYPE_dbl:
    1187           0 :                                 nils = add_hge_flt_dbl(lft, incr1, rgt, incr2,
    1188             :                                                        dst, GDK_dbl_max,
    1189             :                                                        ci1, ci2, candoff1, candoff2);
    1190           0 :                                 break;
    1191           0 :                         default:
    1192           0 :                                 goto unsupported;
    1193             :                         }
    1194             :                         break;
    1195           0 :                 case TYPE_dbl:
    1196           0 :                         switch (tp) {
    1197           0 :                         case TYPE_dbl:
    1198           0 :                                 nils = add_hge_dbl_dbl(lft, incr1, rgt, incr2,
    1199             :                                                        dst, GDK_dbl_max,
    1200             :                                                        ci1, ci2, candoff1, candoff2);
    1201           0 :                                 break;
    1202           0 :                         default:
    1203           0 :                                 goto unsupported;
    1204             :                         }
    1205           0 :                         break;
    1206           0 :                 default:
    1207           0 :                         goto unsupported;
    1208             :                 }
    1209             :                 break;
    1210             : #endif
    1211          56 :         case TYPE_flt:
    1212          56 :                 switch (tp2) {
    1213           0 :                 case TYPE_bte:
    1214           0 :                         switch (tp) {
    1215           0 :                         case TYPE_flt:
    1216           0 :                                 nils = add_flt_bte_flt(lft, incr1, rgt, incr2,
    1217             :                                                        dst, GDK_flt_max,
    1218             :                                                        ci1, ci2, candoff1, candoff2);
    1219           0 :                                 break;
    1220           0 :                         case TYPE_dbl:
    1221           0 :                                 nils = add_flt_bte_dbl(lft, incr1, rgt, incr2,
    1222             :                                                        dst, GDK_dbl_max,
    1223             :                                                        ci1, ci2, candoff1, candoff2);
    1224           0 :                                 break;
    1225           0 :                         default:
    1226           0 :                                 goto unsupported;
    1227             :                         }
    1228             :                         break;
    1229           0 :                 case TYPE_sht:
    1230           0 :                         switch (tp) {
    1231           0 :                         case TYPE_flt:
    1232           0 :                                 nils = add_flt_sht_flt(lft, incr1, rgt, incr2,
    1233             :                                                        dst, GDK_flt_max,
    1234             :                                                        ci1, ci2, candoff1, candoff2);
    1235           0 :                                 break;
    1236           0 :                         case TYPE_dbl:
    1237           0 :                                 nils = add_flt_sht_dbl(lft, incr1, rgt, incr2,
    1238             :                                                        dst, GDK_dbl_max,
    1239             :                                                        ci1, ci2, candoff1, candoff2);
    1240           0 :                                 break;
    1241           0 :                         default:
    1242           0 :                                 goto unsupported;
    1243             :                         }
    1244             :                         break;
    1245           1 :                 case TYPE_int:
    1246           1 :                         switch (tp) {
    1247           1 :                         case TYPE_flt:
    1248           1 :                                 nils = add_flt_int_flt(lft, incr1, rgt, incr2,
    1249             :                                                        dst, GDK_flt_max,
    1250             :                                                        ci1, ci2, candoff1, candoff2);
    1251           1 :                                 break;
    1252           0 :                         case TYPE_dbl:
    1253           0 :                                 nils = add_flt_int_dbl(lft, incr1, rgt, incr2,
    1254             :                                                        dst, GDK_dbl_max,
    1255             :                                                        ci1, ci2, candoff1, candoff2);
    1256           0 :                                 break;
    1257           0 :                         default:
    1258           0 :                                 goto unsupported;
    1259             :                         }
    1260             :                         break;
    1261           0 :                 case TYPE_lng:
    1262           0 :                         switch (tp) {
    1263           0 :                         case TYPE_flt:
    1264           0 :                                 nils = add_flt_lng_flt(lft, incr1, rgt, incr2,
    1265             :                                                        dst, GDK_flt_max,
    1266             :                                                        ci1, ci2, candoff1, candoff2);
    1267           0 :                                 break;
    1268           0 :                         case TYPE_dbl:
    1269           0 :                                 nils = add_flt_lng_dbl(lft, incr1, rgt, incr2,
    1270             :                                                        dst, GDK_dbl_max,
    1271             :                                                        ci1, ci2, candoff1, candoff2);
    1272           0 :                                 break;
    1273           0 :                         default:
    1274           0 :                                 goto unsupported;
    1275             :                         }
    1276             :                         break;
    1277             : #ifdef HAVE_HGE
    1278           0 :                 case TYPE_hge:
    1279           0 :                         switch (tp) {
    1280           0 :                         case TYPE_flt:
    1281           0 :                                 nils = add_flt_hge_flt(lft, incr1, rgt, incr2,
    1282             :                                                        dst, GDK_flt_max,
    1283             :                                                        ci1, ci2, candoff1, candoff2);
    1284           0 :                                 break;
    1285           0 :                         case TYPE_dbl:
    1286           0 :                                 nils = add_flt_hge_dbl(lft, incr1, rgt, incr2,
    1287             :                                                        dst, GDK_dbl_max,
    1288             :                                                        ci1, ci2, candoff1, candoff2);
    1289           0 :                                 break;
    1290           0 :                         default:
    1291           0 :                                 goto unsupported;
    1292             :                         }
    1293             :                         break;
    1294             : #endif
    1295          55 :                 case TYPE_flt:
    1296          55 :                         switch (tp) {
    1297          55 :                         case TYPE_flt:
    1298          55 :                                 nils = add_flt_flt_flt(lft, incr1, rgt, incr2,
    1299             :                                                        dst, GDK_flt_max,
    1300             :                                                        ci1, ci2, candoff1, candoff2);
    1301          55 :                                 break;
    1302           0 :                         case TYPE_dbl:
    1303           0 :                                 nils = add_flt_flt_dbl(lft, incr1, rgt, incr2,
    1304             :                                                        dst, GDK_dbl_max,
    1305             :                                                        ci1, ci2, candoff1, candoff2);
    1306           0 :                                 break;
    1307           0 :                         default:
    1308           0 :                                 goto unsupported;
    1309             :                         }
    1310             :                         break;
    1311           0 :                 case TYPE_dbl:
    1312           0 :                         switch (tp) {
    1313           0 :                         case TYPE_dbl:
    1314           0 :                                 nils = add_flt_dbl_dbl(lft, incr1, rgt, incr2,
    1315             :                                                        dst, GDK_dbl_max,
    1316             :                                                        ci1, ci2, candoff1, candoff2);
    1317           0 :                                 break;
    1318           0 :                         default:
    1319           0 :                                 goto unsupported;
    1320             :                         }
    1321           0 :                         break;
    1322           0 :                 default:
    1323           0 :                         goto unsupported;
    1324             :                 }
    1325             :                 break;
    1326         124 :         case TYPE_dbl:
    1327         124 :                 switch (tp2) {
    1328           0 :                 case TYPE_bte:
    1329           0 :                         switch (tp) {
    1330           0 :                         case TYPE_dbl:
    1331           0 :                                 nils = add_dbl_bte_dbl(lft, incr1, rgt, incr2,
    1332             :                                                        dst, GDK_dbl_max,
    1333             :                                                        ci1, ci2, candoff1, candoff2);
    1334           0 :                                 break;
    1335           0 :                         default:
    1336           0 :                                 goto unsupported;
    1337             :                         }
    1338           0 :                         break;
    1339           0 :                 case TYPE_sht:
    1340           0 :                         switch (tp) {
    1341           0 :                         case TYPE_dbl:
    1342           0 :                                 nils = add_dbl_sht_dbl(lft, incr1, rgt, incr2,
    1343             :                                                        dst, GDK_dbl_max,
    1344             :                                                        ci1, ci2, candoff1, candoff2);
    1345           0 :                                 break;
    1346           0 :                         default:
    1347           0 :                                 goto unsupported;
    1348             :                         }
    1349           0 :                         break;
    1350           0 :                 case TYPE_int:
    1351           0 :                         switch (tp) {
    1352           0 :                         case TYPE_dbl:
    1353           0 :                                 nils = add_dbl_int_dbl(lft, incr1, rgt, incr2,
    1354             :                                                        dst, GDK_dbl_max,
    1355             :                                                        ci1, ci2, candoff1, candoff2);
    1356           0 :                                 break;
    1357           0 :                         default:
    1358           0 :                                 goto unsupported;
    1359             :                         }
    1360           0 :                         break;
    1361           0 :                 case TYPE_lng:
    1362           0 :                         switch (tp) {
    1363           0 :                         case TYPE_dbl:
    1364           0 :                                 nils = add_dbl_lng_dbl(lft, incr1, rgt, incr2,
    1365             :                                                        dst, GDK_dbl_max,
    1366             :                                                        ci1, ci2, candoff1, candoff2);
    1367           0 :                                 break;
    1368           0 :                         default:
    1369           0 :                                 goto unsupported;
    1370             :                         }
    1371           0 :                         break;
    1372             : #ifdef HAVE_HGE
    1373           0 :                 case TYPE_hge:
    1374           0 :                         switch (tp) {
    1375           0 :                         case TYPE_dbl:
    1376           0 :                                 nils = add_dbl_hge_dbl(lft, incr1, rgt, incr2,
    1377             :                                                        dst, GDK_dbl_max,
    1378             :                                                        ci1, ci2, candoff1, candoff2);
    1379           0 :                                 break;
    1380           0 :                         default:
    1381           0 :                                 goto unsupported;
    1382             :                         }
    1383           0 :                         break;
    1384             : #endif
    1385           0 :                 case TYPE_flt:
    1386           0 :                         switch (tp) {
    1387           0 :                         case TYPE_dbl:
    1388           0 :                                 nils = add_dbl_flt_dbl(lft, incr1, rgt, incr2,
    1389             :                                                        dst, GDK_dbl_max,
    1390             :                                                        ci1, ci2, candoff1, candoff2);
    1391           0 :                                 break;
    1392           0 :                         default:
    1393           0 :                                 goto unsupported;
    1394             :                         }
    1395           0 :                         break;
    1396         124 :                 case TYPE_dbl:
    1397         124 :                         switch (tp) {
    1398         124 :                         case TYPE_dbl:
    1399         124 :                                 nils = add_dbl_dbl_dbl(lft, incr1, rgt, incr2,
    1400             :                                                        dst, GDK_dbl_max,
    1401             :                                                        ci1, ci2, candoff1, candoff2);
    1402         124 :                                 break;
    1403           0 :                         default:
    1404           0 :                                 goto unsupported;
    1405             :                         }
    1406         124 :                         break;
    1407           0 :                 default:
    1408           0 :                         goto unsupported;
    1409             :                 }
    1410             :                 break;
    1411           0 :         default:
    1412           0 :                 goto unsupported;
    1413             :         }
    1414             : 
    1415             :         return nils;
    1416             : 
    1417           0 :   unsupported:
    1418           0 :         GDKerror("%s: type combination (add(%s,%s)->%s) not supported.\n",
    1419             :                  func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
    1420           0 :         return BUN_NONE;
    1421             : }
    1422             : 
    1423             : static BUN
    1424        1070 : addstr_loop(BAT *b1, const char *l, BAT *b2, const char *r, BAT *bn,
    1425             :             BATiter *b1i, BATiter *b2i,
    1426             :             struct canditer *restrict ci1, struct canditer *restrict ci2)
    1427             : {
    1428        1070 :         BUN nils = 0, ncand = ci1->ncand;
    1429        1070 :         char *s;
    1430        1070 :         size_t slen, llen, rlen;
    1431        1070 :         oid candoff1, candoff2;
    1432             : 
    1433        1070 :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();
    1434             : 
    1435        1070 :         assert(b1 != NULL || b2 != NULL); /* at least one not NULL */
    1436        1070 :         candoff1 = b1 ? b1->hseqbase : 0;
    1437        1070 :         candoff2 = b2 ? b2->hseqbase : 0;
    1438        1070 :         slen = 1024;
    1439        1070 :         s = GDKmalloc(slen);
    1440        1069 :         if (s == NULL)
    1441             :                 return BUN_NONE;
    1442    11942225 :         TIMEOUT_LOOP_IDX_DECL(i, ncand, qry_ctx) {
    1443    11938288 :                 oid x1 = canditer_next(ci1) - candoff1;
    1444    11802236 :                 oid x2 = canditer_next(ci2) - candoff2;
    1445    11626837 :                 if (b1)
    1446     4432205 :                         l = BUNtvar(*b1i, x1);
    1447    11681752 :                 if (b2)
    1448     8418036 :                         r = BUNtvar(*b2i, x2);
    1449    23296685 :                 if (strNil(l) || strNil(r)) {
    1450         408 :                         nils++;
    1451         408 :                         if (tfastins_nocheckVAR(bn, i, str_nil) != GDK_SUCCEED)
    1452           0 :                                 goto bailout;
    1453             :                 } else {
    1454    11648130 :                         llen = strlen(l);
    1455    11648130 :                         rlen = strlen(r);
    1456    11648130 :                         if (llen + rlen >= slen) {
    1457           0 :                                 slen = llen + rlen + 1024;
    1458           0 :                                 GDKfree(s);
    1459           0 :                                 s = GDKmalloc(slen);
    1460           0 :                                 if (s == NULL)
    1461           0 :                                         goto bailout;
    1462             :                         }
    1463    11648130 :                         (void) stpcpy(stpcpy(s, l), r);
    1464    11648130 :                         if (tfastins_nocheckVAR(bn, i, s) != GDK_SUCCEED)
    1465           0 :                                 goto bailout;
    1466             :                 }
    1467             :         }
    1468        1070 :         TIMEOUT_CHECK(qry_ctx,
    1469             :                       GOTO_LABEL_TIMEOUT_HANDLER(bailout, qry_ctx));
    1470        1070 :         GDKfree(s);
    1471        1070 :         bn->theap->dirty = true;
    1472        1070 :         return nils;
    1473             : 
    1474           0 :   bailout:
    1475           0 :         GDKfree(s);
    1476           0 :         return BUN_NONE;
    1477             : }
    1478             : 
    1479             : BAT *
    1480       72013 : BATcalcadd(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
    1481             : {
    1482       72013 :         lng t0 = 0;
    1483       72013 :         BAT *bn;
    1484       72013 :         BUN nils;
    1485       72013 :         struct canditer ci1, ci2;
    1486             : 
    1487       72013 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    1488             : 
    1489       72013 :         BATcheck(b1, NULL);
    1490       72013 :         BATcheck(b2, NULL);
    1491             : 
    1492       72013 :         canditer_init(&ci1, b1, s1);
    1493       72070 :         canditer_init(&ci2, b2, s2);
    1494       72108 :         if (ci1.ncand != ci2.ncand || ci1.hseq != ci2.hseq) {
    1495           0 :                 GDKerror("inputs not the same size.\n");
    1496           0 :                 return NULL;
    1497             :         }
    1498             : 
    1499       72108 :         bn = COLnew(ci1.hseq, tp, ci1.ncand, TRANSIENT);
    1500       71958 :         if (bn == NULL)
    1501             :                 return NULL;
    1502       71958 :         if (ci1.ncand == 0)
    1503             :                 return bn;
    1504             : 
    1505       45226 :         BATiter b1i = bat_iterator(b1);
    1506       45289 :         BATiter b2i = bat_iterator(b2);
    1507       45277 :         if (b1i.type == TYPE_str && b2i.type == TYPE_str && tp == TYPE_str) {
    1508         342 :                 nils = addstr_loop(b1, NULL, b2, NULL, bn, &b1i, &b2i, &ci1, &ci2);
    1509             :         } else {
    1510       44935 :                 nils = add_typeswitchloop(b1i.base, b1i.type, true,
    1511       44935 :                                           b2i.base, b2i.type, true,
    1512       44935 :                                           Tloc(bn, 0), tp,
    1513             :                                           &ci1, &ci2,
    1514             :                                           b1->hseqbase, b2->hseqbase, __func__);
    1515             :         }
    1516             : 
    1517       45174 :         if (nils == BUN_NONE) {
    1518           0 :                 BBPunfix(bn->batCacheid);
    1519           0 :                 bat_iterator_end(&b1i);
    1520           0 :                 bat_iterator_end(&b2i);
    1521           0 :                 return NULL;
    1522             :         }
    1523             : 
    1524       45174 :         BATsetcount(bn, ci1.ncand);
    1525             : 
    1526             :         /* if both inputs are sorted the same way, and no overflow
    1527             :          * occurred, the result is also sorted */
    1528       22431 :         bn->tsorted = (b1i.sorted && b2i.sorted && nils == 0)
    1529       48049 :                 || ci1.ncand <= 1 || nils == ci1.ncand;
    1530       10814 :         bn->trevsorted = (b1i.revsorted && b2i.revsorted && nils == 0)
    1531       47702 :                 || ci1.ncand <= 1 || nils == ci1.ncand;
    1532       45210 :         bn->tkey = ci1.ncand <= 1;
    1533       45210 :         bn->tnil = nils != 0;
    1534       45210 :         bn->tnonil = nils == 0;
    1535       45210 :         bat_iterator_end(&b1i);
    1536       45248 :         bat_iterator_end(&b2i);
    1537             : 
    1538       45291 :         TRC_DEBUG(ALGO, "b1=" ALGOBATFMT ",b2=" ALGOBATFMT
    1539             :                   ",s1=" ALGOOPTBATFMT ",s2=" ALGOOPTBATFMT
    1540             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    1541             :                   ALGOBATPAR(b1), ALGOBATPAR(b2),
    1542             :                   ALGOOPTBATPAR(s1), ALGOOPTBATPAR(s2),
    1543             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    1544             : 
    1545             :         return bn;
    1546             : }
    1547             : 
    1548             : BAT *
    1549       52785 : BATcalcaddcst(BAT *b, const ValRecord *v, BAT *s, int tp)
    1550             : {
    1551       52785 :         lng t0 = 0;
    1552       52785 :         BAT *bn;
    1553       52785 :         BUN nils;
    1554       52785 :         struct canditer ci;
    1555             : 
    1556       52785 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    1557             : 
    1558       52785 :         BATcheck(b, NULL);
    1559             : 
    1560       52785 :         canditer_init(&ci, b, s);
    1561             : 
    1562       52781 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    1563       52816 :         if (bn == NULL)
    1564             :                 return NULL;
    1565       52816 :         if (ci.ncand == 0)
    1566             :                 return bn;
    1567             : 
    1568       29419 :         BATiter bi = bat_iterator(b);
    1569       29433 :         if (bi.type == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
    1570         446 :                 nils = addstr_loop(b, NULL, NULL, v->val.sval, bn, &bi, &(BATiter){0}, &ci, &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand});
    1571             :         } else {
    1572       28933 :                 nils = add_typeswitchloop(bi.base, bi.type, true,
    1573       28987 :                                           VALptr(v), v->vtype, false,
    1574       28987 :                                           Tloc(bn, 0), tp,
    1575             :                                           &ci,
    1576       28987 :                                           &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    1577             :                                           b->hseqbase, 0, __func__);
    1578             :         }
    1579             : 
    1580       29379 :         if (nils == BUN_NONE) {
    1581           0 :                 bat_iterator_end(&bi);
    1582           0 :                 BBPunfix(bn->batCacheid);
    1583           0 :                 return NULL;
    1584             :         }
    1585             : 
    1586       29379 :         BATsetcount(bn, ci.ncand);
    1587             : 
    1588             :         /* if the input is sorted, and no overflow occurred, the result
    1589             :          * is also sorted */
    1590       11189 :         bn->tsorted = (bi.sorted && nils == 0 && bi.type != TYPE_str) ||
    1591       29905 :                 ci.ncand <= 1 || nils == ci.ncand;
    1592        4551 :         bn->trevsorted = (bi.revsorted && nils == 0 && bi.type != TYPE_str) ||
    1593       29855 :                 ci.ncand <= 1 || nils == ci.ncand;
    1594       29400 :         bn->tkey = ci.ncand <= 1;
    1595       29400 :         bn->tnil = nils != 0;
    1596       29400 :         bn->tnonil = nils == 0;
    1597       29400 :         bat_iterator_end(&bi);
    1598             : 
    1599       29423 :         TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    1600             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    1601             :                   ALGOBATPAR(b), ALGOOPTBATPAR(s),
    1602             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    1603             : 
    1604             :         return bn;
    1605             : }
    1606             : 
    1607             : BAT *
    1608         607 : BATcalccstadd(const ValRecord *v, BAT *b, BAT *s, int tp)
    1609             : {
    1610         607 :         lng t0 = 0;
    1611         607 :         BAT *bn;
    1612         607 :         BUN nils;
    1613         607 :         struct canditer ci;
    1614             : 
    1615         607 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    1616             : 
    1617         607 :         BATcheck(b, NULL);
    1618             : 
    1619         607 :         canditer_init(&ci, b, s);
    1620             : 
    1621         607 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    1622         608 :         if (bn == NULL)
    1623             :                 return NULL;
    1624         608 :         if (ci.ncand == 0)
    1625             :                 return bn;
    1626             : 
    1627         288 :         BATiter bi = bat_iterator(b);
    1628         288 :         if (bi.type == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
    1629         282 :                 nils = addstr_loop(NULL, v->val.sval, b, NULL, bn, &(BATiter){0}, &bi, &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand}, &ci);
    1630             :         } else {
    1631           6 :                 nils = add_typeswitchloop(VALptr(v), v->vtype, false,
    1632           6 :                                           bi.base, bi.type, true,
    1633           6 :                                           Tloc(bn, 0), tp,
    1634           6 :                                           &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    1635             :                                           &ci,
    1636             :                                           0, b->hseqbase, __func__);
    1637             :         }
    1638             : 
    1639         288 :         if (nils == BUN_NONE) {
    1640           0 :                 bat_iterator_end(&bi);
    1641           0 :                 BBPunfix(bn->batCacheid);
    1642           0 :                 return NULL;
    1643             :         }
    1644             : 
    1645         288 :         BATsetcount(bn, ci.ncand);
    1646             : 
    1647             :         /* if the input is sorted, and no overflow occurred, the result
    1648             :          * is also sorted */
    1649          87 :         bn->tsorted = (bi.sorted && nils == 0) ||
    1650         289 :                 ci.ncand <= 1 || nils == ci.ncand;
    1651          75 :         bn->trevsorted = (bi.revsorted && nils == 0) ||
    1652         289 :                 ci.ncand <= 1 || nils == ci.ncand;
    1653         288 :         bn->tkey = ci.ncand <= 1;
    1654         288 :         bn->tnil = nils != 0;
    1655         288 :         bn->tnonil = nils == 0;
    1656         288 :         bat_iterator_end(&bi);
    1657             : 
    1658         288 :         TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    1659             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    1660             :                   ALGOBATPAR(b), ALGOOPTBATPAR(s),
    1661             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    1662             : 
    1663             :         return bn;
    1664             : }
    1665             : 
    1666             : gdk_return
    1667      151924 : VARcalcadd(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
    1668             : {
    1669      151924 :         ret->bat = false;
    1670      151929 :         if (add_typeswitchloop(VALptr(lft), lft->vtype, false,
    1671      151933 :                                VALptr(rgt), rgt->vtype, false,
    1672      151924 :                                VALget(ret), ret->vtype,
    1673      151924 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    1674      151924 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    1675             :                                0, 0, __func__) == BUN_NONE)
    1676          30 :                 return GDK_FAIL;
    1677      151899 :         return GDK_SUCCEED;
    1678             : }
    1679             : 
    1680             : static BAT *
    1681           0 : BATcalcincrdecr(BAT *b, BAT *s,
    1682             :                 BUN (*typeswitchloop)(const void *, int, bool,
    1683             :                                       const void *, int, bool,
    1684             :                                       void *, int,
    1685             :                                       struct canditer *restrict,
    1686             :                                       struct canditer *restrict,
    1687             :                                       oid, oid, const char *),
    1688             :                 const char *func)
    1689             : {
    1690           0 :         lng t0 = 0;
    1691           0 :         BAT *bn;
    1692           0 :         BUN nils= 0;
    1693           0 :         struct canditer ci;
    1694             : 
    1695           0 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    1696             : 
    1697           0 :         BATcheck(b, NULL);
    1698             : 
    1699           0 :         canditer_init(&ci, b, s);
    1700             : 
    1701           0 :         bn = COLnew(ci.hseq, b->ttype, ci.ncand, TRANSIENT);
    1702           0 :         if (bn == NULL)
    1703             :                 return NULL;
    1704           0 :         if (ci.ncand == 0)
    1705             :                 return bn;
    1706             : 
    1707           0 :         BATiter bi = bat_iterator(b);
    1708           0 :         nils = (*typeswitchloop)(bi.base, bi.type, true,
    1709           0 :                                  &(bte){1}, TYPE_bte, false,
    1710           0 :                                  Tloc(bn, 0), bn->ttype,
    1711           0 :                                  &(struct canditer){.tpe=cand_dense, .ncand=1},
    1712             :                                  &ci,
    1713             :                                  0, b->hseqbase, func);
    1714             : 
    1715           0 :         if (nils == BUN_NONE) {
    1716           0 :                 bat_iterator_end(&bi);
    1717           0 :                 BBPunfix(bn->batCacheid);
    1718           0 :                 return NULL;
    1719             :         }
    1720             : 
    1721           0 :         BATsetcount(bn, ci.ncand);
    1722             : 
    1723             :         /* if the input is sorted, and no overflow occurred, the result
    1724             :          * is also sorted */
    1725           0 :         bn->tsorted = bi.sorted || ci.ncand <= 1 || nils == ci.ncand;
    1726           0 :         bn->trevsorted = bi.revsorted || ci.ncand <= 1 || nils == ci.ncand;
    1727           0 :         bn->tkey = ci.ncand <= 1;
    1728           0 :         bn->tnil = nils != 0;
    1729           0 :         bn->tnonil = nils == 0;
    1730           0 :         bat_iterator_end(&bi);
    1731             : 
    1732           0 :         TRC_DEBUG(ALGO, "%s: b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    1733             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    1734             :                   func, ALGOBATPAR(b), ALGOOPTBATPAR(s),
    1735             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    1736             : 
    1737             :         return bn;
    1738             : }
    1739             : 
    1740             : BAT *
    1741           0 : BATcalcincr(BAT *b, BAT *s)
    1742             : {
    1743           0 :         return BATcalcincrdecr(b, s, add_typeswitchloop,
    1744             :                                __func__);
    1745             : }
    1746             : 
    1747             : gdk_return
    1748       17365 : VARcalcincr(ValPtr ret, const ValRecord *v)
    1749             : {
    1750       17365 :         ret->bat = false;
    1751       17365 :         if (add_typeswitchloop(VALptr(v), v->vtype, false,
    1752       17365 :                                &(bte){1}, TYPE_bte, false,
    1753       17365 :                                VALget(ret), ret->vtype,
    1754       17365 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    1755       17365 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    1756             :                                0, 0, __func__) == BUN_NONE)
    1757           0 :                 return GDK_FAIL;
    1758       17365 :         return GDK_SUCCEED;
    1759             : }
    1760             : 
    1761             : /* ---------------------------------------------------------------------- */
    1762             : /* subtraction (any numeric type) */
    1763             : 
    1764             : #define SUB_3TYPE(TYPE1, TYPE2, TYPE3, IF)                              \
    1765             : static BUN                                                              \
    1766             : sub_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,           \
    1767             :                                 const TYPE2 *rgt, bool incr2,           \
    1768             :                                 TYPE3 *restrict dst, TYPE3 max,         \
    1769             :                                 struct canditer *restrict ci1,          \
    1770             :                                 struct canditer *restrict ci2,          \
    1771             :                                 oid candoff1, oid candoff2)             \
    1772             : {                                                                       \
    1773             :         BUN nils = 0;                                                   \
    1774             :         BUN i = 0, j = 0, ncand = ci1->ncand;                                \
    1775             :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();                      \
    1776             :                                                                         \
    1777             :         if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {           \
    1778             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) {              \
    1779             :                         if (incr1)                                      \
    1780             :                                 i = canditer_next_dense(ci1) - candoff1; \
    1781             :                         if (incr2)                                      \
    1782             :                                 j = canditer_next_dense(ci2) - candoff2; \
    1783             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
    1784             :                                 dst[k] = TYPE3##_nil;                   \
    1785             :                                 nils++;                                 \
    1786             :                         } else {                                        \
    1787             :                                 SUB##IF##_WITH_CHECK(lft[i], rgt[j],    \
    1788             :                                                      TYPE3, dst[k],     \
    1789             :                                                      max,               \
    1790             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "-")); \
    1791             :                         }                                               \
    1792             :                 }                                                       \
    1793             :                 TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
    1794             :         } else {                                                        \
    1795             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) {              \
    1796             :                         if (incr1)                                      \
    1797             :                                 i = canditer_next(ci1) - candoff1;      \
    1798             :                         if (incr2)                                      \
    1799             :                                 j = canditer_next(ci2) - candoff2;      \
    1800             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
    1801             :                                 dst[k] = TYPE3##_nil;                   \
    1802             :                                 nils++;                                 \
    1803             :                         } else {                                        \
    1804             :                                 SUB##IF##_WITH_CHECK(lft[i], rgt[j],    \
    1805             :                                                      TYPE3, dst[k],     \
    1806             :                                                      max,               \
    1807             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "-")); \
    1808             :                         }                                               \
    1809             :                 }                                                       \
    1810             :                 TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
    1811             :         }                                                               \
    1812             :         return nils;                                                    \
    1813             : }
    1814             : 
    1815             : #define SUB_3TYPE_enlarge(TYPE1, TYPE2, TYPE3, IF)                      \
    1816             : static BUN                                                              \
    1817             : sub_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,           \
    1818             :                                 const TYPE2 *rgt, bool incr2,           \
    1819             :                                 TYPE3 *restrict dst, TYPE3 max,         \
    1820             :                                 struct canditer *restrict ci1,          \
    1821             :                                 struct canditer *restrict ci2,          \
    1822             :                                 oid candoff1, oid candoff2)             \
    1823             : {                                                                       \
    1824             :         BUN nils = 0;                                                   \
    1825             :         BUN i = 0, j = 0, ncand = ci1->ncand;                                \
    1826             :         const bool couldoverflow = (max < (TYPE3) GDK_##TYPE1##_max + (TYPE3) GDK_##TYPE2##_max); \
    1827             :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();                      \
    1828             :                                                                         \
    1829             :         if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {           \
    1830             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) {              \
    1831             :                         if (incr1)                                      \
    1832             :                                 i = canditer_next_dense(ci1) - candoff1; \
    1833             :                         if (incr2)                                      \
    1834             :                                 j = canditer_next_dense(ci2) - candoff2; \
    1835             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
    1836             :                                 dst[k] = TYPE3##_nil;                   \
    1837             :                                 nils++;                                 \
    1838             :                         } else if (couldoverflow) {                     \
    1839             :                                 SUB##IF##_WITH_CHECK(lft[i], rgt[j],    \
    1840             :                                                      TYPE3, dst[k],     \
    1841             :                                                      max,               \
    1842             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "-")); \
    1843             :                         } else {                                        \
    1844             :                                 dst[k] = (TYPE3) lft[i] - rgt[j];       \
    1845             :                         }                                               \
    1846             :                 }                                                       \
    1847             :                 TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
    1848             :         } else {                                                        \
    1849             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) {              \
    1850             :                         if (incr1)                                      \
    1851             :                                 i = canditer_next(ci1) - candoff1;      \
    1852             :                         if (incr2)                                      \
    1853             :                                 j = canditer_next(ci2) - candoff2;      \
    1854             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
    1855             :                                 dst[k] = TYPE3##_nil;                   \
    1856             :                                 nils++;                                 \
    1857             :                         } else if (couldoverflow) {                     \
    1858             :                                 SUB##IF##_WITH_CHECK(lft[i], rgt[j],    \
    1859             :                                                      TYPE3, dst[k],     \
    1860             :                                                      max,               \
    1861             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "-")); \
    1862             :                         } else {                                        \
    1863             :                                 dst[k] = (TYPE3) lft[i] - rgt[j];       \
    1864             :                         }                                               \
    1865             :                 }                                                       \
    1866             :                 TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
    1867             :         }                                                               \
    1868             :         return nils;                                                    \
    1869             : }
    1870             : 
    1871        1504 : SUB_3TYPE(bte, bte, bte, I)
    1872          64 : SUB_3TYPE_enlarge(bte, bte, sht, I)
    1873           0 : SUB_3TYPE_enlarge(bte, bte, int, I)
    1874           0 : SUB_3TYPE_enlarge(bte, bte, lng, I)
    1875             : #ifdef HAVE_HGE
    1876           0 : SUB_3TYPE_enlarge(bte, bte, hge, I)
    1877             : #endif
    1878           0 : SUB_3TYPE_enlarge(bte, bte, flt, F)
    1879           0 : SUB_3TYPE_enlarge(bte, bte, dbl, F)
    1880           0 : SUB_3TYPE(bte, sht, sht, I)
    1881           0 : SUB_3TYPE_enlarge(bte, sht, int, I)
    1882           0 : SUB_3TYPE_enlarge(bte, sht, lng, I)
    1883             : #ifdef HAVE_HGE
    1884           0 : SUB_3TYPE_enlarge(bte, sht, hge, I)
    1885             : #endif
    1886           0 : SUB_3TYPE_enlarge(bte, sht, flt, F)
    1887           0 : SUB_3TYPE_enlarge(bte, sht, dbl, F)
    1888          12 : SUB_3TYPE(bte, int, int, I)
    1889           0 : SUB_3TYPE_enlarge(bte, int, lng, I)
    1890             : #ifdef HAVE_HGE
    1891           0 : SUB_3TYPE_enlarge(bte, int, hge, I)
    1892             : #endif
    1893           0 : SUB_3TYPE_enlarge(bte, int, flt, F)
    1894           0 : SUB_3TYPE_enlarge(bte, int, dbl, F)
    1895           0 : SUB_3TYPE(bte, lng, lng, I)
    1896             : #ifdef HAVE_HGE
    1897           0 : SUB_3TYPE_enlarge(bte, lng, hge, I)
    1898             : #endif
    1899           0 : SUB_3TYPE_enlarge(bte, lng, flt, F)
    1900           0 : SUB_3TYPE_enlarge(bte, lng, dbl, F)
    1901             : #ifdef HAVE_HGE
    1902           0 : SUB_3TYPE(bte, hge, hge, I)
    1903           0 : SUB_3TYPE_enlarge(bte, hge, flt, F)
    1904           0 : SUB_3TYPE_enlarge(bte, hge, dbl, F)
    1905             : #endif
    1906           0 : SUB_3TYPE(bte, flt, flt, F)
    1907           0 : SUB_3TYPE_enlarge(bte, flt, dbl, F)
    1908           0 : SUB_3TYPE(bte, dbl, dbl, F)
    1909           0 : SUB_3TYPE(sht, bte, sht, I)
    1910           0 : SUB_3TYPE_enlarge(sht, bte, int, I)
    1911           0 : SUB_3TYPE_enlarge(sht, bte, lng, I)
    1912             : #ifdef HAVE_HGE
    1913           0 : SUB_3TYPE_enlarge(sht, bte, hge, I)
    1914             : #endif
    1915           0 : SUB_3TYPE_enlarge(sht, bte, flt, F)
    1916           0 : SUB_3TYPE_enlarge(sht, bte, dbl, F)
    1917         420 : SUB_3TYPE(sht, sht, sht, I)
    1918          32 : SUB_3TYPE_enlarge(sht, sht, int, I)
    1919           0 : SUB_3TYPE_enlarge(sht, sht, lng, I)
    1920             : #ifdef HAVE_HGE
    1921           0 : SUB_3TYPE_enlarge(sht, sht, hge, I)
    1922             : #endif
    1923           0 : SUB_3TYPE_enlarge(sht, sht, flt, F)
    1924           0 : SUB_3TYPE_enlarge(sht, sht, dbl, F)
    1925           0 : SUB_3TYPE(sht, int, int, I)
    1926           0 : SUB_3TYPE_enlarge(sht, int, lng, I)
    1927             : #ifdef HAVE_HGE
    1928           0 : SUB_3TYPE_enlarge(sht, int, hge, I)
    1929             : #endif
    1930           0 : SUB_3TYPE_enlarge(sht, int, flt, F)
    1931           0 : SUB_3TYPE_enlarge(sht, int, dbl, F)
    1932       67686 : SUB_3TYPE(sht, lng, lng, I)
    1933             : #ifdef HAVE_HGE
    1934           0 : SUB_3TYPE_enlarge(sht, lng, hge, I)
    1935             : #endif
    1936           0 : SUB_3TYPE_enlarge(sht, lng, flt, F)
    1937           0 : SUB_3TYPE_enlarge(sht, lng, dbl, F)
    1938             : #ifdef HAVE_HGE
    1939           0 : SUB_3TYPE(sht, hge, hge, I)
    1940           0 : SUB_3TYPE_enlarge(sht, hge, flt, F)
    1941           0 : SUB_3TYPE_enlarge(sht, hge, dbl, F)
    1942             : #endif
    1943           0 : SUB_3TYPE(sht, flt, flt, F)
    1944           0 : SUB_3TYPE_enlarge(sht, flt, dbl, F)
    1945           0 : SUB_3TYPE(sht, dbl, dbl, F)
    1946           0 : SUB_3TYPE(int, bte, int, I)
    1947           0 : SUB_3TYPE_enlarge(int, bte, lng, I)
    1948             : #ifdef HAVE_HGE
    1949           0 : SUB_3TYPE_enlarge(int, bte, hge, I)
    1950             : #endif
    1951           0 : SUB_3TYPE_enlarge(int, bte, flt, F)
    1952           0 : SUB_3TYPE_enlarge(int, bte, dbl, F)
    1953           0 : SUB_3TYPE(int, sht, int, I)
    1954           0 : SUB_3TYPE_enlarge(int, sht, lng, I)
    1955             : #ifdef HAVE_HGE
    1956           0 : SUB_3TYPE_enlarge(int, sht, hge, I)
    1957             : #endif
    1958           0 : SUB_3TYPE_enlarge(int, sht, flt, F)
    1959           0 : SUB_3TYPE_enlarge(int, sht, dbl, F)
    1960    11392230 : SUB_3TYPE(int, int, int, I)
    1961     1162456 : SUB_3TYPE_enlarge(int, int, lng, I)
    1962             : #ifdef HAVE_HGE
    1963           0 : SUB_3TYPE_enlarge(int, int, hge, I)
    1964             : #endif
    1965           0 : SUB_3TYPE_enlarge(int, int, flt, F)
    1966           0 : SUB_3TYPE_enlarge(int, int, dbl, F)
    1967           0 : SUB_3TYPE(int, lng, lng, I)
    1968             : #ifdef HAVE_HGE
    1969           0 : SUB_3TYPE_enlarge(int, lng, hge, I)
    1970             : #endif
    1971           0 : SUB_3TYPE_enlarge(int, lng, flt, F)
    1972           0 : SUB_3TYPE_enlarge(int, lng, dbl, F)
    1973             : #ifdef HAVE_HGE
    1974           0 : SUB_3TYPE(int, hge, hge, I)
    1975           0 : SUB_3TYPE_enlarge(int, hge, flt, F)
    1976           0 : SUB_3TYPE_enlarge(int, hge, dbl, F)
    1977             : #endif
    1978           0 : SUB_3TYPE(int, flt, flt, F)
    1979           0 : SUB_3TYPE_enlarge(int, flt, dbl, F)
    1980           0 : SUB_3TYPE(int, dbl, dbl, F)
    1981           0 : SUB_3TYPE(lng, bte, lng, I)
    1982             : #ifdef HAVE_HGE
    1983           0 : SUB_3TYPE_enlarge(lng, bte, hge, I)
    1984             : #endif
    1985           0 : SUB_3TYPE_enlarge(lng, bte, flt, F)
    1986           0 : SUB_3TYPE_enlarge(lng, bte, dbl, F)
    1987           0 : SUB_3TYPE(lng, sht, lng, I)
    1988             : #ifdef HAVE_HGE
    1989           0 : SUB_3TYPE_enlarge(lng, sht, hge, I)
    1990             : #endif
    1991           0 : SUB_3TYPE_enlarge(lng, sht, flt, F)
    1992           0 : SUB_3TYPE_enlarge(lng, sht, dbl, F)
    1993       67372 : SUB_3TYPE(lng, int, lng, I)
    1994             : #ifdef HAVE_HGE
    1995           0 : SUB_3TYPE_enlarge(lng, int, hge, I)
    1996             : #endif
    1997           0 : SUB_3TYPE_enlarge(lng, int, flt, F)
    1998           0 : SUB_3TYPE_enlarge(lng, int, dbl, F)
    1999      186358 : SUB_3TYPE(lng, lng, lng, I)
    2000             : #ifdef HAVE_HGE
    2001    23796583 : SUB_3TYPE_enlarge(lng, lng, hge, I)
    2002             : #endif
    2003           0 : SUB_3TYPE_enlarge(lng, lng, flt, F)
    2004           0 : SUB_3TYPE_enlarge(lng, lng, dbl, F)
    2005             : #ifdef HAVE_HGE
    2006           0 : SUB_3TYPE(lng, hge, hge, I)
    2007           0 : SUB_3TYPE_enlarge(lng, hge, flt, F)
    2008           0 : SUB_3TYPE_enlarge(lng, hge, dbl, F)
    2009             : #endif
    2010           0 : SUB_3TYPE(lng, flt, flt, F)
    2011           0 : SUB_3TYPE_enlarge(lng, flt, dbl, F)
    2012           0 : SUB_3TYPE(lng, dbl, dbl, F)
    2013             : #ifdef HAVE_HGE
    2014           0 : SUB_3TYPE(hge, bte, hge, I)
    2015           0 : SUB_3TYPE_enlarge(hge, bte, flt, F)
    2016           0 : SUB_3TYPE_enlarge(hge, bte, dbl, F)
    2017           0 : SUB_3TYPE(hge, sht, hge, I)
    2018           0 : SUB_3TYPE_enlarge(hge, sht, flt, F)
    2019           0 : SUB_3TYPE_enlarge(hge, sht, dbl, F)
    2020           0 : SUB_3TYPE(hge, int, hge, I)
    2021           0 : SUB_3TYPE_enlarge(hge, int, flt, F)
    2022           0 : SUB_3TYPE_enlarge(hge, int, dbl, F)
    2023          12 : SUB_3TYPE(hge, lng, hge, I)
    2024           0 : SUB_3TYPE_enlarge(hge, lng, flt, F)
    2025           0 : SUB_3TYPE_enlarge(hge, lng, dbl, F)
    2026     1779490 : SUB_3TYPE(hge, hge, hge, I)
    2027           0 : SUB_3TYPE_enlarge(hge, hge, flt, F)
    2028           0 : SUB_3TYPE_enlarge(hge, hge, dbl, F)
    2029           0 : SUB_3TYPE(hge, flt, flt, F)
    2030           0 : SUB_3TYPE_enlarge(hge, flt, dbl, F)
    2031           0 : SUB_3TYPE(hge, dbl, dbl, F)
    2032             : #endif
    2033           0 : SUB_3TYPE(flt, bte, flt, F)
    2034           0 : SUB_3TYPE_enlarge(flt, bte, dbl, F)
    2035           0 : SUB_3TYPE(flt, sht, flt, F)
    2036           0 : SUB_3TYPE_enlarge(flt, sht, dbl, F)
    2037           0 : SUB_3TYPE(flt, int, flt, F)
    2038           0 : SUB_3TYPE_enlarge(flt, int, dbl, F)
    2039           0 : SUB_3TYPE(flt, lng, flt, F)
    2040           0 : SUB_3TYPE_enlarge(flt, lng, dbl, F)
    2041             : #ifdef HAVE_HGE
    2042           0 : SUB_3TYPE(flt, hge, flt, F)
    2043           0 : SUB_3TYPE_enlarge(flt, hge, dbl, F)
    2044             : #endif
    2045          72 : SUB_3TYPE(flt, flt, flt, F)
    2046           0 : SUB_3TYPE_enlarge(flt, flt, dbl, F)
    2047           0 : SUB_3TYPE(flt, dbl, dbl, F)
    2048           0 : SUB_3TYPE(dbl, bte, dbl, F)
    2049           0 : SUB_3TYPE(dbl, sht, dbl, F)
    2050           0 : SUB_3TYPE(dbl, int, dbl, F)
    2051           0 : SUB_3TYPE(dbl, lng, dbl, F)
    2052             : #ifdef HAVE_HGE
    2053           0 : SUB_3TYPE(dbl, hge, dbl, F)
    2054             : #endif
    2055           0 : SUB_3TYPE(dbl, flt, dbl, F)
    2056     6002022 : SUB_3TYPE(dbl, dbl, dbl, F)
    2057             : 
    2058             : static BUN
    2059       81423 : sub_typeswitchloop(const void *lft, int tp1, bool incr1,
    2060             :                    const void *rgt, int tp2, bool incr2,
    2061             :                    void *restrict dst, int tp,
    2062             :                    struct canditer *restrict ci1, struct canditer *restrict ci2,
    2063             :                    oid candoff1, oid candoff2, const char *func)
    2064             : {
    2065       81423 :         BUN nils;
    2066             : 
    2067       81423 :         tp1 = ATOMbasetype(tp1);
    2068       81423 :         tp2 = ATOMbasetype(tp2);
    2069       81423 :         tp = ATOMbasetype(tp);
    2070       81423 :         switch (tp1) {
    2071         394 :         case TYPE_bte:
    2072         394 :                 switch (tp2) {
    2073         391 :                 case TYPE_bte:
    2074         391 :                         switch (tp) {
    2075         376 :                         case TYPE_bte:
    2076         376 :                                 nils = sub_bte_bte_bte(lft, incr1, rgt, incr2,
    2077             :                                                        dst, GDK_bte_max,
    2078             :                                                        ci1, ci2, candoff1, candoff2);
    2079         376 :                                 break;
    2080          15 :                         case TYPE_sht:
    2081          15 :                                 nils = sub_bte_bte_sht(lft, incr1, rgt, incr2,
    2082             :                                                        dst, GDK_sht_max,
    2083             :                                                        ci1, ci2, candoff1, candoff2);
    2084          15 :                                 break;
    2085           0 :                         case TYPE_int:
    2086           0 :                                 nils = sub_bte_bte_int(lft, incr1, rgt, incr2,
    2087             :                                                        dst, GDK_int_max,
    2088             :                                                        ci1, ci2, candoff1, candoff2);
    2089           0 :                                 break;
    2090           0 :                         case TYPE_lng:
    2091           0 :                                 nils = sub_bte_bte_lng(lft, incr1, rgt, incr2,
    2092             :                                                        dst, GDK_lng_max,
    2093             :                                                        ci1, ci2, candoff1, candoff2);
    2094           0 :                                 break;
    2095             : #ifdef HAVE_HGE
    2096           0 :                         case TYPE_hge:
    2097           0 :                                 nils = sub_bte_bte_hge(lft, incr1, rgt, incr2,
    2098             :                                                        dst, GDK_hge_max,
    2099             :                                                        ci1, ci2, candoff1, candoff2);
    2100           0 :                                 break;
    2101             : #endif
    2102           0 :                         case TYPE_flt:
    2103           0 :                                 nils = sub_bte_bte_flt(lft, incr1, rgt, incr2,
    2104             :                                                        dst, GDK_flt_max,
    2105             :                                                        ci1, ci2, candoff1, candoff2);
    2106           0 :                                 break;
    2107           0 :                         case TYPE_dbl:
    2108           0 :                                 nils = sub_bte_bte_dbl(lft, incr1, rgt, incr2,
    2109             :                                                        dst, GDK_dbl_max,
    2110             :                                                        ci1, ci2, candoff1, candoff2);
    2111           0 :                                 break;
    2112           0 :                         default:
    2113           0 :                                 goto unsupported;
    2114             :                         }
    2115             :                         break;
    2116           0 :                 case TYPE_sht:
    2117           0 :                         switch (tp) {
    2118           0 :                         case TYPE_sht:
    2119           0 :                                 nils = sub_bte_sht_sht(lft, incr1, rgt, incr2,
    2120             :                                                        dst, GDK_sht_max,
    2121             :                                                        ci1, ci2, candoff1, candoff2);
    2122           0 :                                 break;
    2123           0 :                         case TYPE_int:
    2124           0 :                                 nils = sub_bte_sht_int(lft, incr1, rgt, incr2,
    2125             :                                                        dst, GDK_int_max,
    2126             :                                                        ci1, ci2, candoff1, candoff2);
    2127           0 :                                 break;
    2128           0 :                         case TYPE_lng:
    2129           0 :                                 nils = sub_bte_sht_lng(lft, incr1, rgt, incr2,
    2130             :                                                        dst, GDK_lng_max,
    2131             :                                                        ci1, ci2, candoff1, candoff2);
    2132           0 :                                 break;
    2133             : #ifdef HAVE_HGE
    2134           0 :                         case TYPE_hge:
    2135           0 :                                 nils = sub_bte_sht_hge(lft, incr1, rgt, incr2,
    2136             :                                                        dst, GDK_hge_max,
    2137             :                                                        ci1, ci2, candoff1, candoff2);
    2138           0 :                                 break;
    2139             : #endif
    2140           0 :                         case TYPE_flt:
    2141           0 :                                 nils = sub_bte_sht_flt(lft, incr1, rgt, incr2,
    2142             :                                                        dst, GDK_flt_max,
    2143             :                                                        ci1, ci2, candoff1, candoff2);
    2144           0 :                                 break;
    2145           0 :                         case TYPE_dbl:
    2146           0 :                                 nils = sub_bte_sht_dbl(lft, incr1, rgt, incr2,
    2147             :                                                        dst, GDK_dbl_max,
    2148             :                                                        ci1, ci2, candoff1, candoff2);
    2149           0 :                                 break;
    2150           0 :                         default:
    2151           0 :                                 goto unsupported;
    2152             :                         }
    2153             :                         break;
    2154           3 :                 case TYPE_int:
    2155           3 :                         switch (tp) {
    2156           3 :                         case TYPE_int:
    2157           3 :                                 nils = sub_bte_int_int(lft, incr1, rgt, incr2,
    2158             :                                                        dst, GDK_int_max,
    2159             :                                                        ci1, ci2, candoff1, candoff2);
    2160           3 :                                 break;
    2161           0 :                         case TYPE_lng:
    2162           0 :                                 nils = sub_bte_int_lng(lft, incr1, rgt, incr2,
    2163             :                                                        dst, GDK_lng_max,
    2164             :                                                        ci1, ci2, candoff1, candoff2);
    2165           0 :                                 break;
    2166             : #ifdef HAVE_HGE
    2167           0 :                         case TYPE_hge:
    2168           0 :                                 nils = sub_bte_int_hge(lft, incr1, rgt, incr2,
    2169             :                                                        dst, GDK_hge_max,
    2170             :                                                        ci1, ci2, candoff1, candoff2);
    2171           0 :                                 break;
    2172             : #endif
    2173           0 :                         case TYPE_flt:
    2174           0 :                                 nils = sub_bte_int_flt(lft, incr1, rgt, incr2,
    2175             :                                                        dst, GDK_flt_max,
    2176             :                                                        ci1, ci2, candoff1, candoff2);
    2177           0 :                                 break;
    2178           0 :                         case TYPE_dbl:
    2179           0 :                                 nils = sub_bte_int_dbl(lft, incr1, rgt, incr2,
    2180             :                                                        dst, GDK_dbl_max,
    2181             :                                                        ci1, ci2, candoff1, candoff2);
    2182           0 :                                 break;
    2183           0 :                         default:
    2184           0 :                                 goto unsupported;
    2185             :                         }
    2186             :                         break;
    2187           0 :                 case TYPE_lng:
    2188           0 :                         switch (tp) {
    2189           0 :                         case TYPE_lng:
    2190           0 :                                 nils = sub_bte_lng_lng(lft, incr1, rgt, incr2,
    2191             :                                                        dst, GDK_lng_max,
    2192             :                                                        ci1, ci2, candoff1, candoff2);
    2193           0 :                                 break;
    2194             : #ifdef HAVE_HGE
    2195           0 :                         case TYPE_hge:
    2196           0 :                                 nils = sub_bte_lng_hge(lft, incr1, rgt, incr2,
    2197             :                                                        dst, GDK_hge_max,
    2198             :                                                        ci1, ci2, candoff1, candoff2);
    2199           0 :                                 break;
    2200             : #endif
    2201           0 :                         case TYPE_flt:
    2202           0 :                                 nils = sub_bte_lng_flt(lft, incr1, rgt, incr2,
    2203             :                                                        dst, GDK_flt_max,
    2204             :                                                        ci1, ci2, candoff1, candoff2);
    2205           0 :                                 break;
    2206           0 :                         case TYPE_dbl:
    2207           0 :                                 nils = sub_bte_lng_dbl(lft, incr1, rgt, incr2,
    2208             :                                                        dst, GDK_dbl_max,
    2209             :                                                        ci1, ci2, candoff1, candoff2);
    2210           0 :                                 break;
    2211           0 :                         default:
    2212           0 :                                 goto unsupported;
    2213             :                         }
    2214             :                         break;
    2215             : #ifdef HAVE_HGE
    2216           0 :                 case TYPE_hge:
    2217           0 :                         switch (tp) {
    2218           0 :                         case TYPE_hge:
    2219           0 :                                 nils = sub_bte_hge_hge(lft, incr1, rgt, incr2,
    2220             :                                                        dst, GDK_hge_max,
    2221             :                                                        ci1, ci2, candoff1, candoff2);
    2222           0 :                                 break;
    2223           0 :                         case TYPE_flt:
    2224           0 :                                 nils = sub_bte_hge_flt(lft, incr1, rgt, incr2,
    2225             :                                                        dst, GDK_flt_max,
    2226             :                                                        ci1, ci2, candoff1, candoff2);
    2227           0 :                                 break;
    2228           0 :                         case TYPE_dbl:
    2229           0 :                                 nils = sub_bte_hge_dbl(lft, incr1, rgt, incr2,
    2230             :                                                        dst, GDK_dbl_max,
    2231             :                                                        ci1, ci2, candoff1, candoff2);
    2232           0 :                                 break;
    2233           0 :                         default:
    2234           0 :                                 goto unsupported;
    2235             :                         }
    2236             :                         break;
    2237             : #endif
    2238           0 :                 case TYPE_flt:
    2239           0 :                         switch (tp) {
    2240           0 :                         case TYPE_flt:
    2241           0 :                                 nils = sub_bte_flt_flt(lft, incr1, rgt, incr2,
    2242             :                                                        dst, GDK_flt_max,
    2243             :                                                        ci1, ci2, candoff1, candoff2);
    2244           0 :                                 break;
    2245           0 :                         case TYPE_dbl:
    2246           0 :                                 nils = sub_bte_flt_dbl(lft, incr1, rgt, incr2,
    2247             :                                                        dst, GDK_dbl_max,
    2248             :                                                        ci1, ci2, candoff1, candoff2);
    2249           0 :                                 break;
    2250           0 :                         default:
    2251           0 :                                 goto unsupported;
    2252             :                         }
    2253             :                         break;
    2254           0 :                 case TYPE_dbl:
    2255           0 :                         switch (tp) {
    2256           0 :                         case TYPE_dbl:
    2257           0 :                                 nils = sub_bte_dbl_dbl(lft, incr1, rgt, incr2,
    2258             :                                                        dst, GDK_dbl_max,
    2259             :                                                        ci1, ci2, candoff1, candoff2);
    2260           0 :                                 break;
    2261           0 :                         default:
    2262           0 :                                 goto unsupported;
    2263             :                         }
    2264           0 :                         break;
    2265           0 :                 default:
    2266           0 :                         goto unsupported;
    2267             :                 }
    2268             :                 break;
    2269         191 :         case TYPE_sht:
    2270         191 :                 switch (tp2) {
    2271           0 :                 case TYPE_bte:
    2272           0 :                         switch (tp) {
    2273           0 :                         case TYPE_sht:
    2274           0 :                                 nils = sub_sht_bte_sht(lft, incr1, rgt, incr2,
    2275             :                                                        dst, GDK_sht_max,
    2276             :                                                        ci1, ci2, candoff1, candoff2);
    2277           0 :                                 break;
    2278           0 :                         case TYPE_int:
    2279           0 :                                 nils = sub_sht_bte_int(lft, incr1, rgt, incr2,
    2280             :                                                        dst, GDK_int_max,
    2281             :                                                        ci1, ci2, candoff1, candoff2);
    2282           0 :                                 break;
    2283           0 :                         case TYPE_lng:
    2284           0 :                                 nils = sub_sht_bte_lng(lft, incr1, rgt, incr2,
    2285             :                                                        dst, GDK_lng_max,
    2286             :                                                        ci1, ci2, candoff1, candoff2);
    2287           0 :                                 break;
    2288             : #ifdef HAVE_HGE
    2289           0 :                         case TYPE_hge:
    2290           0 :                                 nils = sub_sht_bte_hge(lft, incr1, rgt, incr2,
    2291             :                                                        dst, GDK_hge_max,
    2292             :                                                        ci1, ci2, candoff1, candoff2);
    2293           0 :                                 break;
    2294             : #endif
    2295           0 :                         case TYPE_flt:
    2296           0 :                                 nils = sub_sht_bte_flt(lft, incr1, rgt, incr2,
    2297             :                                                        dst, GDK_flt_max,
    2298             :                                                        ci1, ci2, candoff1, candoff2);
    2299           0 :                                 break;
    2300           0 :                         case TYPE_dbl:
    2301           0 :                                 nils = sub_sht_bte_dbl(lft, incr1, rgt, incr2,
    2302             :                                                        dst, GDK_dbl_max,
    2303             :                                                        ci1, ci2, candoff1, candoff2);
    2304           0 :                                 break;
    2305           0 :                         default:
    2306           0 :                                 goto unsupported;
    2307             :                         }
    2308             :                         break;
    2309         112 :                 case TYPE_sht:
    2310         112 :                         switch (tp) {
    2311         105 :                         case TYPE_sht:
    2312         105 :                                 nils = sub_sht_sht_sht(lft, incr1, rgt, incr2,
    2313             :                                                        dst, GDK_sht_max,
    2314             :                                                        ci1, ci2, candoff1, candoff2);
    2315         105 :                                 break;
    2316           7 :                         case TYPE_int:
    2317           7 :                                 nils = sub_sht_sht_int(lft, incr1, rgt, incr2,
    2318             :                                                        dst, GDK_int_max,
    2319             :                                                        ci1, ci2, candoff1, candoff2);
    2320           7 :                                 break;
    2321           0 :                         case TYPE_lng:
    2322           0 :                                 nils = sub_sht_sht_lng(lft, incr1, rgt, incr2,
    2323             :                                                        dst, GDK_lng_max,
    2324             :                                                        ci1, ci2, candoff1, candoff2);
    2325           0 :                                 break;
    2326             : #ifdef HAVE_HGE
    2327           0 :                         case TYPE_hge:
    2328           0 :                                 nils = sub_sht_sht_hge(lft, incr1, rgt, incr2,
    2329             :                                                        dst, GDK_hge_max,
    2330             :                                                        ci1, ci2, candoff1, candoff2);
    2331           0 :                                 break;
    2332             : #endif
    2333           0 :                         case TYPE_flt:
    2334           0 :                                 nils = sub_sht_sht_flt(lft, incr1, rgt, incr2,
    2335             :                                                        dst, GDK_flt_max,
    2336             :                                                        ci1, ci2, candoff1, candoff2);
    2337           0 :                                 break;
    2338           0 :                         case TYPE_dbl:
    2339           0 :                                 nils = sub_sht_sht_dbl(lft, incr1, rgt, incr2,
    2340             :                                                        dst, GDK_dbl_max,
    2341             :                                                        ci1, ci2, candoff1, candoff2);
    2342           0 :                                 break;
    2343           0 :                         default:
    2344           0 :                                 goto unsupported;
    2345             :                         }
    2346             :                         break;
    2347           0 :                 case TYPE_int:
    2348           0 :                         switch (tp) {
    2349           0 :                         case TYPE_int:
    2350           0 :                                 nils = sub_sht_int_int(lft, incr1, rgt, incr2,
    2351             :                                                        dst, GDK_int_max,
    2352             :                                                        ci1, ci2, candoff1, candoff2);
    2353           0 :                                 break;
    2354           0 :                         case TYPE_lng:
    2355           0 :                                 nils = sub_sht_int_lng(lft, incr1, rgt, incr2,
    2356             :                                                        dst, GDK_lng_max,
    2357             :                                                        ci1, ci2, candoff1, candoff2);
    2358           0 :                                 break;
    2359             : #ifdef HAVE_HGE
    2360           0 :                         case TYPE_hge:
    2361           0 :                                 nils = sub_sht_int_hge(lft, incr1, rgt, incr2,
    2362             :                                                        dst, GDK_hge_max,
    2363             :                                                        ci1, ci2, candoff1, candoff2);
    2364           0 :                                 break;
    2365             : #endif
    2366           0 :                         case TYPE_flt:
    2367           0 :                                 nils = sub_sht_int_flt(lft, incr1, rgt, incr2,
    2368             :                                                        dst, GDK_flt_max,
    2369             :                                                        ci1, ci2, candoff1, candoff2);
    2370           0 :                                 break;
    2371           0 :                         case TYPE_dbl:
    2372           0 :                                 nils = sub_sht_int_dbl(lft, incr1, rgt, incr2,
    2373             :                                                        dst, GDK_dbl_max,
    2374             :                                                        ci1, ci2, candoff1, candoff2);
    2375           0 :                                 break;
    2376           0 :                         default:
    2377           0 :                                 goto unsupported;
    2378             :                         }
    2379             :                         break;
    2380          79 :                 case TYPE_lng:
    2381          79 :                         switch (tp) {
    2382          79 :                         case TYPE_lng:
    2383          79 :                                 nils = sub_sht_lng_lng(lft, incr1, rgt, incr2,
    2384             :                                                        dst, GDK_lng_max,
    2385             :                                                        ci1, ci2, candoff1, candoff2);
    2386          79 :                                 break;
    2387             : #ifdef HAVE_HGE
    2388           0 :                         case TYPE_hge:
    2389           0 :                                 nils = sub_sht_lng_hge(lft, incr1, rgt, incr2,
    2390             :                                                        dst, GDK_hge_max,
    2391             :                                                        ci1, ci2, candoff1, candoff2);
    2392           0 :                                 break;
    2393             : #endif
    2394           0 :                         case TYPE_flt:
    2395           0 :                                 nils = sub_sht_lng_flt(lft, incr1, rgt, incr2,
    2396             :                                                        dst, GDK_flt_max,
    2397             :                                                        ci1, ci2, candoff1, candoff2);
    2398           0 :                                 break;
    2399           0 :                         case TYPE_dbl:
    2400           0 :                                 nils = sub_sht_lng_dbl(lft, incr1, rgt, incr2,
    2401             :                                                        dst, GDK_dbl_max,
    2402             :                                                        ci1, ci2, candoff1, candoff2);
    2403           0 :                                 break;
    2404           0 :                         default:
    2405           0 :                                 goto unsupported;
    2406             :                         }
    2407             :                         break;
    2408             : #ifdef HAVE_HGE
    2409           0 :                 case TYPE_hge:
    2410           0 :                         switch (tp) {
    2411           0 :                         case TYPE_hge:
    2412           0 :                                 nils = sub_sht_hge_hge(lft, incr1, rgt, incr2,
    2413             :                                                        dst, GDK_hge_max,
    2414             :                                                        ci1, ci2, candoff1, candoff2);
    2415           0 :                                 break;
    2416           0 :                         case TYPE_flt:
    2417           0 :                                 nils = sub_sht_hge_flt(lft, incr1, rgt, incr2,
    2418             :                                                        dst, GDK_flt_max,
    2419             :                                                        ci1, ci2, candoff1, candoff2);
    2420           0 :                                 break;
    2421           0 :                         case TYPE_dbl:
    2422           0 :                                 nils = sub_sht_hge_dbl(lft, incr1, rgt, incr2,
    2423             :                                                        dst, GDK_dbl_max,
    2424             :                                                        ci1, ci2, candoff1, candoff2);
    2425           0 :                                 break;
    2426           0 :                         default:
    2427           0 :                                 goto unsupported;
    2428             :                         }
    2429             :                         break;
    2430             : #endif
    2431           0 :                 case TYPE_flt:
    2432           0 :                         switch (tp) {
    2433           0 :                         case TYPE_flt:
    2434           0 :                                 nils = sub_sht_flt_flt(lft, incr1, rgt, incr2,
    2435             :                                                        dst, GDK_flt_max,
    2436             :                                                        ci1, ci2, candoff1, candoff2);
    2437           0 :                                 break;
    2438           0 :                         case TYPE_dbl:
    2439           0 :                                 nils = sub_sht_flt_dbl(lft, incr1, rgt, incr2,
    2440             :                                                        dst, GDK_dbl_max,
    2441             :                                                        ci1, ci2, candoff1, candoff2);
    2442           0 :                                 break;
    2443           0 :                         default:
    2444           0 :                                 goto unsupported;
    2445             :                         }
    2446             :                         break;
    2447           0 :                 case TYPE_dbl:
    2448           0 :                         switch (tp) {
    2449           0 :                         case TYPE_dbl:
    2450           0 :                                 nils = sub_sht_dbl_dbl(lft, incr1, rgt, incr2,
    2451             :                                                        dst, GDK_dbl_max,
    2452             :                                                        ci1, ci2, candoff1, candoff2);
    2453           0 :                                 break;
    2454           0 :                         default:
    2455           0 :                                 goto unsupported;
    2456             :                         }
    2457           0 :                         break;
    2458           0 :                 default:
    2459           0 :                         goto unsupported;
    2460             :                 }
    2461             :                 break;
    2462       57222 :         case TYPE_int:
    2463       57222 :                 switch (tp2) {
    2464           0 :                 case TYPE_bte:
    2465           0 :                         switch (tp) {
    2466           0 :                         case TYPE_int:
    2467           0 :                                 nils = sub_int_bte_int(lft, incr1, rgt, incr2,
    2468             :                                                        dst, GDK_int_max,
    2469             :                                                        ci1, ci2, candoff1, candoff2);
    2470           0 :                                 break;
    2471           0 :                         case TYPE_lng:
    2472           0 :                                 nils = sub_int_bte_lng(lft, incr1, rgt, incr2,
    2473             :                                                        dst, GDK_lng_max,
    2474             :                                                        ci1, ci2, candoff1, candoff2);
    2475           0 :                                 break;
    2476             : #ifdef HAVE_HGE
    2477           0 :                         case TYPE_hge:
    2478           0 :                                 nils = sub_int_bte_hge(lft, incr1, rgt, incr2,
    2479             :                                                        dst, GDK_hge_max,
    2480             :                                                        ci1, ci2, candoff1, candoff2);
    2481           0 :                                 break;
    2482             : #endif
    2483           0 :                         case TYPE_flt:
    2484           0 :                                 nils = sub_int_bte_flt(lft, incr1, rgt, incr2,
    2485             :                                                        dst, GDK_flt_max,
    2486             :                                                        ci1, ci2, candoff1, candoff2);
    2487           0 :                                 break;
    2488           0 :                         case TYPE_dbl:
    2489           0 :                                 nils = sub_int_bte_dbl(lft, incr1, rgt, incr2,
    2490             :                                                        dst, GDK_dbl_max,
    2491             :                                                        ci1, ci2, candoff1, candoff2);
    2492           0 :                                 break;
    2493           0 :                         default:
    2494           0 :                                 goto unsupported;
    2495             :                         }
    2496             :                         break;
    2497           0 :                 case TYPE_sht:
    2498           0 :                         switch (tp) {
    2499           0 :                         case TYPE_int:
    2500           0 :                                 nils = sub_int_sht_int(lft, incr1, rgt, incr2,
    2501             :                                                        dst, GDK_int_max,
    2502             :                                                        ci1, ci2, candoff1, candoff2);
    2503           0 :                                 break;
    2504           0 :                         case TYPE_lng:
    2505           0 :                                 nils = sub_int_sht_lng(lft, incr1, rgt, incr2,
    2506             :                                                        dst, GDK_lng_max,
    2507             :                                                        ci1, ci2, candoff1, candoff2);
    2508           0 :                                 break;
    2509             : #ifdef HAVE_HGE
    2510           0 :                         case TYPE_hge:
    2511           0 :                                 nils = sub_int_sht_hge(lft, incr1, rgt, incr2,
    2512             :                                                        dst, GDK_hge_max,
    2513             :                                                        ci1, ci2, candoff1, candoff2);
    2514           0 :                                 break;
    2515             : #endif
    2516           0 :                         case TYPE_flt:
    2517           0 :                                 nils = sub_int_sht_flt(lft, incr1, rgt, incr2,
    2518             :                                                        dst, GDK_flt_max,
    2519             :                                                        ci1, ci2, candoff1, candoff2);
    2520           0 :                                 break;
    2521           0 :                         case TYPE_dbl:
    2522           0 :                                 nils = sub_int_sht_dbl(lft, incr1, rgt, incr2,
    2523             :                                                        dst, GDK_dbl_max,
    2524             :                                                        ci1, ci2, candoff1, candoff2);
    2525           0 :                                 break;
    2526           0 :                         default:
    2527           0 :                                 goto unsupported;
    2528             :                         }
    2529             :                         break;
    2530       57222 :                 case TYPE_int:
    2531       57222 :                         switch (tp) {
    2532       36397 :                         case TYPE_int:
    2533       36397 :                                 nils = sub_int_int_int(lft, incr1, rgt, incr2,
    2534             :                                                        dst, GDK_int_max,
    2535             :                                                        ci1, ci2, candoff1, candoff2);
    2536       36397 :                                 break;
    2537       20825 :                         case TYPE_lng:
    2538       20825 :                                 nils = sub_int_int_lng(lft, incr1, rgt, incr2,
    2539             :                                                        dst, GDK_lng_max,
    2540             :                                                        ci1, ci2, candoff1, candoff2);
    2541       20825 :                                 break;
    2542             : #ifdef HAVE_HGE
    2543           0 :                         case TYPE_hge:
    2544           0 :                                 nils = sub_int_int_hge(lft, incr1, rgt, incr2,
    2545             :                                                        dst, GDK_hge_max,
    2546             :                                                        ci1, ci2, candoff1, candoff2);
    2547           0 :                                 break;
    2548             : #endif
    2549           0 :                         case TYPE_flt:
    2550           0 :                                 nils = sub_int_int_flt(lft, incr1, rgt, incr2,
    2551             :                                                        dst, GDK_flt_max,
    2552             :                                                        ci1, ci2, candoff1, candoff2);
    2553           0 :                                 break;
    2554           0 :                         case TYPE_dbl:
    2555           0 :                                 nils = sub_int_int_dbl(lft, incr1, rgt, incr2,
    2556             :                                                        dst, GDK_dbl_max,
    2557             :                                                        ci1, ci2, candoff1, candoff2);
    2558           0 :                                 break;
    2559           0 :                         default:
    2560           0 :                                 goto unsupported;
    2561             :                         }
    2562             :                         break;
    2563           0 :                 case TYPE_lng:
    2564           0 :                         switch (tp) {
    2565           0 :                         case TYPE_lng:
    2566           0 :                                 nils = sub_int_lng_lng(lft, incr1, rgt, incr2,
    2567             :                                                        dst, GDK_lng_max,
    2568             :                                                        ci1, ci2, candoff1, candoff2);
    2569           0 :                                 break;
    2570             : #ifdef HAVE_HGE
    2571           0 :                         case TYPE_hge:
    2572           0 :                                 nils = sub_int_lng_hge(lft, incr1, rgt, incr2,
    2573             :                                                        dst, GDK_hge_max,
    2574             :                                                        ci1, ci2, candoff1, candoff2);
    2575           0 :                                 break;
    2576             : #endif
    2577           0 :                         case TYPE_flt:
    2578           0 :                                 nils = sub_int_lng_flt(lft, incr1, rgt, incr2,
    2579             :                                                        dst, GDK_flt_max,
    2580             :                                                        ci1, ci2, candoff1, candoff2);
    2581           0 :                                 break;
    2582           0 :                         case TYPE_dbl:
    2583           0 :                                 nils = sub_int_lng_dbl(lft, incr1, rgt, incr2,
    2584             :                                                        dst, GDK_dbl_max,
    2585             :                                                        ci1, ci2, candoff1, candoff2);
    2586           0 :                                 break;
    2587           0 :                         default:
    2588           0 :                                 goto unsupported;
    2589             :                         }
    2590             :                         break;
    2591             : #ifdef HAVE_HGE
    2592           0 :                 case TYPE_hge:
    2593           0 :                         switch (tp) {
    2594           0 :                         case TYPE_hge:
    2595           0 :                                 nils = sub_int_hge_hge(lft, incr1, rgt, incr2,
    2596             :                                                        dst, GDK_hge_max,
    2597             :                                                        ci1, ci2, candoff1, candoff2);
    2598           0 :                                 break;
    2599           0 :                         case TYPE_flt:
    2600           0 :                                 nils = sub_int_hge_flt(lft, incr1, rgt, incr2,
    2601             :                                                        dst, GDK_flt_max,
    2602             :                                                        ci1, ci2, candoff1, candoff2);
    2603           0 :                                 break;
    2604           0 :                         case TYPE_dbl:
    2605           0 :                                 nils = sub_int_hge_dbl(lft, incr1, rgt, incr2,
    2606             :                                                        dst, GDK_dbl_max,
    2607             :                                                        ci1, ci2, candoff1, candoff2);
    2608           0 :                                 break;
    2609           0 :                         default:
    2610           0 :                                 goto unsupported;
    2611             :                         }
    2612             :                         break;
    2613             : #endif
    2614           0 :                 case TYPE_flt:
    2615           0 :                         switch (tp) {
    2616           0 :                         case TYPE_flt:
    2617           0 :                                 nils = sub_int_flt_flt(lft, incr1, rgt, incr2,
    2618             :                                                        dst, GDK_flt_max,
    2619             :                                                        ci1, ci2, candoff1, candoff2);
    2620           0 :                                 break;
    2621           0 :                         case TYPE_dbl:
    2622           0 :                                 nils = sub_int_flt_dbl(lft, incr1, rgt, incr2,
    2623             :                                                        dst, GDK_dbl_max,
    2624             :                                                        ci1, ci2, candoff1, candoff2);
    2625           0 :                                 break;
    2626           0 :                         default:
    2627           0 :                                 goto unsupported;
    2628             :                         }
    2629             :                         break;
    2630           0 :                 case TYPE_dbl:
    2631           0 :                         switch (tp) {
    2632           0 :                         case TYPE_dbl:
    2633           0 :                                 nils = sub_int_dbl_dbl(lft, incr1, rgt, incr2,
    2634             :                                                        dst, GDK_dbl_max,
    2635             :                                                        ci1, ci2, candoff1, candoff2);
    2636           0 :                                 break;
    2637           0 :                         default:
    2638           0 :                                 goto unsupported;
    2639             :                         }
    2640           0 :                         break;
    2641           0 :                 default:
    2642           0 :                         goto unsupported;
    2643             :                 }
    2644             :                 break;
    2645       23303 :         case TYPE_lng:
    2646       23303 :                 switch (tp2) {
    2647           0 :                 case TYPE_bte:
    2648           0 :                         switch (tp) {
    2649           0 :                         case TYPE_lng:
    2650           0 :                                 nils = sub_lng_bte_lng(lft, incr1, rgt, incr2,
    2651             :                                                        dst, GDK_lng_max,
    2652             :                                                        ci1, ci2, candoff1, candoff2);
    2653           0 :                                 break;
    2654             : #ifdef HAVE_HGE
    2655           0 :                         case TYPE_hge:
    2656           0 :                                 nils = sub_lng_bte_hge(lft, incr1, rgt, incr2,
    2657             :                                                        dst, GDK_hge_max,
    2658             :                                                        ci1, ci2, candoff1, candoff2);
    2659           0 :                                 break;
    2660             : #endif
    2661           0 :                         case TYPE_flt:
    2662           0 :                                 nils = sub_lng_bte_flt(lft, incr1, rgt, incr2,
    2663             :                                                        dst, GDK_flt_max,
    2664             :                                                        ci1, ci2, candoff1, candoff2);
    2665           0 :                                 break;
    2666           0 :                         case TYPE_dbl:
    2667           0 :                                 nils = sub_lng_bte_dbl(lft, incr1, rgt, incr2,
    2668             :                                                        dst, GDK_dbl_max,
    2669             :                                                        ci1, ci2, candoff1, candoff2);
    2670           0 :                                 break;
    2671           0 :                         default:
    2672           0 :                                 goto unsupported;
    2673             :                         }
    2674             :                         break;
    2675           0 :                 case TYPE_sht:
    2676           0 :                         switch (tp) {
    2677           0 :                         case TYPE_lng:
    2678           0 :                                 nils = sub_lng_sht_lng(lft, incr1, rgt, incr2,
    2679             :                                                        dst, GDK_lng_max,
    2680             :                                                        ci1, ci2, candoff1, candoff2);
    2681           0 :                                 break;
    2682             : #ifdef HAVE_HGE
    2683           0 :                         case TYPE_hge:
    2684           0 :                                 nils = sub_lng_sht_hge(lft, incr1, rgt, incr2,
    2685             :                                                        dst, GDK_hge_max,
    2686             :                                                        ci1, ci2, candoff1, candoff2);
    2687           0 :                                 break;
    2688             : #endif
    2689           0 :                         case TYPE_flt:
    2690           0 :                                 nils = sub_lng_sht_flt(lft, incr1, rgt, incr2,
    2691             :                                                        dst, GDK_flt_max,
    2692             :                                                        ci1, ci2, candoff1, candoff2);
    2693           0 :                                 break;
    2694           0 :                         case TYPE_dbl:
    2695           0 :                                 nils = sub_lng_sht_dbl(lft, incr1, rgt, incr2,
    2696             :                                                        dst, GDK_dbl_max,
    2697             :                                                        ci1, ci2, candoff1, candoff2);
    2698           0 :                                 break;
    2699           0 :                         default:
    2700           0 :                                 goto unsupported;
    2701             :                         }
    2702             :                         break;
    2703       16805 :                 case TYPE_int:
    2704       16805 :                         switch (tp) {
    2705       16805 :                         case TYPE_lng:
    2706       16805 :                                 nils = sub_lng_int_lng(lft, incr1, rgt, incr2,
    2707             :                                                        dst, GDK_lng_max,
    2708             :                                                        ci1, ci2, candoff1, candoff2);
    2709       16805 :                                 break;
    2710             : #ifdef HAVE_HGE
    2711           0 :                         case TYPE_hge:
    2712           0 :                                 nils = sub_lng_int_hge(lft, incr1, rgt, incr2,
    2713             :                                                        dst, GDK_hge_max,
    2714             :                                                        ci1, ci2, candoff1, candoff2);
    2715           0 :                                 break;
    2716             : #endif
    2717           0 :                         case TYPE_flt:
    2718           0 :                                 nils = sub_lng_int_flt(lft, incr1, rgt, incr2,
    2719             :                                                        dst, GDK_flt_max,
    2720             :                                                        ci1, ci2, candoff1, candoff2);
    2721           0 :                                 break;
    2722           0 :                         case TYPE_dbl:
    2723           0 :                                 nils = sub_lng_int_dbl(lft, incr1, rgt, incr2,
    2724             :                                                        dst, GDK_dbl_max,
    2725             :                                                        ci1, ci2, candoff1, candoff2);
    2726           0 :                                 break;
    2727           0 :                         default:
    2728           0 :                                 goto unsupported;
    2729             :                         }
    2730             :                         break;
    2731        6498 :                 case TYPE_lng:
    2732        6498 :                         switch (tp) {
    2733        6204 :                         case TYPE_lng:
    2734        6204 :                                 nils = sub_lng_lng_lng(lft, incr1, rgt, incr2,
    2735             :                                                        dst, GDK_lng_max,
    2736             :                                                        ci1, ci2, candoff1, candoff2);
    2737        6204 :                                 break;
    2738             : #ifdef HAVE_HGE
    2739         294 :                         case TYPE_hge:
    2740         294 :                                 nils = sub_lng_lng_hge(lft, incr1, rgt, incr2,
    2741             :                                                        dst, GDK_hge_max,
    2742             :                                                        ci1, ci2, candoff1, candoff2);
    2743         294 :                                 break;
    2744             : #endif
    2745           0 :                         case TYPE_flt:
    2746           0 :                                 nils = sub_lng_lng_flt(lft, incr1, rgt, incr2,
    2747             :                                                        dst, GDK_flt_max,
    2748             :                                                        ci1, ci2, candoff1, candoff2);
    2749           0 :                                 break;
    2750           0 :                         case TYPE_dbl:
    2751           0 :                                 nils = sub_lng_lng_dbl(lft, incr1, rgt, incr2,
    2752             :                                                        dst, GDK_dbl_max,
    2753             :                                                        ci1, ci2, candoff1, candoff2);
    2754           0 :                                 break;
    2755           0 :                         default:
    2756           0 :                                 goto unsupported;
    2757             :                         }
    2758             :                         break;
    2759             : #ifdef HAVE_HGE
    2760           0 :                 case TYPE_hge:
    2761           0 :                         switch (tp) {
    2762           0 :                         case TYPE_hge:
    2763           0 :                                 nils = sub_lng_hge_hge(lft, incr1, rgt, incr2,
    2764             :                                                        dst, GDK_hge_max,
    2765             :                                                        ci1, ci2, candoff1, candoff2);
    2766           0 :                                 break;
    2767           0 :                         case TYPE_flt:
    2768           0 :                                 nils = sub_lng_hge_flt(lft, incr1, rgt, incr2,
    2769             :                                                        dst, GDK_flt_max,
    2770             :                                                        ci1, ci2, candoff1, candoff2);
    2771           0 :                                 break;
    2772           0 :                         case TYPE_dbl:
    2773           0 :                                 nils = sub_lng_hge_dbl(lft, incr1, rgt, incr2,
    2774             :                                                        dst, GDK_dbl_max,
    2775             :                                                        ci1, ci2, candoff1, candoff2);
    2776           0 :                                 break;
    2777           0 :                         default:
    2778           0 :                                 goto unsupported;
    2779             :                         }
    2780             :                         break;
    2781             : #endif
    2782           0 :                 case TYPE_flt:
    2783           0 :                         switch (tp) {
    2784           0 :                         case TYPE_flt:
    2785           0 :                                 nils = sub_lng_flt_flt(lft, incr1, rgt, incr2,
    2786             :                                                        dst, GDK_flt_max,
    2787             :                                                        ci1, ci2, candoff1, candoff2);
    2788           0 :                                 break;
    2789           0 :                         case TYPE_dbl:
    2790           0 :                                 nils = sub_lng_flt_dbl(lft, incr1, rgt, incr2,
    2791             :                                                        dst, GDK_dbl_max,
    2792             :                                                        ci1, ci2, candoff1, candoff2);
    2793           0 :                                 break;
    2794           0 :                         default:
    2795           0 :                                 goto unsupported;
    2796             :                         }
    2797             :                         break;
    2798           0 :                 case TYPE_dbl:
    2799           0 :                         switch (tp) {
    2800           0 :                         case TYPE_dbl:
    2801           0 :                                 nils = sub_lng_dbl_dbl(lft, incr1, rgt, incr2,
    2802             :                                                        dst, GDK_dbl_max,
    2803             :                                                        ci1, ci2, candoff1, candoff2);
    2804           0 :                                 break;
    2805           0 :                         default:
    2806           0 :                                 goto unsupported;
    2807             :                         }
    2808           0 :                         break;
    2809           0 :                 default:
    2810           0 :                         goto unsupported;
    2811             :                 }
    2812             :                 break;
    2813             : #ifdef HAVE_HGE
    2814          83 :         case TYPE_hge:
    2815          83 :                 switch (tp2) {
    2816           0 :                 case TYPE_bte:
    2817           0 :                         switch (tp) {
    2818           0 :                         case TYPE_hge:
    2819           0 :                                 nils = sub_hge_bte_hge(lft, incr1, rgt, incr2,
    2820             :                                                        dst, GDK_hge_max,
    2821             :                                                        ci1, ci2, candoff1, candoff2);
    2822           0 :                                 break;
    2823           0 :                         case TYPE_flt:
    2824           0 :                                 nils = sub_hge_bte_flt(lft, incr1, rgt, incr2,
    2825             :                                                        dst, GDK_flt_max,
    2826             :                                                        ci1, ci2, candoff1, candoff2);
    2827           0 :                                 break;
    2828           0 :                         case TYPE_dbl:
    2829           0 :                                 nils = sub_hge_bte_dbl(lft, incr1, rgt, incr2,
    2830             :                                                        dst, GDK_dbl_max,
    2831             :                                                        ci1, ci2, candoff1, candoff2);
    2832           0 :                                 break;
    2833           0 :                         default:
    2834           0 :                                 goto unsupported;
    2835             :                         }
    2836             :                         break;
    2837           0 :                 case TYPE_sht:
    2838           0 :                         switch (tp) {
    2839           0 :                         case TYPE_hge:
    2840           0 :                                 nils = sub_hge_sht_hge(lft, incr1, rgt, incr2,
    2841             :                                                        dst, GDK_hge_max,
    2842             :                                                        ci1, ci2, candoff1, candoff2);
    2843           0 :                                 break;
    2844           0 :                         case TYPE_flt:
    2845           0 :                                 nils = sub_hge_sht_flt(lft, incr1, rgt, incr2,
    2846             :                                                        dst, GDK_flt_max,
    2847             :                                                        ci1, ci2, candoff1, candoff2);
    2848           0 :                                 break;
    2849           0 :                         case TYPE_dbl:
    2850           0 :                                 nils = sub_hge_sht_dbl(lft, incr1, rgt, incr2,
    2851             :                                                        dst, GDK_dbl_max,
    2852             :                                                        ci1, ci2, candoff1, candoff2);
    2853           0 :                                 break;
    2854           0 :                         default:
    2855           0 :                                 goto unsupported;
    2856             :                         }
    2857             :                         break;
    2858           0 :                 case TYPE_int:
    2859           0 :                         switch (tp) {
    2860           0 :                         case TYPE_hge:
    2861           0 :                                 nils = sub_hge_int_hge(lft, incr1, rgt, incr2,
    2862             :                                                        dst, GDK_hge_max,
    2863             :                                                        ci1, ci2, candoff1, candoff2);
    2864           0 :                                 break;
    2865           0 :                         case TYPE_flt:
    2866           0 :                                 nils = sub_hge_int_flt(lft, incr1, rgt, incr2,
    2867             :                                                        dst, GDK_flt_max,
    2868             :                                                        ci1, ci2, candoff1, candoff2);
    2869           0 :                                 break;
    2870           0 :                         case TYPE_dbl:
    2871           0 :                                 nils = sub_hge_int_dbl(lft, incr1, rgt, incr2,
    2872             :                                                        dst, GDK_dbl_max,
    2873             :                                                        ci1, ci2, candoff1, candoff2);
    2874           0 :                                 break;
    2875           0 :                         default:
    2876           0 :                                 goto unsupported;
    2877             :                         }
    2878             :                         break;
    2879           3 :                 case TYPE_lng:
    2880           3 :                         switch (tp) {
    2881           3 :                         case TYPE_hge:
    2882           3 :                                 nils = sub_hge_lng_hge(lft, incr1, rgt, incr2,
    2883             :                                                        dst, GDK_hge_max,
    2884             :                                                        ci1, ci2, candoff1, candoff2);
    2885           3 :                                 break;
    2886           0 :                         case TYPE_flt:
    2887           0 :                                 nils = sub_hge_lng_flt(lft, incr1, rgt, incr2,
    2888             :                                                        dst, GDK_flt_max,
    2889             :                                                        ci1, ci2, candoff1, candoff2);
    2890           0 :                                 break;
    2891           0 :                         case TYPE_dbl:
    2892           0 :                                 nils = sub_hge_lng_dbl(lft, incr1, rgt, incr2,
    2893             :                                                        dst, GDK_dbl_max,
    2894             :                                                        ci1, ci2, candoff1, candoff2);
    2895           0 :                                 break;
    2896           0 :                         default:
    2897           0 :                                 goto unsupported;
    2898             :                         }
    2899             :                         break;
    2900          80 :                 case TYPE_hge:
    2901          80 :                         switch (tp) {
    2902          80 :                         case TYPE_hge:
    2903          80 :                                 nils = sub_hge_hge_hge(lft, incr1, rgt, incr2,
    2904             :                                                        dst, GDK_hge_max,
    2905             :                                                        ci1, ci2, candoff1, candoff2);
    2906          80 :                                 break;
    2907           0 :                         case TYPE_flt:
    2908           0 :                                 nils = sub_hge_hge_flt(lft, incr1, rgt, incr2,
    2909             :                                                        dst, GDK_flt_max,
    2910             :                                                        ci1, ci2, candoff1, candoff2);
    2911           0 :                                 break;
    2912           0 :                         case TYPE_dbl:
    2913           0 :                                 nils = sub_hge_hge_dbl(lft, incr1, rgt, incr2,
    2914             :                                                        dst, GDK_dbl_max,
    2915             :                                                        ci1, ci2, candoff1, candoff2);
    2916           0 :                                 break;
    2917           0 :                         default:
    2918           0 :                                 goto unsupported;
    2919             :                         }
    2920             :                         break;
    2921           0 :                 case TYPE_flt:
    2922           0 :                         switch (tp) {
    2923           0 :                         case TYPE_flt:
    2924           0 :                                 nils = sub_hge_flt_flt(lft, incr1, rgt, incr2,
    2925             :                                                        dst, GDK_flt_max,
    2926             :                                                        ci1, ci2, candoff1, candoff2);
    2927           0 :                                 break;
    2928           0 :                         case TYPE_dbl:
    2929           0 :                                 nils = sub_hge_flt_dbl(lft, incr1, rgt, incr2,
    2930             :                                                        dst, GDK_dbl_max,
    2931             :                                                        ci1, ci2, candoff1, candoff2);
    2932           0 :                                 break;
    2933           0 :                         default:
    2934           0 :                                 goto unsupported;
    2935             :                         }
    2936             :                         break;
    2937           0 :                 case TYPE_dbl:
    2938           0 :                         switch (tp) {
    2939           0 :                         case TYPE_dbl:
    2940           0 :                                 nils = sub_hge_dbl_dbl(lft, incr1, rgt, incr2,
    2941             :                                                        dst, GDK_dbl_max,
    2942             :                                                        ci1, ci2, candoff1, candoff2);
    2943           0 :                                 break;
    2944           0 :                         default:
    2945           0 :                                 goto unsupported;
    2946             :                         }
    2947           0 :                         break;
    2948           0 :                 default:
    2949           0 :                         goto unsupported;
    2950             :                 }
    2951             :                 break;
    2952             : #endif
    2953          17 :         case TYPE_flt:
    2954          17 :                 switch (tp2) {
    2955           0 :                 case TYPE_bte:
    2956           0 :                         switch (tp) {
    2957           0 :                         case TYPE_flt:
    2958           0 :                                 nils = sub_flt_bte_flt(lft, incr1, rgt, incr2,
    2959             :                                                        dst, GDK_flt_max,
    2960             :                                                        ci1, ci2, candoff1, candoff2);
    2961           0 :                                 break;
    2962           0 :                         case TYPE_dbl:
    2963           0 :                                 nils = sub_flt_bte_dbl(lft, incr1, rgt, incr2,
    2964             :                                                        dst, GDK_dbl_max,
    2965             :                                                        ci1, ci2, candoff1, candoff2);
    2966           0 :                                 break;
    2967           0 :                         default:
    2968           0 :                                 goto unsupported;
    2969             :                         }
    2970             :                         break;
    2971           0 :                 case TYPE_sht:
    2972           0 :                         switch (tp) {
    2973           0 :                         case TYPE_flt:
    2974           0 :                                 nils = sub_flt_sht_flt(lft, incr1, rgt, incr2,
    2975             :                                                        dst, GDK_flt_max,
    2976             :                                                        ci1, ci2, candoff1, candoff2);
    2977           0 :                                 break;
    2978           0 :                         case TYPE_dbl:
    2979           0 :                                 nils = sub_flt_sht_dbl(lft, incr1, rgt, incr2,
    2980             :                                                        dst, GDK_dbl_max,
    2981             :                                                        ci1, ci2, candoff1, candoff2);
    2982           0 :                                 break;
    2983           0 :                         default:
    2984           0 :                                 goto unsupported;
    2985             :                         }
    2986             :                         break;
    2987           0 :                 case TYPE_int:
    2988           0 :                         switch (tp) {
    2989           0 :                         case TYPE_flt:
    2990           0 :                                 nils = sub_flt_int_flt(lft, incr1, rgt, incr2,
    2991             :                                                        dst, GDK_flt_max,
    2992             :                                                        ci1, ci2, candoff1, candoff2);
    2993           0 :                                 break;
    2994           0 :                         case TYPE_dbl:
    2995           0 :                                 nils = sub_flt_int_dbl(lft, incr1, rgt, incr2,
    2996             :                                                        dst, GDK_dbl_max,
    2997             :                                                        ci1, ci2, candoff1, candoff2);
    2998           0 :                                 break;
    2999           0 :                         default:
    3000           0 :                                 goto unsupported;
    3001             :                         }
    3002             :                         break;
    3003           0 :                 case TYPE_lng:
    3004           0 :                         switch (tp) {
    3005           0 :                         case TYPE_flt:
    3006           0 :                                 nils = sub_flt_lng_flt(lft, incr1, rgt, incr2,
    3007             :                                                        dst, GDK_flt_max,
    3008             :                                                        ci1, ci2, candoff1, candoff2);
    3009           0 :                                 break;
    3010           0 :                         case TYPE_dbl:
    3011           0 :                                 nils = sub_flt_lng_dbl(lft, incr1, rgt, incr2,
    3012             :                                                        dst, GDK_dbl_max,
    3013             :                                                        ci1, ci2, candoff1, candoff2);
    3014           0 :                                 break;
    3015           0 :                         default:
    3016           0 :                                 goto unsupported;
    3017             :                         }
    3018             :                         break;
    3019             : #ifdef HAVE_HGE
    3020           0 :                 case TYPE_hge:
    3021           0 :                         switch (tp) {
    3022           0 :                         case TYPE_flt:
    3023           0 :                                 nils = sub_flt_hge_flt(lft, incr1, rgt, incr2,
    3024             :                                                        dst, GDK_flt_max,
    3025             :                                                        ci1, ci2, candoff1, candoff2);
    3026           0 :                                 break;
    3027           0 :                         case TYPE_dbl:
    3028           0 :                                 nils = sub_flt_hge_dbl(lft, incr1, rgt, incr2,
    3029             :                                                        dst, GDK_dbl_max,
    3030             :                                                        ci1, ci2, candoff1, candoff2);
    3031           0 :                                 break;
    3032           0 :                         default:
    3033           0 :                                 goto unsupported;
    3034             :                         }
    3035             :                         break;
    3036             : #endif
    3037          17 :                 case TYPE_flt:
    3038          17 :                         switch (tp) {
    3039          17 :                         case TYPE_flt:
    3040          17 :                                 nils = sub_flt_flt_flt(lft, incr1, rgt, incr2,
    3041             :                                                        dst, GDK_flt_max,
    3042             :                                                        ci1, ci2, candoff1, candoff2);
    3043          17 :                                 break;
    3044           0 :                         case TYPE_dbl:
    3045           0 :                                 nils = sub_flt_flt_dbl(lft, incr1, rgt, incr2,
    3046             :                                                        dst, GDK_dbl_max,
    3047             :                                                        ci1, ci2, candoff1, candoff2);
    3048           0 :                                 break;
    3049           0 :                         default:
    3050           0 :                                 goto unsupported;
    3051             :                         }
    3052             :                         break;
    3053           0 :                 case TYPE_dbl:
    3054           0 :                         switch (tp) {
    3055           0 :                         case TYPE_dbl:
    3056           0 :                                 nils = sub_flt_dbl_dbl(lft, incr1, rgt, incr2,
    3057             :                                                        dst, GDK_dbl_max,
    3058             :                                                        ci1, ci2, candoff1, candoff2);
    3059           0 :                                 break;
    3060           0 :                         default:
    3061           0 :                                 goto unsupported;
    3062             :                         }
    3063           0 :                         break;
    3064           0 :                 default:
    3065           0 :                         goto unsupported;
    3066             :                 }
    3067             :                 break;
    3068         213 :         case TYPE_dbl:
    3069         213 :                 switch (tp2) {
    3070           0 :                 case TYPE_bte:
    3071           0 :                         switch (tp) {
    3072           0 :                         case TYPE_dbl:
    3073           0 :                                 nils = sub_dbl_bte_dbl(lft, incr1, rgt, incr2,
    3074             :                                                        dst, GDK_dbl_max,
    3075             :                                                        ci1, ci2, candoff1, candoff2);
    3076           0 :                                 break;
    3077           0 :                         default:
    3078           0 :                                 goto unsupported;
    3079             :                         }
    3080           0 :                         break;
    3081           0 :                 case TYPE_sht:
    3082           0 :                         switch (tp) {
    3083           0 :                         case TYPE_dbl:
    3084           0 :                                 nils = sub_dbl_sht_dbl(lft, incr1, rgt, incr2,
    3085             :                                                        dst, GDK_dbl_max,
    3086             :                                                        ci1, ci2, candoff1, candoff2);
    3087           0 :                                 break;
    3088           0 :                         default:
    3089           0 :                                 goto unsupported;
    3090             :                         }
    3091           0 :                         break;
    3092           0 :                 case TYPE_int:
    3093           0 :                         switch (tp) {
    3094           0 :                         case TYPE_dbl:
    3095           0 :                                 nils = sub_dbl_int_dbl(lft, incr1, rgt, incr2,
    3096             :                                                        dst, GDK_dbl_max,
    3097             :                                                        ci1, ci2, candoff1, candoff2);
    3098           0 :                                 break;
    3099           0 :                         default:
    3100           0 :                                 goto unsupported;
    3101             :                         }
    3102           0 :                         break;
    3103           0 :                 case TYPE_lng:
    3104           0 :                         switch (tp) {
    3105           0 :                         case TYPE_dbl:
    3106           0 :                                 nils = sub_dbl_lng_dbl(lft, incr1, rgt, incr2,
    3107             :                                                        dst, GDK_dbl_max,
    3108             :                                                        ci1, ci2, candoff1, candoff2);
    3109           0 :                                 break;
    3110           0 :                         default:
    3111           0 :                                 goto unsupported;
    3112             :                         }
    3113           0 :                         break;
    3114             : #ifdef HAVE_HGE
    3115           0 :                 case TYPE_hge:
    3116           0 :                         switch (tp) {
    3117           0 :                         case TYPE_dbl:
    3118           0 :                                 nils = sub_dbl_hge_dbl(lft, incr1, rgt, incr2,
    3119             :                                                        dst, GDK_dbl_max,
    3120             :                                                        ci1, ci2, candoff1, candoff2);
    3121           0 :                                 break;
    3122           0 :                         default:
    3123           0 :                                 goto unsupported;
    3124             :                         }
    3125           0 :                         break;
    3126             : #endif
    3127           0 :                 case TYPE_flt:
    3128           0 :                         switch (tp) {
    3129           0 :                         case TYPE_dbl:
    3130           0 :                                 nils = sub_dbl_flt_dbl(lft, incr1, rgt, incr2,
    3131             :                                                        dst, GDK_dbl_max,
    3132             :                                                        ci1, ci2, candoff1, candoff2);
    3133           0 :                                 break;
    3134           0 :                         default:
    3135           0 :                                 goto unsupported;
    3136             :                         }
    3137           0 :                         break;
    3138         213 :                 case TYPE_dbl:
    3139         213 :                         switch (tp) {
    3140         213 :                         case TYPE_dbl:
    3141         213 :                                 nils = sub_dbl_dbl_dbl(lft, incr1, rgt, incr2,
    3142             :                                                        dst, GDK_dbl_max,
    3143             :                                                        ci1, ci2, candoff1, candoff2);
    3144         213 :                                 break;
    3145           0 :                         default:
    3146           0 :                                 goto unsupported;
    3147             :                         }
    3148         213 :                         break;
    3149           0 :                 default:
    3150           0 :                         goto unsupported;
    3151             :                 }
    3152             :                 break;
    3153           0 :         default:
    3154           0 :                 goto unsupported;
    3155             :         }
    3156             : 
    3157             :         return nils;
    3158             : 
    3159           0 :   unsupported:
    3160           0 :         GDKerror("%s: type combination (sub(%s,%s)->%s) not supported.\n",
    3161             :                  func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
    3162           0 :         return BUN_NONE;
    3163             : }
    3164             : 
    3165             : BAT *
    3166       20964 : BATcalcsub(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
    3167             : {
    3168       20964 :         lng t0 = 0;
    3169       20964 :         BAT *bn;
    3170       20964 :         BUN nils;
    3171       20964 :         struct canditer ci1, ci2;
    3172             : 
    3173       20964 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    3174             : 
    3175       20964 :         BATcheck(b1, NULL);
    3176       20964 :         BATcheck(b2, NULL);
    3177             : 
    3178       20964 :         canditer_init(&ci1, b1, s1);
    3179       20980 :         canditer_init(&ci2, b2, s2);
    3180       20982 :         if (ci1.ncand != ci2.ncand || ci1.hseq != ci2.hseq) {
    3181           0 :                 GDKerror("inputs not the same size.\n");
    3182           0 :                 return NULL;
    3183             :         }
    3184             : 
    3185       20982 :         bn = COLnew(ci1.hseq, tp, ci1.ncand, TRANSIENT);
    3186       20958 :         if (bn == NULL)
    3187             :                 return NULL;
    3188       20958 :         if (ci1.ncand == 0)
    3189             :                 return bn;
    3190             : 
    3191       15104 :         BATiter b1i = bat_iterator(b1);
    3192       15125 :         BATiter b2i = bat_iterator(b2);
    3193       30223 :         nils = sub_typeswitchloop(b1i.base, b1i.type, true,
    3194       15125 :                                   b2i.base, b2i.type, true,
    3195       15125 :                                   Tloc(bn, 0), tp,
    3196             :                                   &ci1, &ci2,
    3197             :                                   b1->hseqbase, b2->hseqbase, __func__);
    3198       15098 :         bat_iterator_end(&b1i);
    3199       15109 :         bat_iterator_end(&b2i);
    3200             : 
    3201       15105 :         if (nils == BUN_NONE) {
    3202           0 :                 BBPunfix(bn->batCacheid);
    3203           0 :                 return NULL;
    3204             :         }
    3205             : 
    3206       15105 :         BATsetcount(bn, ci1.ncand);
    3207             : 
    3208       15116 :         bn->tsorted = ci1.ncand <= 1 || nils == ci1.ncand;
    3209       15116 :         bn->trevsorted = ci1.ncand <= 1 || nils == ci1.ncand;
    3210       15116 :         bn->tkey = ci1.ncand <= 1;
    3211       15116 :         bn->tnil = nils != 0;
    3212       15116 :         bn->tnonil = nils == 0;
    3213             : 
    3214       15116 :         TRC_DEBUG(ALGO, "b1=" ALGOBATFMT ",b2=" ALGOBATFMT
    3215             :                   ",s1=" ALGOOPTBATFMT ",s2=" ALGOOPTBATFMT
    3216             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    3217             :                   ALGOBATPAR(b1), ALGOBATPAR(b2),
    3218             :                   ALGOOPTBATPAR(s1), ALGOOPTBATPAR(s2),
    3219             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    3220             : 
    3221             :         return bn;
    3222             : }
    3223             : 
    3224             : BAT *
    3225       27264 : BATcalcsubcst(BAT *b, const ValRecord *v, BAT *s, int tp)
    3226             : {
    3227       27264 :         lng t0 = 0;
    3228       27264 :         BAT *bn;
    3229       27264 :         BUN nils;
    3230       27264 :         struct canditer ci;
    3231             : 
    3232       27264 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    3233             : 
    3234       27264 :         BATcheck(b, NULL);
    3235             : 
    3236       27264 :         canditer_init(&ci, b, s);
    3237             : 
    3238       27283 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    3239       27279 :         if (bn == NULL)
    3240             :                 return NULL;
    3241       27279 :         if (ci.ncand == 0)
    3242             :                 return bn;
    3243             : 
    3244       22266 :         BATiter bi = bat_iterator(b);
    3245       44513 :         nils = sub_typeswitchloop(bi.base, bi.type, true,
    3246       22268 :                                   VALptr(v), v->vtype, false,
    3247       22268 :                                   Tloc(bn, 0), tp,
    3248             :                                   &ci,
    3249       22268 :                                   &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    3250             :                                   b->hseqbase, 0, __func__);
    3251             : 
    3252       22245 :         if (nils == BUN_NONE) {
    3253           0 :                 bat_iterator_end(&bi);
    3254           0 :                 BBPunfix(bn->batCacheid);
    3255           0 :                 return NULL;
    3256             :         }
    3257             : 
    3258       22245 :         BATsetcount(bn, ci.ncand);
    3259             : 
    3260             :         /* if the input is sorted, and no overflow occurred, the result
    3261             :          * is also sorted */
    3262        7901 :         bn->tsorted = (bi.sorted && nils == 0) ||
    3263       22587 :                 ci.ncand <= 1 || nils == ci.ncand;
    3264        2623 :         bn->trevsorted = (bi.revsorted && nils == 0) ||
    3265       22509 :                 ci.ncand <= 1 || nils == ci.ncand;
    3266       22256 :         bn->tkey = ci.ncand <= 1;
    3267       22256 :         bn->tnil = nils != 0;
    3268       22256 :         bn->tnonil = nils == 0;
    3269       22256 :         bat_iterator_end(&bi);
    3270             : 
    3271       22260 :         TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    3272             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    3273             :                   ALGOBATPAR(b), ALGOOPTBATPAR(s),
    3274             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    3275             : 
    3276             :         return bn;
    3277             : }
    3278             : 
    3279             : BAT *
    3280         123 : BATcalccstsub(const ValRecord *v, BAT *b, BAT *s, int tp)
    3281             : {
    3282         123 :         lng t0 = 0;
    3283         123 :         BAT *bn;
    3284         123 :         BUN nils;
    3285         123 :         struct canditer ci;
    3286             : 
    3287         123 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    3288             : 
    3289         123 :         BATcheck(b, NULL);
    3290             : 
    3291         123 :         canditer_init(&ci, b, s);
    3292             : 
    3293         123 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    3294         123 :         if (bn == NULL)
    3295             :                 return NULL;
    3296         123 :         if (ci.ncand == 0)
    3297             :                 return bn;
    3298             : 
    3299         107 :         BATiter bi = bat_iterator(b);
    3300         214 :         nils = sub_typeswitchloop(VALptr(v), v->vtype, false,
    3301         107 :                                   bi.base, bi.type, true,
    3302         107 :                                   Tloc(bn, 0), tp,
    3303         107 :                                   &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    3304             :                                   &ci,
    3305             :                                   0, b->hseqbase, __func__);
    3306             : 
    3307         107 :         if (nils == BUN_NONE) {
    3308           0 :                 bat_iterator_end(&bi);
    3309           0 :                 BBPunfix(bn->batCacheid);
    3310           0 :                 return NULL;
    3311             :         }
    3312             : 
    3313         107 :         BATsetcount(bn, ci.ncand);
    3314             : 
    3315             :         /* if the input is sorted, and no overflow occurred, the result
    3316             :          * is sorted in the opposite direction (except that NILs mess
    3317             :          * things up */
    3318         103 :         bn->tsorted = (nils == 0 && bi.revsorted) ||
    3319         179 :                 ci.ncand <= 1 || nils == ci.ncand;
    3320         103 :         bn->trevsorted = (nils == 0 && bi.sorted) ||
    3321         178 :                 ci.ncand <= 1 || nils == ci.ncand;
    3322         107 :         bn->tkey = ci.ncand <= 1;
    3323         107 :         bn->tnil = nils != 0;
    3324         107 :         bn->tnonil = nils == 0;
    3325         107 :         bat_iterator_end(&bi);
    3326             : 
    3327         107 :         TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    3328             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    3329             :                   ALGOBATPAR(b), ALGOOPTBATPAR(s),
    3330             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    3331             : 
    3332             :         return bn;
    3333             : }
    3334             : 
    3335             : gdk_return
    3336       43969 : VARcalcsub(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
    3337             : {
    3338       43969 :         ret->bat = false;
    3339       43979 :         if (sub_typeswitchloop(VALptr(lft), lft->vtype, false,
    3340       44017 :                                VALptr(rgt), rgt->vtype, false,
    3341       43969 :                                VALget(ret), ret->vtype,
    3342       43969 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    3343       43969 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    3344             :                                0, 0, __func__) == BUN_NONE)
    3345           2 :                 return GDK_FAIL;
    3346       43977 :         return GDK_SUCCEED;
    3347             : }
    3348             : 
    3349             : BAT *
    3350           0 : BATcalcdecr(BAT *b, BAT *s)
    3351             : {
    3352           0 :         return BATcalcincrdecr(b, s, sub_typeswitchloop,
    3353             :                                __func__);
    3354             : }
    3355             : 
    3356             : gdk_return
    3357           0 : VARcalcdecr(ValPtr ret, const ValRecord *v)
    3358             : {
    3359           0 :         ret->bat = false;
    3360           0 :         if (sub_typeswitchloop(VALptr(v), v->vtype, false,
    3361           0 :                                &(bte){1}, TYPE_bte, false,
    3362           0 :                                VALget(ret), ret->vtype,
    3363           0 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    3364           0 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    3365             :                                0, 0, __func__) == BUN_NONE)
    3366           0 :                 return GDK_FAIL;
    3367           0 :         return GDK_SUCCEED;
    3368             : }

Generated by: LCOV version 1.14