1 /*
2  * Purpose: Test retrieving compute rows
3  * Functions: dbaltbind dbaltcolid dbaltop dbalttype dbnumalts
4  */
5 
6 #include <freetds/tds.h>
7 #include "common.h"
8 #include <dblib.h>
9 
10 #include <common/test_assert.h>
11 
12 static char software_version[] = "$Id: t0023.c 488796 2016-01-05 20:20:40Z ucko $";
13 static void *no_unused_var_warn[] = { software_version, no_unused_var_warn };
14 
15 
16 int failed = 0;
17 
18 
19 int
main(int argc,char * argv[])20 main(int argc, char *argv[])
21 {
22 	LOGINREC *login;
23 	DBPROCESS *dbproc;
24 	int i;
25 	DBINT rowint;
26 	DBCHAR rowchar[2];
27 	DBCHAR rowdate[32];
28 
29 	DBINT rowtype;
30 	DBINT computeint;
31 	DBCHAR computedate[32];
32 
33 	set_malloc_options();
34 	read_login_info(argc, argv);
35 
36 	fprintf(stdout, "Starting %s\n", argv[0]);
37 
38 	/* Fortify_EnterScope(); */
39 	dbinit();
40 
41 	dberrhandle(syb_err_handler);
42 	dbmsghandle(syb_msg_handler);
43 
44 	fprintf(stdout, "About to logon\n");
45 
46 	login = dblogin();
47 	DBSETLPWD(login, PASSWORD);
48 	DBSETLUSER(login, USER);
49 	DBSETLAPP(login, "t0023");
50 
51 	fprintf(stdout, "About to open\n");
52 
53 	dbproc = dbopen(login, SERVER);
54 	if (strlen(DATABASE))
55 		dbuse(dbproc, DATABASE);
56 	dbloginfree(login);
57 
58     if (dbproc != NULL) {
59         TDSSOCKET *tds = dbproc->tds_socket;
60         if (TDS_IS_MSSQL(tds)
61             &&  tds->conn->product_version >= TDS_MS_VER(11, 0, 0)) {
62             fputs("Skipping COMPUTE tests with MS SQL 2012+.\n", stderr);
63             return 77;
64         }
65     }
66 
67 	fprintf(stdout, "creating table\n");
68 	sql_cmd(dbproc);
69 	dbsqlexec(dbproc);
70 	while (dbresults(dbproc) == SUCCEED) {
71 		/* nop */
72 	}
73 
74 	fprintf(stdout, "insert\n");
75 
76 	sql_cmd(dbproc);
77 	dbsqlexec(dbproc);
78 	while (dbresults(dbproc) == SUCCEED) {
79 		/* nop */
80 	}
81 	sql_cmd(dbproc);
82 	dbsqlexec(dbproc);
83 	while (dbresults(dbproc) == SUCCEED) {
84 		/* nop */
85 	}
86 	sql_cmd(dbproc);
87 	dbsqlexec(dbproc);
88 	while (dbresults(dbproc) == SUCCEED) {
89 		/* nop */
90 	}
91 	sql_cmd(dbproc);
92 	dbsqlexec(dbproc);
93 	while (dbresults(dbproc) == SUCCEED) {
94 		/* nop */
95 	}
96 	sql_cmd(dbproc);
97 	dbsqlexec(dbproc);
98 	while (dbresults(dbproc) == SUCCEED) {
99 		/* nop */
100 	}
101 
102 	fprintf(stdout, "select\n");
103 	sql_cmd(dbproc);
104 	dbsqlexec(dbproc);
105 
106 	if (dbresults(dbproc) != SUCCEED) {
107 		failed = 1;
108 		fprintf(stdout, "Was expecting a result set.\n");
109 		exit(1);
110 	}
111 
112 	for (i = 1; i <= dbnumcols(dbproc); i++)
113 		printf("col %d is %s\n", i, dbcolname(dbproc, i));
114 
115 	fprintf(stdout, "binding row columns\n");
116 	if (SUCCEED != dbbind(dbproc, 1, INTBIND, 0, (BYTE *) & rowint)) {
117 		failed = 1;
118 		fprintf(stderr, "Had problem with bind col1\n");
119 		abort();
120 	}
121 	if (SUCCEED != dbbind(dbproc, 2, STRINGBIND, 0, (BYTE *) rowchar)) {
122 		failed = 1;
123 		fprintf(stderr, "Had problem with bind col2\n");
124 		abort();
125 	}
126 	if (SUCCEED != dbbind(dbproc, 3, STRINGBIND, 0, (BYTE *) rowdate)) {
127 		failed = 1;
128 		fprintf(stderr, "Had problem with bind col3\n");
129 		abort();
130 	}
131 
132 	fprintf(stdout, "testing compute clause 1\n");
133 
134 	if (dbnumalts(dbproc, 1) != 1) {
135 		failed = 1;
136 		fprintf(stderr, "Had problem with dbnumalts 1\n");
137 		abort();
138 	}
139 
140 	if (dbalttype(dbproc, 1, 1) != SYBINT4) {
141 		failed = 1;
142 		fprintf(stderr, "Had problem with dbalttype 1, 1\n");
143 		abort();
144 	}
145 
146 	if (dbaltcolid(dbproc, 1, 1) != 1) {
147 		failed = 1;
148 		fprintf(stderr, "Had problem with dbaltcolid 1, 1\n");
149 		abort();
150 	}
151 
152 	if (dbaltop(dbproc, 1, 1) != SYBAOPSUM) {
153 		failed = 1;
154 		fprintf(stderr, "Had problem with dbaltop 1, 1\n");
155 		abort();
156 	}
157 
158 	if (SUCCEED != dbaltbind(dbproc, 1, 1, INTBIND, 0, (BYTE *) & computeint)) {
159 		failed = 1;
160 		fprintf(stderr, "Had problem with dbaltbind 1, 1\n");
161 		abort();
162 	}
163 
164 
165 	fprintf(stdout, "testing compute clause 2\n");
166 
167 	if (dbnumalts(dbproc, 2) != 1) {
168 		failed = 1;
169 		fprintf(stderr, "Had problem with dbnumalts 2\n");
170 		abort();
171 	}
172 
173 	if (dbalttype(dbproc, 2, 1) != SYBDATETIME) {
174 		failed = 1;
175 		fprintf(stderr, "Had problem with dbalttype 2, 1\n");
176 		abort();
177 	}
178 
179 	if (dbaltcolid(dbproc, 2, 1) != 3) {
180 		failed = 1;
181 		fprintf(stderr, "Had problem with dbaltcolid 2, 1\n");
182 		abort();
183 	}
184 
185 	if (dbaltop(dbproc, 2, 1) != SYBAOPMAX) {
186 		failed = 1;
187 		fprintf(stderr, "Had problem with dbaltop 2, 1\n");
188 		abort();
189 	}
190 
191 	if (SUCCEED != dbaltbind(dbproc, 2, 1, STRINGBIND, -1, (BYTE *) computedate)) {
192 		failed = 1;
193 		fprintf(stderr, "Had problem with dbaltbind 2, 1\n");
194 		abort();
195 	}
196 
197 	while ((rowtype = dbnextrow(dbproc)) != NO_MORE_ROWS) {
198 
199 		if (rowtype == REG_ROW) {
200 			printf("gotten a regular row\n");
201 		}
202 
203 		if (rowtype == 1) {
204 			printf("gotten a compute row for clause 1\n");
205 			printf("value of sum(col1) = %d\n", computeint);
206 		}
207 
208 		if (rowtype == 2) {
209 			printf("gotten a compute row for clause 2\n");
210 			printf("value of max(col3) = %s\n", computedate);
211 
212 		}
213 	}
214 
215 	dbexit();
216 
217 	fprintf(stdout, "%s %s\n", __FILE__, (failed ? "failed!" : "OK"));
218 	return failed ? 1 : 0;
219 }
220