LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/test/compat_informix - dec_test.pgc (source / functions) Coverage Total Hit
Test: PostgreSQL 20devel Lines: 87.3 % 134 117
Test Date: 2026-07-25 22:15:46 Functions: 100.0 % 2 2
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 82.3 % 62 51

             Branch data     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                 :           2 : main(void)
      38                 :             : {
      39                 :             :     decimal *dec, *din;
      40                 :             :     char buf[BUFSIZE];
      41                 :             :     long l;
      42                 :           2 :     int i, j, k, q, r, count = 0;
      43                 :             :     double dbl;
      44                 :           2 :     decimal **decarr = (decimal **) calloc(1, sizeof(decimal));
      45                 :             : 
      46                 :           2 :     ECPGdebug(1, stderr);
      47                 :             : 
      48         [ +  + ]:          34 :     for (i = 0; decs[i]; i++)
      49                 :             :     {
      50                 :          32 :         dec = PGTYPESdecimal_new();
      51                 :          32 :         r = deccvasc(decs[i], strlen(decs[i]), dec);
      52         [ +  + ]:          32 :         if (r)
      53                 :             :         {
      54                 :           4 :             check_errno();
      55                 :           4 :             printf("dec[%d,0]: r: %d\n", i, r);
      56                 :           4 :             PGTYPESdecimal_free(dec);
      57                 :           4 :             continue;
      58                 :             :         }
      59                 :          28 :         decarr = realloc(decarr, sizeof(decimal *) * (count + 1));
      60                 :          28 :         decarr[count++] = dec;
      61                 :             : 
      62                 :          28 :         r = dectoasc(dec, buf, BUFSIZE-1, -1);
      63         [ +  + ]:          28 :         if (r < 0) check_errno();
      64                 :          28 :         printf("dec[%d,1]: r: %d, %s\n", i, r, buf);
      65                 :             : 
      66                 :          28 :         r = dectoasc(dec, buf, BUFSIZE-1, 0);
      67         [ +  + ]:          28 :         if (r < 0) check_errno();
      68                 :          28 :         printf("dec[%d,2]: r: %d, %s\n", i, r, buf);
      69                 :          28 :         r = dectoasc(dec, buf, BUFSIZE-1, 1);
      70         [ +  + ]:          28 :         if (r < 0) check_errno();
      71                 :          28 :         printf("dec[%d,3]: r: %d, %s\n", i, r, buf);
      72                 :          28 :         r = dectoasc(dec, buf, BUFSIZE-1, 2);
      73         [ +  + ]:          28 :         if (r < 0) check_errno();
      74                 :          28 :         printf("dec[%d,4]: r: %d, %s\n", i, r, buf);
      75                 :             : 
      76                 :          28 :         din = PGTYPESdecimal_new();
      77                 :          28 :         r = dectoasc(din, buf, BUFSIZE-1, 2);
      78         [ -  + ]:          28 :         if (r < 0) check_errno();
      79                 :          28 :         printf("dec[%d,5]: r: %d, %s\n", i, r, buf);
      80                 :             : 
      81                 :          28 :         r = dectolong(dec, &l);
      82         [ +  + ]:          28 :         if (r) check_errno();
      83         [ +  + ]:          28 :         printf("dec[%d,6]: %ld (r: %d)\n", i, r?0L:l, r);
      84         [ +  + ]:          28 :         if (r == 0)
      85                 :             :         {
      86                 :          22 :             r = deccvlong(l, din);
      87         [ -  + ]:          22 :             if (r) check_errno();
      88                 :          22 :             dectoasc(din, buf, BUFSIZE-1, 2);
      89                 :          22 :             q = deccmp(dec, din);
      90                 :          22 :             printf("dec[%d,7]: %s (r: %d - cmp: %d)\n", i, buf, r, q);
      91                 :             :         }
      92                 :             : 
      93                 :          28 :         r = dectoint(dec, &k);
      94         [ +  + ]:          28 :         if (r) check_errno();
      95         [ +  + ]:          28 :         printf("dec[%d,8]: %d (r: %d)\n", i, r?0:k, r);
      96         [ +  + ]:          28 :         if (r == 0)
      97                 :             :         {
      98                 :          22 :             r = deccvint(k, din);
      99         [ -  + ]:          22 :             if (r) check_errno();
     100                 :          22 :             dectoasc(din, buf, BUFSIZE-1, 2);
     101                 :          22 :             q = deccmp(dec, din);
     102                 :          22 :             printf("dec[%d,9]: %s (r: %d - cmp: %d)\n", i, buf, r, q);
     103                 :             :         }
     104                 :             : 
     105         [ +  + ]:          28 :         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                 :          26 :             r = dectodbl(dec, &dbl);
     110         [ +  + ]:          26 :             if (r) check_errno();
     111                 :          26 :             printf("dec[%d,10]: ", i);
     112         [ +  + ]:          26 :             print_double(r ? 0.0 : dbl);
     113                 :          26 :             printf(" (r: %d)\n", r);
     114                 :             :         }
     115                 :             : 
     116                 :          28 :         PGTYPESdecimal_free(din);
     117                 :          28 :         printf("\n");
     118                 :             :     }
     119                 :             : 
     120                 :             :     /* add a NULL value */
     121                 :           2 :     dec = PGTYPESdecimal_new();
     122                 :           2 :     decarr = realloc(decarr, sizeof(decimal *) * (count + 1));
     123                 :           2 :     decarr[count++] = dec;
     124                 :             : 
     125                 :           2 :     rsetnull(CDECIMALTYPE, (char *) decarr[count-1]);
     126         [ +  - ]:           2 :     printf("dec[%d]: %sNULL\n", count-1,
     127                 :           2 :         risnull(CDECIMALTYPE, (char *) decarr[count-1]) ? "" : "NOT ");
     128         [ -  + ]:           2 :     printf("dec[0]: %sNULL\n",
     129                 :           2 :         risnull(CDECIMALTYPE, (char *) decarr[0]) ? "" : "NOT ");
     130                 :             : 
     131                 :           2 :     r = dectoasc(decarr[3], buf, -1, -1);
     132                 :           2 :     check_errno(); printf("dectoasc with len == -1: r: %d\n", r);
     133                 :           2 :     r = dectoasc(decarr[3], buf, 0, -1);
     134                 :           2 :     check_errno(); printf("dectoasc with len == 0: r: %d\n", r);
     135                 :             : 
     136         [ +  + ]:          32 :     for (i = 0; i < count; i++)
     137                 :             :     {
     138         [ +  + ]:         480 :         for (j = 0; j < count; j++)
     139                 :             :         {
     140                 :             :             decimal a, s, m, d;
     141                 :             :             int c;
     142                 :         450 :             c = deccmp(decarr[i], decarr[j]);
     143                 :         450 :             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                 :         450 :             deccvint(7654321, &a);
     151                 :         450 :             deccvint(7654321, &s);
     152                 :         450 :             deccvint(7654321, &m);
     153                 :         450 :             deccvint(7654321, &d);
     154                 :             : 
     155                 :         450 :             r = decadd(decarr[i], decarr[j], &a);
     156         [ +  + ]:         450 :             if (r)
     157                 :             :             {
     158                 :         124 :                 check_errno();
     159                 :         124 :                 printf("r: %d\n", r);
     160                 :             :             }
     161                 :             :             else
     162                 :             :             {
     163                 :         326 :                 dectoasc(&a, buf, BUFSIZE-1, -1);
     164                 :         326 :                 printf("dec[a,%d,%d]: %s\n", i, j, buf);
     165                 :             :             }
     166                 :             : 
     167                 :         450 :             r = decsub(decarr[i], decarr[j], &s);
     168         [ -  + ]:         450 :             if (r)
     169                 :             :             {
     170                 :           0 :                 check_errno();
     171                 :           0 :                 printf("r: %d\n", r);
     172                 :             :             }
     173                 :             :             else
     174                 :             :             {
     175                 :         450 :                 dectoasc(&s, buf, BUFSIZE-1, -1);
     176                 :         450 :                 printf("dec[s,%d,%d]: %s\n", i, j, buf);
     177                 :             :             }
     178                 :             : 
     179                 :         450 :             r = decmul(decarr[i], decarr[j], &m);
     180         [ -  + ]:         450 :             if (r)
     181                 :             :             {
     182                 :           0 :                 check_errno();
     183                 :           0 :                 printf("r: %d\n", r);
     184                 :             :             }
     185                 :             :             else
     186                 :             :             {
     187                 :         450 :                 dectoasc(&m, buf, BUFSIZE-1, -1);
     188                 :         450 :                 printf("dec[m,%d,%d]: %s\n", i, j, buf);
     189                 :             :             }
     190                 :             : 
     191                 :         450 :             r = decdiv(decarr[i], decarr[j], &d);
     192         [ +  + ]:         450 :             if (r)
     193                 :             :             {
     194                 :          28 :                 check_errno();
     195                 :          28 :                 printf("r: %d\n", r);
     196                 :             :             }
     197                 :             :             else
     198                 :             :             {
     199                 :         422 :                 dectoasc(&d, buf, BUFSIZE-1, -1);
     200                 :         422 :                 printf("dec[d,%d,%d]: %s\n", i, j, buf);
     201                 :             :             }
     202                 :             :         }
     203                 :             :     }
     204                 :             : 
     205         [ +  + ]:          32 :     for (i = 0; i < count; i++)
     206                 :             :     {
     207                 :          30 :         dectoasc(decarr[i], buf, BUFSIZE-1, -1);
     208                 :          30 :         printf("%d: %s\n", i, buf);
     209                 :             : 
     210                 :          30 :         PGTYPESdecimal_free(decarr[i]);
     211                 :             :     }
     212                 :           2 :     free(decarr);
     213                 :             : 
     214                 :           2 :     return 0;
     215                 :             : }
     216                 :             : 
     217                 :             : static void
     218                 :         184 : check_errno(void)
     219                 :             : {
     220   [ +  -  -  +  :         184 :     switch(errno)
             -  +  +  - ]
     221                 :             :     {
     222                 :          10 :         case 0:
     223                 :          10 :             printf("(no errno set) - ");
     224                 :          10 :             break;
     225                 :           0 :         case ECPG_INFORMIX_NUM_OVERFLOW:
     226                 :           0 :             printf("(errno == ECPG_INFORMIX_NUM_OVERFLOW) - ");
     227                 :           0 :             break;
     228                 :           0 :         case ECPG_INFORMIX_NUM_UNDERFLOW:
     229                 :           0 :             printf("(errno == ECPG_INFORMIX_NUM_UNDERFLOW) - ");
     230                 :           0 :             break;
     231                 :         140 :         case PGTYPES_NUM_OVERFLOW:
     232                 :         140 :             printf("(errno == PGTYPES_NUM_OVERFLOW) - ");
     233                 :         140 :             break;
     234                 :           0 :         case PGTYPES_NUM_UNDERFLOW:
     235                 :           0 :             printf("(errno == PGTYPES_NUM_UNDERFLOW) - ");
     236                 :           0 :             break;
     237                 :           6 :         case PGTYPES_NUM_BAD_NUMERIC:
     238                 :           6 :             printf("(errno == PGTYPES_NUM_BAD_NUMERIC) - ");
     239                 :           6 :             break;
     240                 :          28 :         case PGTYPES_NUM_DIVIDE_ZERO:
     241                 :          28 :             printf("(errno == PGTYPES_NUM_DIVIDE_ZERO) - ");
     242                 :          28 :             break;
     243                 :           0 :         default:
     244                 :           0 :             printf("(unknown errno (%d))\n", errno);
     245                 :           0 :             printf("(libc: (%s)) ", strerror(errno));
     246                 :           0 :             break;
     247                 :             :     }
     248                 :         184 : }
        

Generated by: LCOV version 2.0-1