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