1 /*
2 */
3 
4 #include "my_test.h"
5 
execute_direct(MYSQL * mysql)6 static int execute_direct(MYSQL *mysql)
7 {
8   int rc= 0;
9   long i= 0;
10   MYSQL_STMT *stmt;
11   MYSQL_BIND bind;
12   unsigned int param_count= 1;
13   MYSQL_RES *res= NULL;
14 
15   stmt= mysql_stmt_init(mysql);
16 
17   rc= mariadb_stmt_execute_direct(stmt, "DROP TABLE IF EXISTS t1", -1);
18   check_stmt_rc(rc, stmt);
19 
20   rc= mariadb_stmt_execute_direct(stmt, "SELECT 1", -1);
21   check_stmt_rc(rc, stmt);
22 
23   while (!mysql_stmt_fetch(stmt));
24 
25   rc= mariadb_stmt_execute_direct(stmt, "SELECT 1", -1);
26   check_stmt_rc(rc, stmt);
27 
28   rc= mariadb_stmt_execute_direct(stmt, "CREATE TABLE t1 (a int)", -1);
29   check_stmt_rc(rc, stmt);
30 
31   rc= mysql_query(mysql, "FLUSH TABLES");
32   check_mysql_rc(rc, mysql);
33 
34   memset(&bind, 0, sizeof(MYSQL_BIND));
35 
36   bind.buffer= &i;
37   bind.buffer_type= MYSQL_TYPE_LONG;
38   bind.buffer_length= sizeof(long);
39 
40   mysql_stmt_close(stmt);
41   stmt= mysql_stmt_init(mysql);
42   mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &param_count);
43 
44   rc= mysql_stmt_bind_param(stmt, &bind);
45   check_stmt_rc(rc, stmt);
46   rc= mariadb_stmt_execute_direct(stmt, "INSERT INTO t1 VALUES (?)", -1);
47   check_stmt_rc(rc, stmt);
48 
49   rc= mysql_query(mysql, "START TRANSACTION");
50   check_mysql_rc(rc, mysql);
51 
52   for (i=1; i < 1000; i++)
53   {
54     rc= mysql_stmt_execute(stmt);
55     check_stmt_rc(rc, stmt);
56   }
57   rc= mysql_stmt_close(stmt);
58   check_mysql_rc(rc, mysql);
59 
60   rc= mysql_query(mysql, "SELECT * FROM t1");
61   check_mysql_rc(rc, mysql);
62 
63   res= mysql_store_result(mysql);
64   FAIL_IF(mysql_num_rows(res) != 1000, "Expected 1000 rows");
65 
66   mysql_free_result(res);
67   rc= mysql_query(mysql, "COMMIT");
68   check_mysql_rc(rc, mysql);
69 
70   rc= mysql_query(mysql, "DROP TABLE t1");
71   check_mysql_rc(rc, mysql);
72 
73   return OK;
74 }
75 
execute_direct_example(MYSQL * mysql)76 static int execute_direct_example(MYSQL *mysql)
77 {
78   MYSQL_STMT *stmt= mysql_stmt_init(mysql);
79   MYSQL_BIND bind[2];
80   int intval= 1;
81   int param_count= 2;
82   int rc;
83   const char *strval= "execute_direct_example1";
84 
85   /* Direct execution without parameters */
86   rc= mariadb_stmt_execute_direct(stmt, "DROP TABLE IF EXISTS execute_direct", -1);
87   check_stmt_rc(rc, stmt);
88   rc= mariadb_stmt_execute_direct(stmt, "CREATE TABLE execute_direct (a int, b varchar(20))", -1);
89   rc= mysql_stmt_close(stmt);
90   stmt= mysql_stmt_init(mysql);
91   check_stmt_rc(rc, stmt);
92   memset(bind, 0, sizeof(MYSQL_BIND) * 2);
93   bind[0].buffer_type= MYSQL_TYPE_SHORT;
94   bind[0].buffer= &intval;
95   bind[1].buffer_type= MYSQL_TYPE_STRING;
96   bind[1].buffer= (char *)strval;
97   bind[1].buffer_length= (unsigned long)strlen(strval);
98 
99   /* set number of parameters */
100   rc= mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &param_count);
101   check_stmt_rc(rc, stmt);
102 
103   /* bind parameters */
104   rc= mysql_stmt_bind_param(stmt, bind);
105   check_stmt_rc(rc, stmt);
106 
107   rc= mariadb_stmt_execute_direct(stmt, "INSERT INTO execute_direct VALUES (?,?)", -1);
108   check_stmt_rc(rc, stmt);
109 
110   mysql_stmt_close(stmt);
111 
112   rc= mysql_query(mysql, "DROP TABLE execute_direct");
113   check_mysql_rc(rc, mysql);
114   return OK;
115 }
116 
conc_213(MYSQL * mysql)117 static int conc_213(MYSQL *mysql)
118 {
119   MYSQL_BIND bind;
120   unsigned int param_count= 1;
121   long id= 1234;
122   MYSQL_STMT *stmt;
123 
124   stmt = mysql_stmt_init(mysql);
125 
126   memset(&bind, '\0', sizeof(bind));
127 
128   bind.buffer_type = MYSQL_TYPE_LONG;
129   bind.buffer = (void *)&id;
130   bind.buffer_length = sizeof(long);
131 /*  bind.is_null = &is_null;
132   bind.length = &length;
133   bind.error = &error; */
134 
135   mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &param_count);
136   check_stmt_rc(mysql_stmt_bind_param(stmt, &bind), stmt);
137   check_stmt_rc(mariadb_stmt_execute_direct(stmt, "SELECT ?", -1), stmt);
138   check_stmt_rc(mysql_stmt_store_result(stmt), stmt);
139   check_stmt_rc(mysql_stmt_free_result(stmt), stmt);
140 
141   mysql_stmt_close(stmt);
142 
143   return OK;
144 }
145 
conc_212(MYSQL * mysql)146 static int conc_212(MYSQL *mysql)
147 {
148   MYSQL_STMT *stmt= mysql_stmt_init(mysql);
149   int rc;
150 
151   rc= mariadb_stmt_execute_direct(stmt, "SELECT 1, 2", -1);
152   check_stmt_rc(rc, stmt);
153   mysql_stmt_store_result(stmt);
154   mysql_stmt_free_result(stmt);
155 
156   rc= mariadb_stmt_execute_direct(stmt, "SELECT 1, 2", -1);
157   check_stmt_rc(rc, stmt);
158   mysql_stmt_store_result(stmt);
159   mysql_stmt_free_result(stmt);
160 
161   rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
162   check_mysql_rc(rc,mysql);
163 
164 
165   rc= mysql_stmt_close(stmt);
166 
167   return OK;
168 }
169 
conc_218(MYSQL * mysql)170 static int conc_218(MYSQL *mysql)
171 {
172   MYSQL_STMT *stmt= mysql_stmt_init(mysql);
173   MYSQL_BIND bind[2];
174   int id=1;
175   my_bool is_null= 0, error= 0;
176   unsigned int param_count= 1;
177 
178   memset(bind, 0, 2 * sizeof(MYSQL_BIND));
179   bind[0].buffer_type = MYSQL_TYPE_LONG;
180   bind[0].buffer = (void *)&id;
181   bind[0].buffer_length = 4;
182   bind[0].is_null = &is_null;
183   bind[0].error = &error;
184 
185   mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &param_count);
186   check_stmt_rc(mysql_stmt_bind_param(stmt, bind), stmt);
187   check_stmt_rc(mariadb_stmt_execute_direct(stmt, "SELECT ?", -1), stmt);
188   check_stmt_rc(mysql_stmt_store_result(stmt), stmt);
189 
190   check_stmt_rc(mysql_stmt_free_result(stmt), stmt);
191 
192   param_count= 1;
193   mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &param_count);
194   check_stmt_rc(mysql_stmt_bind_param(stmt, bind), stmt);
195   check_stmt_rc(mariadb_stmt_execute_direct(stmt, "SELECT ?", -1), stmt);
196   mysql_stmt_close(stmt);
197 
198   return OK;
199 }
200 
test_cursor(MYSQL * mysql)201 static int test_cursor(MYSQL *mysql)
202 {
203   int rc;
204   MYSQL_STMT *stmt;
205   unsigned long prefetch_rows= 1;
206   unsigned long cursor_type= CURSOR_TYPE_READ_ONLY;
207 
208   stmt= mysql_stmt_init(mysql);
209   rc= mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, &cursor_type);
210   check_stmt_rc(rc, stmt);
211   rc= mysql_stmt_attr_set(stmt, STMT_ATTR_PREFETCH_ROWS, &prefetch_rows);
212   check_stmt_rc(rc, stmt);
213   rc= mariadb_stmt_execute_direct(stmt, "SELECT 1 FROM DUAL UNION SELECT 2 FROM DUAL", -1);
214   check_stmt_rc(rc, stmt);
215   rc= mysql_stmt_fetch(stmt);
216   check_stmt_rc(rc, stmt);
217   rc= mariadb_stmt_execute_direct(stmt, "SELECT 1 FROM DUAL UNION SELECT 2 FROM DUAL", -1);
218   check_stmt_rc(rc, stmt);
219   mysql_stmt_close(stmt);
220   return OK;
221 }
222 
223 
224 struct my_tests_st my_tests[] = {
225   {"test_cursor", test_cursor, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
226   {"conc_218", conc_218, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
227   {"conc_212", conc_212, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
228   {"conc_213", conc_213, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
229   {"execute_direct", execute_direct, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
230   {"execute_direct_example", execute_direct_example, TEST_CONNECTION_DEFAULT, 0,  NULL,  NULL},
231   {NULL, NULL, 0, 0, NULL, NULL}
232 };
233 
234 
main(int argc,char ** argv)235 int main(int argc, char **argv)
236 {
237 
238   mysql_library_init(0,0,NULL);
239 
240   if (argc > 1)
241     get_options(argc, argv);
242 
243   get_envvars();
244 
245   run_tests(my_tests);
246 
247   mysql_server_end();
248   return(exit_status());
249 }
250