1 #include "common.h"
2 
3 #include <common/test_assert.h>
4 
5 static SQLINTEGER v_int_3;
6 static SQLLEN v_ind_3_1;
7 
8 static char v_char_3[21];
9 static SQLLEN v_ind_3_2;
10 
11 static int result = 0;
12 
13 static void
doFetch(int dir,int pos,int expected)14 doFetch(int dir, int pos, int expected)
15 {
16 	SQLRETURN RetCode;
17 
18 	RetCode = CHKFetchScroll(dir, pos, "SINo");
19 
20 	if (RetCode != SQL_NO_DATA)
21 		printf(">> fetch %2d %10d : %d [%s]\n", dir, pos, v_ind_3_1 ? (int) v_int_3 : -1, v_ind_3_2 ? v_char_3 : "null");
22 	else
23 		printf(">> fetch %2d %10d : no data found\n", dir, pos);
24 
25 	if (expected != (RetCode == SQL_NO_DATA ? -1 : v_int_3))
26 		result = 1;
27 }
28 
29 int
main(int argc,char ** argv)30 main(int argc, char **argv)
31 {
32 	odbc_use_version3 = 1;
33 	odbc_connect();
34 	odbc_check_cursor();
35 
36 	CHKSetConnectAttr(SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) SQL_AUTOCOMMIT_ON, SQL_IS_UINTEGER, "S");
37 
38 	odbc_command("create table #mytab1 (k int, c char(30))");
39 	odbc_command("insert into #mytab1 values (1,'aaa')");
40 	odbc_command("insert into #mytab1 values (2,'bbb')");
41 	odbc_command("insert into #mytab1 values (3,'ccc')");
42 
43 	odbc_reset_statement();
44 /*	CHKSetStmtAttr(SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_STATIC, 0, "S");	*/
45 	CHKSetStmtAttr(SQL_ATTR_CURSOR_SCROLLABLE, (SQLPOINTER) SQL_SCROLLABLE, SQL_IS_UINTEGER, "S");
46 
47 	CHKPrepare(T("select k, c from #mytab1 order by k"), SQL_NTS, "SI");
48 
49 	CHKBindCol(1, SQL_C_LONG, &v_int_3, 0, &v_ind_3_1, "S");
50 	CHKBindCol(2, SQL_C_CHAR, v_char_3, sizeof(v_char_3), &v_ind_3_2, "S");
51 
52 	CHKExecute("SI");
53 
54 	doFetch(SQL_FETCH_LAST, 0, 3);
55 	doFetch(SQL_FETCH_PRIOR, 0, 2);
56 	doFetch(SQL_FETCH_PRIOR, 0, 1);
57 	doFetch(SQL_FETCH_PRIOR, 0, -1);
58 	doFetch(SQL_FETCH_NEXT, 0, 1);
59 	doFetch(SQL_FETCH_NEXT, 0, 2);
60 	doFetch(SQL_FETCH_NEXT, 0, 3);
61 	doFetch(SQL_FETCH_NEXT, 0, -1);
62 	doFetch(SQL_FETCH_FIRST, 0, 1);
63 	doFetch(SQL_FETCH_NEXT, 0, 2);
64 	doFetch(SQL_FETCH_NEXT, 0, 3);
65 	doFetch(SQL_FETCH_ABSOLUTE, 3, 3);
66 	doFetch(SQL_FETCH_RELATIVE, -2, 1);
67 	doFetch(SQL_FETCH_RELATIVE, -2, -1);
68 	doFetch(SQL_FETCH_RELATIVE, 5, -1);
69 
70 	CHKCloseCursor("SI");
71 
72 	odbc_disconnect();
73 	return result;
74 }
75