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 : }
|