LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/test/preproc - array_of_struct.pgc (source / functions) Hit Total Coverage
Test: PostgreSQL 19devel Lines: 42 42 100.0 %
Date: 2025-12-16 12:18:01 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : #include <stdio.h>
       2             : 
       3             : exec sql include ../regression;
       4             : 
       5             : EXEC SQL WHENEVER sqlerror sqlprint;
       6             : EXEC SQL WHENEVER sqlwarning sqlprint;
       7             : EXEC SQL WHENEVER not found sqlprint;
       8             : 
       9             : EXEC SQL TYPE customer IS
      10             :     struct
      11             :     {
      12             :         varchar name[50];
      13             :         int     phone;
      14             :     };
      15             : 
      16             : EXEC SQL TYPE cust_ind IS
      17             :     struct ind
      18             :     {
      19             :         short   name_ind;
      20             :         short   phone_ind;
      21             :     };
      22             : 
      23             : EXEC SQL TYPE company IS
      24             :     struct
      25             :     {
      26             :         customer customers[10];
      27             :     };
      28             : 
      29           4 : int main()
      30             : {
      31             :     EXEC SQL begin declare section;
      32             :       customer  custs1[10];
      33             :       cust_ind  inds[10];
      34             :       typedef struct
      35             :       {
      36             :         varchar name[50];
      37             :         int     phone;
      38             :       } customer2;
      39             :       customer2  custs2[10];
      40             :       struct customer3
      41             :       {
      42             :         varchar name[50];
      43             :         int     phone;
      44             :       } custs3[10];
      45             :       struct customer4
      46             :       {
      47             :         varchar name[50];
      48             :         int     phone;
      49             :       } custs4;
      50             : 
      51             :       company acme;
      52             : 
      53             :       int r;
      54             :       varchar onlyname[2][50];
      55             :     EXEC SQL end declare section;
      56             : 
      57           4 :     ECPGdebug(1, stderr);
      58             : 
      59           4 :     EXEC SQL connect to REGRESSDB1;
      60           4 : 
      61           4 :     EXEC SQL create table customers (c varchar(50), p int);
      62           4 : 
      63             :     /* First we'll insert some data using C variable references */
      64           4 :     strcpy(custs1[0].name.arr, "John Doe");
      65           4 :     custs1[0].name.len = strlen(custs1[0].name.arr);
      66           4 :     custs1[0].phone = 12345;
      67             : 
      68           4 :     strcpy(acme.customers[1].name.arr, "Jane Doe");
      69           4 :     acme.customers[1].name.len = strlen(acme.customers[1].name.arr);
      70           4 :     acme.customers[1].phone = 67890;
      71             : 
      72           4 :     EXEC SQL insert into customers values (:custs1->name,
      73             :                                            :custs1[0].phone);
      74           4 :     EXEC SQL insert into customers values (:acme.customers[1].name,
      75             :                                            :acme.customers[1].phone);
      76           4 : 
      77             :     /* Clear the array, to be sure reading back into it actually gets data */
      78           4 :     memset(custs1, 0, sizeof(customer) * 10);
      79             : 
      80             :     /* Now read back the data */
      81           4 :     EXEC SQL select * INTO :custs1:inds from customers limit 2;
      82           4 :     printf("custs1:\n");
      83          12 :     for (r = 0; r < 2; r++)
      84             :     {
      85           8 :         printf( "name  - %s\n", custs1[r].name.arr );
      86           8 :         printf( "phone - %d\n", custs1[r].phone );
      87             :     }
      88             : 
      89           4 :     EXEC SQL select * INTO :custs2:inds from customers limit 2;
      90           4 :     printf("\ncusts2:\n");
      91          12 :     for (r = 0; r < 2; r++)
      92             :     {
      93           8 :         printf( "name  - %s\n", custs2[r].name.arr );
      94           8 :         printf( "phone - %d\n", custs2[r].phone );
      95             :     }
      96             : 
      97           4 :     EXEC SQL select * INTO :custs3:inds from customers limit 2;
      98           4 :     printf("\ncusts3:\n");
      99          12 :     for (r = 0; r < 2; r++)
     100             :     {
     101           8 :         printf( "name  - %s\n", custs3[r].name.arr );
     102           8 :         printf( "phone - %d\n", custs3[r].phone );
     103             :     }
     104             : 
     105           4 :     EXEC SQL select * INTO :custs4:inds[0] from customers limit 1;
     106           4 :     printf("\ncusts4:\n");
     107           4 :     printf( "name  - %s\n", custs4.name.arr );
     108           4 :     printf( "phone - %d\n", custs4.phone );
     109             : 
     110           4 :     EXEC SQL select c INTO :onlyname from customers limit 2;
     111           4 :     printf("\nname:\n");
     112          12 :     for (r = 0; r < 2; r++)
     113             :     {
     114           8 :         printf( "name  - %s\n", onlyname[r].arr );
     115             :     }
     116             : 
     117           4 :     EXEC SQL disconnect all;
     118           4 : 
     119           4 :     return 0;
     120             : }

Generated by: LCOV version 1.16