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