LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/test/compat_informix - dec_test.pgc (source / functions) Coverage Total Hit
Test: Code coverage Lines: 0.0 % 144 0
Test Date: 2026-01-26 10:56:24 Functions: 0.0 % 2 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : #include <stdio.h>
       2              : #include <stdlib.h>
       3              : #include <pgtypes_numeric.h>
       4              : #include <pgtypes_error.h>
       5              : #include <decimal.h>
       6              : #include <sqltypes.h>
       7              : 
       8              : exec sql include ../regression;
       9              : 
      10              : exec sql include ../printf_hack;
      11              : 
      12              : 
      13              : /*
      14              : TODO:
      15              :         deccmp => DECUNKNOWN
      16              :         decimal point: , and/or . ?
      17              :         ECPG_INFORMIX_BAD_EXPONENT ?
      18              : */
      19              : 
      20              : char* decs[] = { "2E394", "-2", ".794", "3.44", "592.49E21", "-32.84e4",
      21              :                                  "2E-394", ".1E-2", "+.0", "-592.49E-07", "+32.84e-4",
      22              :                                  ".500001", "-.5000001",
      23              :                                  "1234567890123456789012345678.91", /* 30 digits should fit
      24              :                                                                        into decimal */
      25              :                                  "1234567890123456789012345678.921", /* 31 digits should NOT
      26              :                                                                         fit into decimal */
      27              :                                  "not a number",
      28              :                                  NULL};
      29              : 
      30              : 
      31              : static void
      32              : check_errno(void);
      33              : 
      34              : #define BUFSIZE 200
      35              : 
      36              : int
      37            0 : main(void)
      38              : {
      39            0 :         decimal *dec, *din;
      40            0 :         char buf[BUFSIZE];
      41            0 :         long l;
      42            0 :         int i, j, k, q, r, count = 0;
      43            0 :         double dbl;
      44            0 :         decimal **decarr = (decimal **) calloc(1, sizeof(decimal));
      45              : 
      46            0 :         ECPGdebug(1, stderr);
      47              : 
      48            0 :         for (i = 0; decs[i]; i++)
      49              :         {
      50            0 :                 dec = PGTYPESdecimal_new();
      51            0 :                 r = deccvasc(decs[i], strlen(decs[i]), dec);
      52            0 :                 if (r)
      53              :                 {
      54            0 :                         check_errno();
      55            0 :                         printf("dec[%d,0]: r: %d\n", i, r);
      56            0 :                         PGTYPESdecimal_free(dec);
      57            0 :                         continue;
      58              :                 }
      59            0 :                 decarr = realloc(decarr, sizeof(decimal *) * (count + 1));
      60            0 :                 decarr[count++] = dec;
      61              : 
      62            0 :                 r = dectoasc(dec, buf, BUFSIZE-1, -1);
      63            0 :                 if (r < 0) check_errno();
      64            0 :                 printf("dec[%d,1]: r: %d, %s\n", i, r, buf);
      65              : 
      66            0 :                 r = dectoasc(dec, buf, BUFSIZE-1, 0);
      67            0 :                 if (r < 0) check_errno();
      68            0 :                 printf("dec[%d,2]: r: %d, %s\n", i, r, buf);
      69            0 :                 r = dectoasc(dec, buf, BUFSIZE-1, 1);
      70            0 :                 if (r < 0) check_errno();
      71            0 :                 printf("dec[%d,3]: r: %d, %s\n", i, r, buf);
      72            0 :                 r = dectoasc(dec, buf, BUFSIZE-1, 2);
      73            0 :                 if (r < 0) check_errno();
      74            0 :                 printf("dec[%d,4]: r: %d, %s\n", i, r, buf);
      75              : 
      76            0 :                 din = PGTYPESdecimal_new();
      77            0 :                 r = dectoasc(din, buf, BUFSIZE-1, 2);
      78            0 :                 if (r < 0) check_errno();
      79            0 :                 printf("dec[%d,5]: r: %d, %s\n", i, r, buf);
      80              : 
      81            0 :                 r = dectolong(dec, &l);
      82            0 :                 if (r) check_errno();
      83            0 :                 printf("dec[%d,6]: %ld (r: %d)\n", i, r?0L:l, r);
      84            0 :                 if (r == 0)
      85              :                 {
      86            0 :                         r = deccvlong(l, din);
      87            0 :                         if (r) check_errno();
      88            0 :                         dectoasc(din, buf, BUFSIZE-1, 2);
      89            0 :                         q = deccmp(dec, din);
      90            0 :                         printf("dec[%d,7]: %s (r: %d - cmp: %d)\n", i, buf, r, q);
      91            0 :                 }
      92              : 
      93            0 :                 r = dectoint(dec, &k);
      94            0 :                 if (r) check_errno();
      95            0 :                 printf("dec[%d,8]: %d (r: %d)\n", i, r?0:k, r);
      96            0 :                 if (r == 0)
      97              :                 {
      98            0 :                         r = deccvint(k, din);
      99            0 :                         if (r) check_errno();
     100            0 :                         dectoasc(din, buf, BUFSIZE-1, 2);
     101            0 :                         q = deccmp(dec, din);
     102            0 :                         printf("dec[%d,9]: %s (r: %d - cmp: %d)\n", i, buf, r, q);
     103            0 :                 }
     104              : 
     105            0 :                 if (i != 6)
     106              :                 {
     107              :                         /* underflow does not work reliable on several archs, so not testing it here */
     108              :                         /* this is a libc problem since we only call strtod() */
     109            0 :                         r = dectodbl(dec, &dbl);
     110            0 :                         if (r) check_errno();
     111            0 :                         printf("dec[%d,10]: ", i);
     112            0 :                         print_double(r ? 0.0 : dbl);
     113            0 :                         printf(" (r: %d)\n", r);
     114            0 :                 }
     115              : 
     116            0 :                 PGTYPESdecimal_free(din);
     117            0 :                 printf("\n");
     118            0 :         }
     119              : 
     120              :         /* add a NULL value */
     121            0 :         dec = PGTYPESdecimal_new();
     122            0 :         decarr = realloc(decarr, sizeof(decimal *) * (count + 1));
     123            0 :         decarr[count++] = dec;
     124              : 
     125            0 :         rsetnull(CDECIMALTYPE, (char *) decarr[count-1]);
     126            0 :         printf("dec[%d]: %sNULL\n", count-1,
     127            0 :                 risnull(CDECIMALTYPE, (char *) decarr[count-1]) ? "" : "NOT ");
     128            0 :         printf("dec[0]: %sNULL\n",
     129            0 :                 risnull(CDECIMALTYPE, (char *) decarr[0]) ? "" : "NOT ");
     130              : 
     131            0 :         r = dectoasc(decarr[3], buf, -1, -1);
     132            0 :         check_errno(); printf("dectoasc with len == -1: r: %d\n", r);
     133            0 :         r = dectoasc(decarr[3], buf, 0, -1);
     134            0 :         check_errno(); printf("dectoasc with len == 0: r: %d\n", r);
     135              : 
     136            0 :         for (i = 0; i < count; i++)
     137              :         {
     138            0 :                 for (j = 0; j < count; j++)
     139              :                 {
     140            0 :                         decimal a, s, m, d;
     141            0 :                         int c;
     142            0 :                         c = deccmp(decarr[i], decarr[j]);
     143            0 :                         printf("dec[c,%d,%d]: %d\n", i, j, c);
     144              : 
     145              :                         /*
     146              :                          * decarr[count-1] is risnull(), which makes these functions
     147              :                          * return 0 without changing the output parameter.  Make that
     148              :                          * clear by initializing each output parameter.
     149              :                          */
     150            0 :                         deccvint(7654321, &a);
     151            0 :                         deccvint(7654321, &s);
     152            0 :                         deccvint(7654321, &m);
     153            0 :                         deccvint(7654321, &d);
     154              : 
     155            0 :                         r = decadd(decarr[i], decarr[j], &a);
     156            0 :                         if (r)
     157              :                         {
     158            0 :                                 check_errno();
     159            0 :                                 printf("r: %d\n", r);
     160            0 :                         }
     161              :                         else
     162              :                         {
     163            0 :                                 dectoasc(&a, buf, BUFSIZE-1, -1);
     164            0 :                                 printf("dec[a,%d,%d]: %s\n", i, j, buf);
     165              :                         }
     166              : 
     167            0 :                         r = decsub(decarr[i], decarr[j], &s);
     168            0 :                         if (r)
     169              :                         {
     170            0 :                                 check_errno();
     171            0 :                                 printf("r: %d\n", r);
     172            0 :                         }
     173              :                         else
     174              :                         {
     175            0 :                                 dectoasc(&s, buf, BUFSIZE-1, -1);
     176            0 :                                 printf("dec[s,%d,%d]: %s\n", i, j, buf);
     177              :                         }
     178              : 
     179            0 :                         r = decmul(decarr[i], decarr[j], &m);
     180            0 :                         if (r)
     181              :                         {
     182            0 :                                 check_errno();
     183            0 :                                 printf("r: %d\n", r);
     184            0 :                         }
     185              :                         else
     186              :                         {
     187            0 :                                 dectoasc(&m, buf, BUFSIZE-1, -1);
     188            0 :                                 printf("dec[m,%d,%d]: %s\n", i, j, buf);
     189              :                         }
     190              : 
     191            0 :                         r = decdiv(decarr[i], decarr[j], &d);
     192            0 :                         if (r)
     193              :                         {
     194            0 :                                 check_errno();
     195            0 :                                 printf("r: %d\n", r);
     196            0 :                         }
     197              :                         else
     198              :                         {
     199            0 :                                 dectoasc(&d, buf, BUFSIZE-1, -1);
     200            0 :                                 printf("dec[d,%d,%d]: %s\n", i, j, buf);
     201              :                         }
     202            0 :                 }
     203            0 :         }
     204              : 
     205            0 :         for (i = 0; i < count; i++)
     206              :         {
     207            0 :                 dectoasc(decarr[i], buf, BUFSIZE-1, -1);
     208            0 :                 printf("%d: %s\n", i, buf);
     209              : 
     210            0 :                 PGTYPESdecimal_free(decarr[i]);
     211            0 :         }
     212            0 :         free(decarr);
     213              : 
     214            0 :         return 0;
     215            0 : }
     216              : 
     217              : static void
     218            0 : check_errno(void)
     219              : {
     220            0 :         switch(errno)
     221              :         {
     222              :                 case 0:
     223            0 :                         printf("(no errno set) - ");
     224            0 :                         break;
     225              :                 case ECPG_INFORMIX_NUM_OVERFLOW:
     226            0 :                         printf("(errno == ECPG_INFORMIX_NUM_OVERFLOW) - ");
     227            0 :                         break;
     228              :                 case ECPG_INFORMIX_NUM_UNDERFLOW:
     229            0 :                         printf("(errno == ECPG_INFORMIX_NUM_UNDERFLOW) - ");
     230            0 :                         break;
     231              :                 case PGTYPES_NUM_OVERFLOW:
     232            0 :                         printf("(errno == PGTYPES_NUM_OVERFLOW) - ");
     233            0 :                         break;
     234              :                 case PGTYPES_NUM_UNDERFLOW:
     235            0 :                         printf("(errno == PGTYPES_NUM_UNDERFLOW) - ");
     236            0 :                         break;
     237              :                 case PGTYPES_NUM_BAD_NUMERIC:
     238            0 :                         printf("(errno == PGTYPES_NUM_BAD_NUMERIC) - ");
     239            0 :                         break;
     240              :                 case PGTYPES_NUM_DIVIDE_ZERO:
     241            0 :                         printf("(errno == PGTYPES_NUM_DIVIDE_ZERO) - ");
     242            0 :                         break;
     243              :                 default:
     244            0 :                         printf("(unknown errno (%d))\n", errno);
     245            0 :                         printf("(libc: (%s)) ", strerror(errno));
     246            0 :                         break;
     247              :         }
     248            0 : }
        

Generated by: LCOV version 2.3.2-1