1 #include "common.h"
2
3 #include <common/test_assert.h>
4
5 static SQLCHAR output[256];
6
7 #ifdef TDS_NO_DM
8 static const int tds_no_dm = 1;
9 #else
10 static const int tds_no_dm = 0;
11 #endif
12
13 static int
test(int odbc3)14 test(int odbc3)
15 {
16 SQLLEN cnamesize;
17 const char *query;
18
19 odbc_use_version3 = odbc3;
20
21 odbc_connect();
22
23 /* issue print statement and test message returned */
24 output[0] = 0;
25 query = "print 'START' select count(*) from sysobjects where name='sysobjects' print 'END'";
26 odbc_command2(query, "I");
27 odbc_read_error();
28 if (!strstr(odbc_err, "START")) {
29 printf("Message invalid\n");
30 return 1;
31 }
32 odbc_err[0] = 0;
33
34 if (odbc3) {
35 ODBC_CHECK_COLS(0);
36 ODBC_CHECK_ROWS(-1);
37 CHKFetch("E");
38 CHKMoreResults("S");
39 }
40
41 ODBC_CHECK_COLS(1);
42 ODBC_CHECK_ROWS(-1);
43
44 CHKFetch("S");
45 ODBC_CHECK_COLS(1);
46 ODBC_CHECK_ROWS(-1);
47 /* check no data */
48 CHKFetch("No");
49 ODBC_CHECK_COLS(1);
50 ODBC_CHECK_ROWS(1);
51
52 /* SQLMoreResults return NO DATA or SUCCESS WITH INFO ... */
53 if (tds_no_dm && !odbc3)
54 CHKMoreResults("No");
55 else if (odbc3)
56 CHKMoreResults("I");
57 else
58 CHKMoreResults("INo");
59
60 /*
61 * ... but read error
62 * (unixODBC till 2.2.11 do not read errors on NO DATA, skip test)
63 */
64 if (tds_no_dm || odbc3) {
65 odbc_read_error();
66 if (!strstr(odbc_err, "END")) {
67 printf("Message invalid\n");
68 return 1;
69 }
70 odbc_err[0] = 0;
71 }
72
73 if (odbc3) {
74 ODBC_CHECK_COLS(0);
75 ODBC_CHECK_ROWS(-1);
76
77 CHKMoreResults("No");
78 }
79
80 /* issue invalid command and test error */
81 odbc_command2("SELECT donotexistsfield FROM donotexiststable", "E");
82 odbc_read_error();
83
84 /* test no data returned */
85 CHKFetch("E");
86 odbc_read_error();
87
88 CHKGetData(1, SQL_C_CHAR, output, sizeof(output), &cnamesize, "E");
89 odbc_read_error();
90
91 odbc_disconnect();
92
93 return 0;
94 }
95
96 int
main(int argc,char * argv[])97 main(int argc, char *argv[])
98 {
99 int ret;
100
101 /* ODBC 2 */
102 ret = test(0);
103 if (ret != 0)
104 return ret;
105
106 /* ODBC 3 */
107 ret = test(1);
108 if (ret != 0)
109 return ret;
110
111 printf("Done.\n");
112 return 0;
113 }
114
115