LCOV - code coverage report
Current view: top level - src/odbc/unittests - moreandcount.c (source / functions) Hit Total Coverage
Test: FreeTDS coverage Lines: 62 62 100.0 %
Date: 2025-02-21 09:36:06 Functions: 2 2 100.0 %

          Line data    Source code
       1             : #include "common.h"
       2             : 
       3             : /* Test for SQLMoreResults and SQLRowCount on batch */
       4             : 
       5             : static void
       6          20 : DoTest(int prepare)
       7             : {
       8          20 :         int n = 0;
       9             :         static const char query[] =
      10             :                 /* on prepared this recordset should be skipped */
      11             :                 "DECLARE @b INT SELECT @b = 25 "
      12             :                 "SELECT * FROM #tmp1 WHERE i <= 3 "
      13             :                 /* on prepare we cannot distinguish these recordset */
      14             :                 "INSERT INTO #tmp2 SELECT * FROM #tmp1 WHERE i = 1 "
      15             :                 "INSERT INTO #tmp2 SELECT * FROM #tmp1 WHERE i <= 3 "
      16             :                 "SELECT * FROM #tmp1 WHERE i = 1 "
      17             :                 /* but FreeTDS can detect last recordset */
      18             :                 "UPDATE #tmp1 SET i=i+1 WHERE i >= 2";
      19             : 
      20          20 :         if (prepare) {
      21          10 :                 CHKPrepare(T(query), SQL_NTS, "S");
      22          10 :                 CHKExecute("S");
      23             :         } else {
      24             : 
      25             :                 /* execute a batch command select insert insert select and check rows */
      26          10 :                 CHKExecDirect(T(query), SQL_NTS, "S");
      27             :         }
      28          20 :         if (!prepare) {
      29          10 :                 printf("Result %d\n", ++n);
      30          10 :                 ODBC_CHECK_COLS(0);
      31          10 :                 ODBC_CHECK_ROWS(1);
      32          10 :                 CHKMoreResults("S");
      33             :         }
      34          20 :         printf("Result %d\n", ++n);
      35          20 :         ODBC_CHECK_COLS(1);
      36          20 :         ODBC_CHECK_ROWS(-1);
      37          20 :         CHKFetch("S");
      38          20 :         CHKFetch("S");
      39          20 :         ODBC_CHECK_COLS(1);
      40          20 :         ODBC_CHECK_ROWS(-1);
      41          20 :         CHKFetch("No");
      42          20 :         ODBC_CHECK_COLS(1);
      43          20 :         ODBC_CHECK_ROWS(2);
      44          20 :         CHKMoreResults("S");
      45          20 :         if (!prepare) {
      46          10 :                 printf("Result %d\n", ++n);
      47          10 :                 ODBC_CHECK_COLS(0);
      48          10 :                 ODBC_CHECK_ROWS(1);
      49          10 :                 CHKMoreResults("S");
      50          10 :                 printf("Result %d\n", ++n);
      51          10 :                 ODBC_CHECK_COLS(0);
      52          10 :                 ODBC_CHECK_ROWS(2);
      53          10 :                 CHKMoreResults("S");
      54             :         }
      55          20 :         printf("Result %d\n", ++n);
      56          20 :         ODBC_CHECK_COLS(1);
      57          20 :         ODBC_CHECK_ROWS(-1);
      58          20 :         CHKFetch("S");
      59          20 :         ODBC_CHECK_COLS(1);
      60          20 :         ODBC_CHECK_ROWS(-1);
      61          20 :         CHKFetch("No");
      62          20 :         ODBC_CHECK_COLS(1);
      63          20 :         if (prepare) {
      64             :                 /* collapse 2 recordset... after a lot of testing this is the behavior! */
      65          10 :                 if (odbc_driver_is_freetds())
      66          10 :                         ODBC_CHECK_ROWS(2);
      67             :         } else {
      68          10 :                 ODBC_CHECK_ROWS(1);
      69          10 :                 CHKMoreResults("S");
      70          10 :                 ODBC_CHECK_COLS(0);
      71          10 :                 ODBC_CHECK_ROWS(2);
      72             :         }
      73             : 
      74          20 :         CHKMoreResults("No");
      75             : #ifndef TDS_NO_DM
      76             :         if (!prepare)
      77             :                 ODBC_CHECK_COLS(-1);
      78             :         ODBC_CHECK_ROWS(-2);
      79             : #endif
      80          20 :         ODBC_FREE();
      81          20 : }
      82             : 
      83             : int
      84          10 : main(void)
      85             : {
      86          10 :         odbc_connect();
      87             : 
      88          10 :         odbc_command("create table #tmp1 (i int)");
      89          10 :         odbc_command("create table #tmp2 (i int)");
      90          10 :         odbc_command("insert into #tmp1 values(1)");
      91          10 :         odbc_command("insert into #tmp1 values(2)");
      92          10 :         odbc_command("insert into #tmp1 values(5)");
      93             : 
      94          10 :         printf("Use direct statement\n");
      95          10 :         DoTest(0);
      96             : 
      97          10 :         printf("Use prepared statement\n");
      98          10 :         DoTest(1);
      99             : 
     100          10 :         odbc_disconnect();
     101             : 
     102          10 :         printf("Done.\n");
     103             :         return 0;
     104             : }

Generated by: LCOV version 1.13