/tests/mysql_client_test.c
C | 18448 lines | 13017 code | 4133 blank | 1298 comment | 1421 complexity | 0dc94f78e50517519d9da62efc6d9ba0 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
Large files files are truncated, but you can click here to view the full file
- /* Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 2 of the License.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
- /***************************************************************************
- This is a test sample to test the new features in MySQL client-server
- protocol
- Main author: venu ( venu@mysql.com )
- ***************************************************************************/
- /*
- XXX: PLEASE RUN THIS PROGRAM UNDER VALGRIND AND VERIFY THAT YOUR TEST
- DOESN'T CONTAIN WARNINGS/ERRORS BEFORE YOU PUSH.
- */
- /*
- The fw.c file includes all the mysql_client_test framework; this file
- contains only the actual tests, plus the list of test functions to call.
- */
- #include "mysql_client_fw.c"
- /* Query processing */
- static void client_query()
- {
- int rc;
- myheader("client_query");
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE t1("
- "id int primary key auto_increment, "
- "name varchar(20))");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE t1(id int, name varchar(20))");
- myquery_r(rc);
- rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('mysql')");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('monty')");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('venu')");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('deleted')");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO t1(name) VALUES('deleted')");
- myquery(rc);
- rc= mysql_query(mysql, "UPDATE t1 SET name= 'updated' "
- "WHERE name= 'deleted'");
- myquery(rc);
- rc= mysql_query(mysql, "UPDATE t1 SET id= 3 WHERE name= 'updated'");
- myquery_r(rc);
- myquery(mysql_query(mysql, "drop table t1"));
- }
- /* Store result processing */
- static void client_store_result()
- {
- MYSQL_RES *result;
- int rc;
- myheader("client_store_result");
- rc= mysql_query(mysql, "SELECT * FROM t1");
- myquery(rc);
- /* get the result */
- result= mysql_store_result(mysql);
- mytest(result);
- (void) my_process_result_set(result);
- mysql_free_result(result);
- }
- /* Fetch the results */
- static void client_use_result()
- {
- MYSQL_RES *result;
- int rc;
- myheader("client_use_result");
- rc= mysql_query(mysql, "SELECT * FROM t1");
- myquery(rc);
- /* get the result */
- result= mysql_use_result(mysql);
- mytest(result);
- (void) my_process_result_set(result);
- mysql_free_result(result);
- }
- /* Query processing */
- static void test_debug_example()
- {
- int rc;
- MYSQL_RES *result;
- myheader("test_debug_example");
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_debug_example");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE test_debug_example("
- "id INT PRIMARY KEY AUTO_INCREMENT, "
- "name VARCHAR(20), xxx INT)");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO test_debug_example (name) "
- "VALUES ('mysql')");
- myquery(rc);
- rc= mysql_query(mysql, "UPDATE test_debug_example SET name='updated' "
- "WHERE name='deleted'");
- myquery(rc);
- rc= mysql_query(mysql, "SELECT * FROM test_debug_example where name='mysql'");
- myquery(rc);
- result= mysql_use_result(mysql);
- mytest(result);
- (void) my_process_result_set(result);
- mysql_free_result(result);
- rc= mysql_query(mysql, "DROP TABLE test_debug_example");
- myquery(rc);
- }
- /* Test autocommit feature for BDB tables */
- static void test_tran_bdb()
- {
- MYSQL_RES *result;
- MYSQL_ROW row;
- int rc;
- myheader("test_tran_bdb");
- /* set AUTOCOMMIT to OFF */
- rc= mysql_autocommit(mysql, FALSE);
- myquery(rc);
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS my_demo_transaction");
- myquery(rc);
- /* create the table 'mytran_demo' of type BDB' or 'InnoDB' */
- rc= mysql_query(mysql, "CREATE TABLE my_demo_transaction( "
- "col1 int , col2 varchar(30)) ENGINE= BDB");
- myquery(rc);
- /* insert a row and commit the transaction */
- rc= mysql_query(mysql, "INSERT INTO my_demo_transaction VALUES(10, 'venu')");
- myquery(rc);
- rc= mysql_commit(mysql);
- myquery(rc);
- /* now insert the second row, and roll back the transaction */
- rc= mysql_query(mysql, "INSERT INTO my_demo_transaction VALUES(20, 'mysql')");
- myquery(rc);
- rc= mysql_rollback(mysql);
- myquery(rc);
- /* delete first row, and roll it back */
- rc= mysql_query(mysql, "DELETE FROM my_demo_transaction WHERE col1= 10");
- myquery(rc);
- rc= mysql_rollback(mysql);
- myquery(rc);
- /* test the results now, only one row should exist */
- rc= mysql_query(mysql, "SELECT * FROM my_demo_transaction");
- myquery(rc);
- /* get the result */
- result= mysql_store_result(mysql);
- mytest(result);
- (void) my_process_result_set(result);
- mysql_free_result(result);
- /* test the results now, only one row should exist */
- rc= mysql_query(mysql, "SELECT * FROM my_demo_transaction");
- myquery(rc);
- /* get the result */
- result= mysql_use_result(mysql);
- mytest(result);
- row= mysql_fetch_row(result);
- mytest(row);
- row= mysql_fetch_row(result);
- mytest_r(row);
- mysql_free_result(result);
- mysql_autocommit(mysql, TRUE);
- }
- /* Test autocommit feature for InnoDB tables */
- static void test_tran_innodb()
- {
- MYSQL_RES *result;
- MYSQL_ROW row;
- int rc;
- myheader("test_tran_innodb");
- /* set AUTOCOMMIT to OFF */
- rc= mysql_autocommit(mysql, FALSE);
- myquery(rc);
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS my_demo_transaction");
- myquery(rc);
- /* create the table 'mytran_demo' of type BDB' or 'InnoDB' */
- rc= mysql_query(mysql, "CREATE TABLE my_demo_transaction(col1 int, "
- "col2 varchar(30)) ENGINE= InnoDB");
- myquery(rc);
- /* insert a row and commit the transaction */
- rc= mysql_query(mysql, "INSERT INTO my_demo_transaction VALUES(10, 'venu')");
- myquery(rc);
- rc= mysql_commit(mysql);
- myquery(rc);
- /* now insert the second row, and roll back the transaction */
- rc= mysql_query(mysql, "INSERT INTO my_demo_transaction VALUES(20, 'mysql')");
- myquery(rc);
- rc= mysql_rollback(mysql);
- myquery(rc);
- /* delete first row, and roll it back */
- rc= mysql_query(mysql, "DELETE FROM my_demo_transaction WHERE col1= 10");
- myquery(rc);
- rc= mysql_rollback(mysql);
- myquery(rc);
- /* test the results now, only one row should exist */
- rc= mysql_query(mysql, "SELECT * FROM my_demo_transaction");
- myquery(rc);
- /* get the result */
- result= mysql_store_result(mysql);
- mytest(result);
- (void) my_process_result_set(result);
- mysql_free_result(result);
- /* test the results now, only one row should exist */
- rc= mysql_query(mysql, "SELECT * FROM my_demo_transaction");
- myquery(rc);
- /* get the result */
- result= mysql_use_result(mysql);
- mytest(result);
- row= mysql_fetch_row(result);
- mytest(row);
- row= mysql_fetch_row(result);
- mytest_r(row);
- mysql_free_result(result);
- mysql_autocommit(mysql, TRUE);
- }
- /* Test for BUG#7242 */
- static void test_prepare_insert_update()
- {
- MYSQL_STMT *stmt;
- int rc;
- int i;
- const char *testcase[]= {
- "CREATE TABLE t1 (a INT, b INT, c INT, UNIQUE (A), UNIQUE(B))",
- "INSERT t1 VALUES (1,2,10), (3,4,20)",
- "INSERT t1 VALUES (5,6,30), (7,4,40), (8,9,60) ON DUPLICATE KEY UPDATE c=c+100",
- "SELECT * FROM t1",
- "INSERT t1 SET a=5 ON DUPLICATE KEY UPDATE b=0",
- "SELECT * FROM t1",
- "INSERT t1 VALUES (2,1,11), (7,4,40) ON DUPLICATE KEY UPDATE c=c+VALUES(a)",
- NULL};
- const char **cur_query;
- myheader("test_prepare_insert_update");
-
- for (cur_query= testcase; *cur_query; cur_query++)
- {
- char query[MAX_TEST_QUERY_LENGTH];
- printf("\nRunning query: %s", *cur_query);
- strmov(query, *cur_query);
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 0);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- /* try the last query several times */
- if (!cur_query[1])
- {
- for (i=0; i < 3;i++)
- {
- printf("\nExecuting last statement again");
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- }
- }
- mysql_stmt_close(stmt);
- }
- rc= mysql_commit(mysql);
- myquery(rc);
- }
- /* Test simple prepares of all DML statements */
- static void test_prepare_simple()
- {
- MYSQL_STMT *stmt;
- int rc;
- char query[MAX_TEST_QUERY_LENGTH];
- myheader("test_prepare_simple");
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_prepare_simple");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE test_prepare_simple("
- "id int, name varchar(50))");
- myquery(rc);
- /* insert */
- strmov(query, "INSERT INTO test_prepare_simple VALUES(?, ?)");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 2);
- mysql_stmt_close(stmt);
- /* update */
- strmov(query, "UPDATE test_prepare_simple SET id=? "
- "WHERE id=? AND CONVERT(name USING utf8)= ?");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 3);
- mysql_stmt_close(stmt);
- /* delete */
- strmov(query, "DELETE FROM test_prepare_simple WHERE id=10");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 0);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- mysql_stmt_close(stmt);
- /* delete */
- strmov(query, "DELETE FROM test_prepare_simple WHERE id=?");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 1);
- mysql_stmt_close(stmt);
- /* select */
- strmov(query, "SELECT * FROM test_prepare_simple WHERE id=? "
- "AND CONVERT(name USING utf8)= ?");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 2);
- mysql_stmt_close(stmt);
- /* now fetch the results ..*/
- rc= mysql_commit(mysql);
- myquery(rc);
- }
- /************************************************************************/
- #define FILE_PATH_SIZE 4096
- char mct_log_file_path[FILE_PATH_SIZE];
- FILE *mct_log_file= NULL;
- void mct_start_logging(const char *test_case_name)
- {
- const char *tmp_dir= getenv("MYSQL_TMP_DIR");
- if (!tmp_dir)
- {
- printf("Warning: MYSQL_TMP_DIR is not set. Logging is disabled.\n");
- return;
- }
- if (mct_log_file)
- {
- printf("Warning: can not start logging for test case '%s' "
- "because log is already open\n",
- (const char *) test_case_name);
- return;
- }
- /*
- Path is: <tmp_dir>/<test_case_name>.out.log
- 10 is length of '/' + '.out.log' + \0
- */
- if (strlen(tmp_dir) + strlen(test_case_name) + 10 > FILE_PATH_SIZE)
- {
- printf("Warning: MYSQL_TMP_DIR is too long. Logging is disabled.\n");
- return;
- }
- my_snprintf(mct_log_file_path, FILE_PATH_SIZE,
- "%s/%s.out.log",
- (const char *) tmp_dir,
- (const char *) test_case_name);
- mct_log_file= my_fopen(mct_log_file_path, O_WRONLY | O_BINARY, MYF(MY_WME));
- if (!mct_log_file)
- {
- printf("Warning: can not open log file (%s): %s. Logging is disabled.\n",
- (const char *) mct_log_file_path,
- (const char *) strerror(errno));
- return;
- }
- }
- void mct_log(const char *format, ...)
- {
- va_list args;
- va_start(args, format);
- vprintf(format, args);
- va_end(args);
- if (mct_log_file)
- {
- va_list args;
- va_start(args, format);
- vfprintf(mct_log_file, format, args);
- va_end(args);
- }
- }
- void mct_close_log()
- {
- if (!mct_log_file)
- return;
- my_fclose(mct_log_file, MYF(0));
- mct_log_file= NULL;
- }
- #define WL4435_NUM_PARAMS 10
- #define WL4435_STRING_SIZE 30
- static void test_wl4435()
- {
- MYSQL_STMT *stmt;
- int rc;
- char query[MAX_TEST_QUERY_LENGTH];
- char str_data[20][WL4435_STRING_SIZE];
- double dbl_data[20];
- char dec_data[20][WL4435_STRING_SIZE];
- int int_data[20];
- ulong str_length= WL4435_STRING_SIZE;
- my_bool is_null;
- MYSQL_BIND ps_params[WL4435_NUM_PARAMS];
- int exec_counter;
- myheader("test_wl4435");
- mct_start_logging("test_wl4435");
- rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1");
- myquery(rc);
- rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p2");
- myquery(rc);
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
- myquery(rc);
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS t2");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE t1(a1 INT, a2 CHAR(32), "
- " a3 DOUBLE(4, 2), a4 DECIMAL(3, 1))");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE t2(b0 INT, b1 INT, b2 CHAR(32), "
- " b3 DOUBLE(4, 2), b4 DECIMAL(3, 1))");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO t1 VALUES"
- "(1, '11', 12.34, 56.7), "
- "(2, '12', 56.78, 90.1), "
- "(3, '13', 23.45, 67.8)");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO t2 VALUES"
- "(100, 10, '110', 70.70, 10.1), "
- "(200, 20, '120', 80.80, 20.2), "
- "(300, 30, '130', 90.90, 30.3)");
- myquery(rc);
- rc= mysql_query(mysql,
- "CREATE PROCEDURE p1("
- " IN v0 INT, "
- " OUT v_str_1 CHAR(32), "
- " OUT v_dbl_1 DOUBLE(4, 2), "
- " OUT v_dec_1 DECIMAL(6, 3), "
- " OUT v_int_1 INT, "
- " IN v1 INT, "
- " INOUT v_str_2 CHAR(64), "
- " INOUT v_dbl_2 DOUBLE(5, 3), "
- " INOUT v_dec_2 DECIMAL(7, 4), "
- " INOUT v_int_2 INT)"
- "BEGIN "
- " SET v0 = -1; "
- " SET v1 = -1; "
- " SET v_str_1 = 'test_1'; "
- " SET v_dbl_1 = 12.34; "
- " SET v_dec_1 = 567.891; "
- " SET v_int_1 = 2345; "
- " SET v_str_2 = 'test_2'; "
- " SET v_dbl_2 = 67.891; "
- " SET v_dec_2 = 234.6789; "
- " SET v_int_2 = 6789; "
- " SELECT * FROM t1; "
- " SELECT * FROM t2; "
- "END");
- myquery(rc);
- rc= mysql_query(mysql,
- "CREATE PROCEDURE p2("
- " IN i1 VARCHAR(255) CHARACTER SET koi8r, "
- " OUT o1 VARCHAR(255) CHARACTER SET cp1251, "
- " OUT o2 VARBINARY(255)) "
- "BEGIN "
- " SET o1 = i1; "
- " SET o2 = i1; "
- "END");
- myquery(rc);
- strmov(query, "CALL p1(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- /* Init PS-parameters. */
- bzero((char *) ps_params, sizeof (ps_params));
- /* - v0 -- INT */
- ps_params[0].buffer_type= MYSQL_TYPE_LONG;
- ps_params[0].buffer= (char *) &int_data[0];
- ps_params[0].length= 0;
- ps_params[0].is_null= 0;
- /* - v_str_1 -- CHAR(32) */
- ps_params[1].buffer_type= MYSQL_TYPE_STRING;
- ps_params[1].buffer= (char *) str_data[0];
- ps_params[1].buffer_length= WL4435_STRING_SIZE;
- ps_params[1].length= &str_length;
- ps_params[1].is_null= 0;
- /* - v_dbl_1 -- DOUBLE */
- ps_params[2].buffer_type= MYSQL_TYPE_DOUBLE;
- ps_params[2].buffer= (char *) &dbl_data[0];
- ps_params[2].length= 0;
- ps_params[2].is_null= 0;
- /* - v_dec_1 -- DECIMAL */
- ps_params[3].buffer_type= MYSQL_TYPE_NEWDECIMAL;
- ps_params[3].buffer= (char *) dec_data[0];
- ps_params[3].buffer_length= WL4435_STRING_SIZE;
- ps_params[3].length= 0;
- ps_params[3].is_null= 0;
- /* - v_int_1 -- INT */
- ps_params[4].buffer_type= MYSQL_TYPE_LONG;
- ps_params[4].buffer= (char *) &int_data[0];
- ps_params[4].length= 0;
- ps_params[4].is_null= 0;
- /* - v1 -- INT */
- ps_params[5].buffer_type= MYSQL_TYPE_LONG;
- ps_params[5].buffer= (char *) &int_data[0];
- ps_params[5].length= 0;
- ps_params[5].is_null= 0;
- /* - v_str_2 -- CHAR(32) */
- ps_params[6].buffer_type= MYSQL_TYPE_STRING;
- ps_params[6].buffer= (char *) str_data[0];
- ps_params[6].buffer_length= WL4435_STRING_SIZE;
- ps_params[6].length= &str_length;
- ps_params[6].is_null= 0;
- /* - v_dbl_2 -- DOUBLE */
- ps_params[7].buffer_type= MYSQL_TYPE_DOUBLE;
- ps_params[7].buffer= (char *) &dbl_data[0];
- ps_params[7].length= 0;
- ps_params[7].is_null= 0;
- /* - v_dec_2 -- DECIMAL */
- ps_params[8].buffer_type= MYSQL_TYPE_DECIMAL;
- ps_params[8].buffer= (char *) dec_data[0];
- ps_params[8].buffer_length= WL4435_STRING_SIZE;
- ps_params[8].length= 0;
- ps_params[8].is_null= 0;
- /* - v_int_2 -- INT */
- ps_params[9].buffer_type= MYSQL_TYPE_LONG;
- ps_params[9].buffer= (char *) &int_data[0];
- ps_params[9].length= 0;
- ps_params[9].is_null= 0;
- /* Bind parameters. */
- rc= mysql_stmt_bind_param(stmt, ps_params);
- /* Execute! */
- for (exec_counter= 0; exec_counter < 3; ++exec_counter)
- {
- int i;
- int num_fields;
- MYSQL_BIND *rs_bind;
- mct_log("\nexec_counter: %d\n", (int) exec_counter);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- while (1)
- {
- MYSQL_FIELD *fields;
- MYSQL_RES *rs_metadata= mysql_stmt_result_metadata(stmt);
- num_fields= mysql_stmt_field_count(stmt);
- fields= mysql_fetch_fields(rs_metadata);
- rs_bind= (MYSQL_BIND *) malloc(sizeof (MYSQL_BIND) * num_fields);
- bzero(rs_bind, sizeof (MYSQL_BIND) * num_fields);
- mct_log("num_fields: %d\n", (int) num_fields);
- for (i = 0; i < num_fields; ++i)
- {
- mct_log(" - %d: name: '%s'/'%s'; table: '%s'/'%s'; "
- "db: '%s'; catalog: '%s'; length: %d; max_length: %d; "
- "type: %d; decimals: %d\n",
- (int) i,
- (const char *) fields[i].name,
- (const char *) fields[i].org_name,
- (const char *) fields[i].table,
- (const char *) fields[i].org_table,
- (const char *) fields[i].db,
- (const char *) fields[i].catalog,
- (int) fields[i].length,
- (int) fields[i].max_length,
- (int) fields[i].type,
- (int) fields[i].decimals);
- rs_bind[i].buffer_type= fields[i].type;
- rs_bind[i].is_null= &is_null;
- switch (fields[i].type)
- {
- case MYSQL_TYPE_LONG:
- rs_bind[i].buffer= (char *) &(int_data[i]);
- rs_bind[i].buffer_length= sizeof (int_data);
- break;
- case MYSQL_TYPE_STRING:
- rs_bind[i].buffer= (char *) str_data[i];
- rs_bind[i].buffer_length= WL4435_STRING_SIZE;
- rs_bind[i].length= &str_length;
- break;
- case MYSQL_TYPE_DOUBLE:
- rs_bind[i].buffer= (char *) &dbl_data[i];
- rs_bind[i].buffer_length= sizeof (dbl_data);
- break;
- case MYSQL_TYPE_NEWDECIMAL:
- rs_bind[i].buffer= (char *) dec_data[i];
- rs_bind[i].buffer_length= WL4435_STRING_SIZE;
- rs_bind[i].length= &str_length;
- break;
- default:
- fprintf(stderr, "ERROR: unexpected type: %d.\n", fields[i].type);
- exit(1);
- }
- }
- rc= mysql_stmt_bind_result(stmt, rs_bind);
- check_execute(stmt, rc);
- mct_log("Data:\n");
- while (1)
- {
- int rc= mysql_stmt_fetch(stmt);
- if (rc == 1 || rc == MYSQL_NO_DATA)
- break;
- mct_log(" ");
- for (i = 0; i < num_fields; ++i)
- {
- switch (rs_bind[i].buffer_type)
- {
- case MYSQL_TYPE_LONG:
- mct_log(" int: %ld;",
- (long) *((int *) rs_bind[i].buffer));
- break;
- case MYSQL_TYPE_STRING:
- mct_log(" str: '%s';",
- (char *) rs_bind[i].buffer);
- break;
- case MYSQL_TYPE_DOUBLE:
- mct_log(" dbl: %lf;",
- (double) *((double *) rs_bind[i].buffer));
- break;
- case MYSQL_TYPE_NEWDECIMAL:
- mct_log(" dec: '%s';",
- (char *) rs_bind[i].buffer);
- break;
- default:
- printf(" unexpected type (%d)\n",
- rs_bind[i].buffer_type);
- }
- }
- mct_log("\n");
- }
- mct_log("EOF\n");
- rc= mysql_stmt_next_result(stmt);
- mct_log("mysql_stmt_next_result(): %d; field_count: %d\n",
- (int) rc, (int) mysql->field_count);
- free(rs_bind);
- mysql_free_result(rs_metadata);
- if (rc > 0)
- {
- printf("Error: %s (errno: %d)\n",
- mysql_stmt_error(stmt), mysql_stmt_errno(stmt));
- DIE(rc > 0);
- }
- if (rc)
- break;
- if (!mysql->field_count)
- {
- /* This is the last OK-packet. No more resultsets. */
- break;
- }
- }
- }
- mysql_stmt_close(stmt);
- mct_close_log();
- rc= mysql_commit(mysql);
- myquery(rc);
- /* i18n part of test case. */
- {
- const char *str_koi8r= "\xee\xd5\x2c\x20\xda\xc1\x20\xd2\xd9\xc2\xc1\xcc\xcb\xd5";
- const char *str_cp1251= "\xcd\xf3\x2c\x20\xe7\xe0\x20\xf0\xfb\xe1\xe0\xeb\xea\xf3";
- char o1_buffer[255];
- ulong o1_length;
- char o2_buffer[255];
- ulong o2_length;
- MYSQL_BIND rs_bind[2];
- strmov(query, "CALL p2(?, ?, ?)");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- /* Init PS-parameters. */
- bzero((char *) ps_params, sizeof (ps_params));
- ps_params[0].buffer_type= MYSQL_TYPE_STRING;
- ps_params[0].buffer= (char *) str_koi8r;
- ps_params[0].buffer_length= strlen(str_koi8r);
- ps_params[1].buffer_type= MYSQL_TYPE_STRING;
- ps_params[1].buffer= o1_buffer;
- ps_params[1].buffer_length= 0;
- ps_params[2].buffer_type= MYSQL_TYPE_STRING;
- ps_params[2].buffer= o2_buffer;
- ps_params[2].buffer_length= 0;
- /* Bind parameters. */
- rc= mysql_stmt_bind_param(stmt, ps_params);
- check_execute(stmt, rc);
- /* Prevent converting to character_set_results. */
- rc= mysql_query(mysql, "SET NAMES binary");
- myquery(rc);
- /* Execute statement. */
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- /* Bind result. */
- bzero(rs_bind, sizeof (rs_bind));
- rs_bind[0].buffer_type= MYSQL_TYPE_STRING;
- rs_bind[0].buffer= o1_buffer;
- rs_bind[0].buffer_length= sizeof (o1_buffer);
- rs_bind[0].length= &o1_length;
- rs_bind[1].buffer_type= MYSQL_TYPE_BLOB;
- rs_bind[1].buffer= o2_buffer;
- rs_bind[1].buffer_length= sizeof (o2_buffer);
- rs_bind[1].length= &o2_length;
- rc= mysql_stmt_bind_result(stmt, rs_bind);
- check_execute(stmt, rc);
- /* Fetch result. */
- rc= mysql_stmt_fetch(stmt);
- check_execute(stmt, rc);
- /* Check result. */
- DIE_UNLESS(o1_length == strlen(str_cp1251));
- DIE_UNLESS(o2_length == strlen(str_koi8r));
- DIE_UNLESS(!memcmp(o1_buffer, str_cp1251, o1_length));
- DIE_UNLESS(!memcmp(o2_buffer, str_koi8r, o2_length));
- rc= mysql_stmt_fetch(stmt);
- DIE_UNLESS(rc == MYSQL_NO_DATA);
- rc= mysql_stmt_next_result(stmt);
- DIE_UNLESS(rc == 0 && mysql->field_count == 0);
- mysql_stmt_close(stmt);
- rc= mysql_commit(mysql);
- myquery(rc);
- }
- }
- static void test_wl4435_2()
- {
- MYSQL_STMT *stmt;
- int i;
- int rc;
- char query[MAX_TEST_QUERY_LENGTH];
- myheader("test_wl4435_2");
- mct_start_logging("test_wl4435_2");
- /*
- Do a few iterations so that we catch any problem with incorrect
- handling/flushing prepared statement results.
- */
- for (i= 0; i < 10; ++i)
- {
- /*
- Prepare a procedure. That can be moved out of the loop, but it was
- left in the loop for the sake of having as many statements as
- possible.
- */
- rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1");
- myquery(rc);
- rc= mysql_query(mysql,
- "CREATE PROCEDURE p1()"
- "BEGIN "
- " SELECT 1; "
- " SELECT 2, 3 UNION SELECT 4, 5; "
- " SELECT 6, 7, 8; "
- "END");
- myquery(rc);
- /* Invoke a procedure, that returns several result sets. */
- strmov(query, "CALL p1()");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- /* Execute! */
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- /* Flush all the results. */
- mysql_stmt_close(stmt);
- /* Clean up. */
- rc= mysql_commit(mysql);
- myquery(rc);
- rc= mysql_query(mysql, "DROP PROCEDURE p1");
- myquery(rc);
- }
- }
- #define WL4435_TEST(sql_type, sql_value, \
- c_api_in_type, c_api_out_type, \
- c_type, c_type_ext, \
- printf_args, assert_condition) \
- \
- do { \
- int rc; \
- MYSQL_STMT *ps; \
- MYSQL_BIND psp; \
- MYSQL_RES *rs_metadata; \
- MYSQL_FIELD *fields; \
- c_type pspv c_type_ext; \
- my_bool psp_null; \
- \
- bzero(&pspv, sizeof (pspv)); \
- \
- rc= mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1"); \
- myquery(rc); \
- \
- rc= mysql_query(mysql, \
- "CREATE PROCEDURE p1(OUT v " sql_type ") SET v = " sql_value ";"); \
- myquery(rc); \
- \
- ps = mysql_simple_prepare(mysql, "CALL p1(?)"); \
- check_stmt(ps); \
- \
- bzero(&psp, sizeof (psp)); \
- psp.buffer_type= c_api_in_type; \
- psp.is_null= &psp_null; \
- psp.buffer= (char *) &pspv; \
- psp.buffer_length= sizeof (psp); \
- \
- rc= mysql_stmt_bind_param(ps, &psp); \
- check_execute(ps, rc); \
- \
- rc= mysql_stmt_execute(ps); \
- check_execute(ps, rc); \
- \
- DIE_UNLESS(mysql->server_status & SERVER_PS_OUT_PARAMS); \
- DIE_UNLESS(mysql_stmt_field_count(ps) == 1); \
- \
- rs_metadata= mysql_stmt_result_metadata(ps); \
- fields= mysql_fetch_fields(rs_metadata); \
- \
- rc= mysql_stmt_bind_result(ps, &psp); \
- check_execute(ps, rc); \
- \
- rc= mysql_stmt_fetch(ps); \
- DIE_UNLESS(rc == 0); \
- \
- DIE_UNLESS(fields[0].type == c_api_out_type); \
- printf printf_args; \
- printf("; in type: %d; out type: %d\n", \
- (int) c_api_in_type, (int) c_api_out_type); \
- \
- rc= mysql_stmt_fetch(ps); \
- DIE_UNLESS(rc == MYSQL_NO_DATA); \
- \
- rc= mysql_stmt_next_result(ps); \
- DIE_UNLESS(rc == 0); \
- \
- mysql_stmt_free_result(ps); \
- mysql_stmt_close(ps); \
- \
- DIE_UNLESS(assert_condition); \
- \
- } while (0)
- static void test_wl4435_3()
- {
- char tmp[255];
- puts("");
- // The following types are not supported:
- // - ENUM
- // - SET
- //
- // The following types are supported but can not be used for
- // OUT-parameters:
- // - MEDIUMINT;
- // - BIT(..);
- //
- // The problem is that those types are not supported for IN-parameters,
- // and OUT-parameters should be bound as IN-parameters before execution.
- //
- // The following types should not be used:
- // - MYSQL_TYPE_YEAR (use MYSQL_TYPE_SHORT instead);
- // - MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_LONG_BLOB
- // (use MYSQL_TYPE_BLOB instead);
- WL4435_TEST("TINYINT", "127",
- MYSQL_TYPE_TINY, MYSQL_TYPE_TINY,
- char, ,
- (" - TINYINT / char / MYSQL_TYPE_TINY:\t\t\t %d", (int) pspv),
- pspv == 127);
- WL4435_TEST("SMALLINT", "32767",
- MYSQL_TYPE_SHORT, MYSQL_TYPE_SHORT,
- short, ,
- (" - SMALLINT / short / MYSQL_TYPE_SHORT:\t\t %d", (int) pspv),
- pspv == 32767);
- WL4435_TEST("INT", "2147483647",
- MYSQL_TYPE_LONG, MYSQL_TYPE_LONG,
- int, ,
- (" - INT / int / MYSQL_TYPE_LONG:\t\t\t %d", pspv),
- pspv == 2147483647l);
- WL4435_TEST("BIGINT", "9223372036854775807",
- MYSQL_TYPE_LONGLONG, MYSQL_TYPE_LONGLONG,
- long long, ,
- (" - BIGINT / long long / MYSQL_TYPE_LONGLONG:\t\t %lld", pspv),
- pspv == 9223372036854775807ll);
- WL4435_TEST("TIMESTAMP", "'2007-11-18 15:01:02'",
- MYSQL_TYPE_TIMESTAMP, MYSQL_TYPE_TIMESTAMP,
- MYSQL_TIME, ,
- (" - TIMESTAMP / MYSQL_TIME / MYSQL_TYPE_TIMESTAMP:\t "
- "%.4d-%.2d-%.2d %.2d:%.2d:%.2d",
- (int) pspv.year, (int) pspv.month, (int) pspv.day,
- (int) pspv.hour, (int) pspv.minute, (int) pspv.second),
- pspv.year == 2007 && pspv.month == 11 && pspv.day == 18 &&
- pspv.hour == 15 && pspv.minute == 1 && pspv.second == 2);
- WL4435_TEST("DATETIME", "'1234-11-12 12:34:59'",
- MYSQL_TYPE_DATETIME, MYSQL_TYPE_DATETIME,
- MYSQL_TIME, ,
- (" - DATETIME / MYSQL_TIME / MYSQL_TYPE_DATETIME:\t "
- "%.4d-%.2d-%.2d %.2d:%.2d:%.2d",
- (int) pspv.year, (int) pspv.month, (int) pspv.day,
- (int) pspv.hour, (int) pspv.minute, (int) pspv.second),
- pspv.year == 1234 && pspv.month == 11 && pspv.day == 12 &&
- pspv.hour == 12 && pspv.minute == 34 && pspv.second == 59);
- WL4435_TEST("TIME", "'123:45:01'",
- MYSQL_TYPE_TIME, MYSQL_TYPE_TIME,
- MYSQL_TIME, ,
- (" - TIME / MYSQL_TIME / MYSQL_TYPE_TIME:\t\t "
- "%.3d:%.2d:%.2d",
- (int) pspv.hour, (int) pspv.minute, (int) pspv.second),
- pspv.hour == 123 && pspv.minute == 45 && pspv.second == 1);
- WL4435_TEST("DATE", "'1234-11-12'",
- MYSQL_TYPE_DATE, MYSQL_TYPE_DATE,
- MYSQL_TIME, ,
- (" - DATE / MYSQL_TIME / MYSQL_TYPE_DATE:\t\t "
- "%.4d-%.2d-%.2d",
- (int) pspv.year, (int) pspv.month, (int) pspv.day),
- pspv.year == 1234 && pspv.month == 11 && pspv.day == 12);
- WL4435_TEST("YEAR", "'2010'",
- MYSQL_TYPE_SHORT, MYSQL_TYPE_YEAR,
- short, ,
- (" - YEAR / short / MYSQL_TYPE_SHORT:\t\t\t %.4d", (int) pspv),
- pspv == 2010);
- WL4435_TEST("FLOAT(7, 4)", "123.4567",
- MYSQL_TYPE_FLOAT, MYSQL_TYPE_FLOAT,
- float, ,
- (" - FLOAT / float / MYSQL_TYPE_FLOAT:\t\t\t %g", (double) pspv),
- pspv - 123.4567 < 0.0001);
- WL4435_TEST("DOUBLE(8, 5)", "123.45678",
- MYSQL_TYPE_DOUBLE, MYSQL_TYPE_DOUBLE,
- double, ,
- (" - DOUBLE / double / MYSQL_TYPE_DOUBLE:\t\t %g", (double) pspv),
- pspv - 123.45678 < 0.00001);
- WL4435_TEST("DECIMAL(9, 6)", "123.456789",
- MYSQL_TYPE_NEWDECIMAL, MYSQL_TYPE_NEWDECIMAL,
- char, [255],
- (" - DECIMAL / char[] / MYSQL_TYPE_NEWDECIMAL:\t\t '%s'", (char *) pspv),
- !strcmp(pspv, "123.456789"));
- WL4435_TEST("CHAR(32)", "REPEAT('C', 16)",
- MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
- char, [255],
- (" - CHAR(32) / char[] / MYSQL_TYPE_STRING:\t\t '%s'", (char *) pspv),
- !strcmp(pspv, "CCCCCCCCCCCCCCCC"));
- WL4435_TEST("VARCHAR(32)", "REPEAT('V', 16)",
- MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_VAR_STRING,
- char, [255],
- (" - VARCHAR(32) / char[] / MYSQL_TYPE_VAR_STRING:\t '%s'", (char *) pspv),
- !strcmp(pspv, "VVVVVVVVVVVVVVVV"));
- WL4435_TEST("TINYTEXT", "REPEAT('t', 16)",
- MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_BLOB,
- char, [255],
- (" - TINYTEXT / char[] / MYSQL_TYPE_TINY_BLOB:\t\t '%s'", (char *) pspv),
- !strcmp(pspv, "tttttttttttttttt"));
- WL4435_TEST("TEXT", "REPEAT('t', 16)",
- MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
- char, [255],
- (" - TEXT / char[] / MYSQL_TYPE_BLOB:\t\t\t '%s'", (char *) pspv),
- !strcmp(pspv, "tttttttttttttttt"));
- WL4435_TEST("MEDIUMTEXT", "REPEAT('t', 16)",
- MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_BLOB,
- char, [255],
- (" - MEDIUMTEXT / char[] / MYSQL_TYPE_MEDIUM_BLOB:\t '%s'", (char *) pspv),
- !strcmp(pspv, "tttttttttttttttt"));
- WL4435_TEST("LONGTEXT", "REPEAT('t', 16)",
- MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB,
- char, [255],
- (" - LONGTEXT / char[] / MYSQL_TYPE_LONG_BLOB:\t\t '%s'", (char *) pspv),
- !strcmp(pspv, "tttttttttttttttt"));
- WL4435_TEST("BINARY(32)", "REPEAT('\1', 16)",
- MYSQL_TYPE_STRING, MYSQL_TYPE_STRING,
- char, [255],
- (" - BINARY(32) / char[] / MYSQL_TYPE_STRING:\t\t '%s'", (char *) pspv),
- memset(tmp, 1, 16) && !memcmp(tmp, pspv, 16));
- WL4435_TEST("VARBINARY(32)", "REPEAT('\1', 16)",
- MYSQL_TYPE_VAR_STRING, MYSQL_TYPE_VAR_STRING,
- char, [255],
- (" - VARBINARY(32) / char[] / MYSQL_TYPE_VAR_STRING:\t '%s'", (char *) pspv),
- memset(tmp, 1, 16) && !memcmp(tmp, pspv, 16));
- WL4435_TEST("TINYBLOB", "REPEAT('\2', 16)",
- MYSQL_TYPE_TINY_BLOB, MYSQL_TYPE_BLOB,
- char, [255],
- (" - TINYBLOB / char[] / MYSQL_TYPE_TINY_BLOB:\t\t '%s'", (char *) pspv),
- memset(tmp, 2, 16) && !memcmp(tmp, pspv, 16));
- WL4435_TEST("BLOB", "REPEAT('\2', 16)",
- MYSQL_TYPE_BLOB, MYSQL_TYPE_BLOB,
- char, [255],
- (" - BLOB / char[] / MYSQL_TYPE_BLOB:\t\t\t '%s'", (char *) pspv),
- memset(tmp, 2, 16) && !memcmp(tmp, pspv, 16));
- WL4435_TEST("MEDIUMBLOB", "REPEAT('\2', 16)",
- MYSQL_TYPE_MEDIUM_BLOB, MYSQL_TYPE_BLOB,
- char, [255],
- (" - MEDIUMBLOB / char[] / MYSQL_TYPE_MEDIUM_BLOB:\t '%s'", (char *) pspv),
- memset(tmp, 2, 16) && !memcmp(tmp, pspv, 16));
- WL4435_TEST("LONGBLOB", "REPEAT('\2', 16)",
- MYSQL_TYPE_LONG_BLOB, MYSQL_TYPE_BLOB,
- char, [255],
- (" - LONGBLOB / char[] / MYSQL_TYPE_LONG_BLOB:\t\t '%s'", (char *) pspv),
- memset(tmp, 2, 16) && !memcmp(tmp, pspv, 16));
- }
- /* Test simple prepare field results */
- static void test_prepare_field_result()
- {
- MYSQL_STMT *stmt;
- MYSQL_RES *result;
- int rc;
- char query[MAX_TEST_QUERY_LENGTH];
- myheader("test_prepare_field_result");
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_prepare_field_result");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE test_prepare_field_result(int_c int, "
- "var_c varchar(50), ts_c timestamp, "
- "char_c char(4), date_c date, extra tinyint)");
- myquery(rc);
- /* insert */
- strmov(query, "SELECT int_c, var_c, date_c as date, ts_c, char_c FROM "
- " test_prepare_field_result as t1 WHERE int_c=?");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 1);
- result= mysql_stmt_result_metadata(stmt);
- mytest(result);
- my_print_result_metadata(result);
- if (!opt_silent)
- fprintf(stdout, "\n\n field attributes:\n");
- verify_prepare_field(result, 0, "int_c", "int_c", MYSQL_TYPE_LONG,
- "t1", "test_prepare_field_result", current_db, 11, 0);
- verify_prepare_field(result, 1, "var_c", "var_c", MYSQL_TYPE_VAR_STRING,
- "t1", "test_prepare_field_result", current_db, 50, 0);
- verify_prepare_field(result, 2, "date", "date_c", MYSQL_TYPE_DATE,
- "t1", "test_prepare_field_result", current_db, 10, 0);
- verify_prepare_field(result, 3, "ts_c", "ts_c", MYSQL_TYPE_TIMESTAMP,
- "t1", "test_prepare_field_result", current_db, 19, 0);
- verify_prepare_field(result, 4, "char_c", "char_c",
- (mysql_get_server_version(mysql) <= 50000 ?
- MYSQL_TYPE_VAR_STRING : MYSQL_TYPE_STRING),
- "t1", "test_prepare_field_result", current_db, 4, 0);
- verify_field_count(result, 5);
- mysql_free_result(result);
- mysql_stmt_close(stmt);
- }
- /* Test simple prepare field results */
- static void test_prepare_syntax()
- {
- MYSQL_STMT *stmt;
- int rc;
- char query[MAX_TEST_QUERY_LENGTH];
- myheader("test_prepare_syntax");
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_prepare_syntax");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE test_prepare_syntax("
- "id int, name varchar(50), extra int)");
- myquery(rc);
- strmov(query, "INSERT INTO test_prepare_syntax VALUES(?");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt_r(stmt);
- strmov(query, "SELECT id, name FROM test_prepare_syntax WHERE id=? AND WHERE");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt_r(stmt);
- /* now fetch the results ..*/
- rc= mysql_commit(mysql);
- myquery(rc);
- }
- /* Test a simple prepare */
- static void test_prepare()
- {
- MYSQL_STMT *stmt;
- int rc, i;
- int int_data, o_int_data;
- char str_data[50], data[50];
- char tiny_data, o_tiny_data;
- short small_data, o_small_data;
- longlong big_data, o_big_data;
- float real_data, o_real_data;
- double double_data, o_double_data;
- ulong length[7], len;
- my_bool is_null[7];
- char llbuf[22];
- MYSQL_BIND my_bind[7];
- char query[MAX_TEST_QUERY_LENGTH];
- myheader("test_prepare");
- rc= mysql_autocommit(mysql, TRUE);
- myquery(rc);
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS my_prepare");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE my_prepare(col1 tinyint, "
- "col2 varchar(15), col3 int, "
- "col4 smallint, col5 bigint, "
- "col6 float, col7 double )");
- myquery(rc);
- /* insert by prepare */
- strxmov(query, "INSERT INTO my_prepare VALUES(?, ?, ?, ?, ?, ?, ?)", NullS);
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 7);
- bzero((char*) my_bind, sizeof(my_bind));
- /* tinyint */
- my_bind[0].buffer_type= MYSQL_TYPE_TINY;
- my_bind[0].buffer= (void *)&tiny_data;
- /* string */
- my_bind[1].buffer_type= MYSQL_TYPE_STRING;
- my_bind[1].buffer= (void *)str_data;
- my_bind[1].buffer_length= 1000; /* Max string length */
- /* integer */
- my_bind[2].buffer_type= MYSQL_TYPE_LONG;
- my_bind[2].buffer= (void *)&int_data;
- /* short */
- my_bind[3].buffer_type= MYSQL_TYPE_SHORT;
- my_bind[3].buffer= (void *)&small_data;
- /* bigint */
- my_bind[4].buffer_type= MYSQL_TYPE_LONGLONG;
- my_bind[4].buffer= (void *)&big_data;
- /* float */
- my_bind[5].buffer_type= MYSQL_TYPE_FLOAT;
- my_bind[5].buffer= (void *)&real_data;
- /* double */
- my_bind[6].buffer_type= MYSQL_TYPE_DOUBLE;
- my_bind[6].buffer= (void *)&double_data;
- for (i= 0; i < (int) array_elements(my_bind); i++)
- {
- my_bind[i].length= &length[i];
- my_bind[i].is_null= &is_null[i];
- is_null[i]= 0;
- }
- rc= mysql_stmt_bind_param(stmt, my_bind);
- check_execute(stmt, rc);
- int_data= 320;
- small_data= 1867;
- big_data= 1000;
- real_data= 2;
- double_data= 6578.001;
- /* now, execute the prepared statement to insert 10 records.. */
- for (tiny_data= 0; tiny_data < 100; tiny_data++)
- {
- length[1]= sprintf(str_data, "MySQL%d", int_data);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- int_data += 25;
- small_data += 10;
- big_data += 100;
- real_data += 1;
- double_data += 10.09;
- }
- mysql_stmt_close(stmt);
- /* now fetch the results ..*/
- rc= mysql_commit(mysql);
- myquery(rc);
- /* test the results now, only one row should exist */
- rc= my_stmt_result("SELECT * FROM my_prepare");
- DIE_UNLESS(tiny_data == (char) rc);
- stmt= mysql_simple_prepare(mysql, "SELECT * FROM my_prepare");
- check_stmt(stmt);
- rc= mysql_stmt_bind_result(stmt, my_bind);
- check_execute(stmt, rc);
- /* get the result */
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- o_int_data= 320;
- o_small_data= 1867;
- o_big_data= 1000;
- o_real_data= 2;
- o_double_data= 6578.001;
- /* now, execute the prepared statement to insert 10 records.. */
- for (o_tiny_data= 0; o_tiny_data < 100; o_tiny_data++)
- {
- len= sprintf(data, "MySQL%d", o_int_data);
- rc= mysql_stmt_fetch(stmt);
- check_execute(stmt, rc);
- if (!opt_silent)
- {
- fprintf(stdout, "\n");
- fprintf(stdout, "\n\t tiny : %d (%lu)", tiny_data, length[0]);
- fprintf(stdout, "\n\t short : %d (%lu)", small_data, length[3]);
- fprintf(stdout, "\n\t int : %d (%lu)", int_data, length[2]);
- fprintf(stdout, "\n\t big : %s (%lu)", llstr(big_data, llbuf),
- length[4]);
- fprintf(stdout, "\n\t float : %f (%lu)", real_data, length[5]);
- fprintf(stdout, "\n\t double : %f (%lu)", double_data, length[6]);
- fprintf(stdout, "\n\t str : %s (%lu)", str_data, length[1]);
- }
- DIE_UNLESS(tiny_data == o_tiny_data);
- DIE_UNLESS(is_null[0] == 0);
- DIE_UNLESS(length[0] == 1);
- DIE_UNLESS(int_data == o_int_data);
- DIE_UNLESS(length[2] == 4);
- DIE_UNLESS(small_data == o_small_data);
- DIE_UNLESS(length[3] == 2);
- DIE_UNLESS(big_data == o_big_data);
- DIE_UNLESS(length[4] == 8);
- DIE_UNLESS(real_data == o_real_data);
- DIE_UNLESS(length[5] == 4);
- DIE_UNLESS(cmp_double(&double_data, &o_double_data));
- DIE_UNLESS(length[6] == 8);
- DIE_UNLESS(strcmp(data, str_data) == 0);
- DIE_UNLESS(length[1] == len);
- o_int_data += 25;
- o_small_data += 10;
- o_big_data += 100;
- o_real_data += 1;
- o_double_data += 10.09;
- }
- rc= mysql_stmt_fetch(stmt);
- DIE_UNLESS(rc == MYSQL_NO_DATA);
- mysql_stmt_close(stmt);
- }
- /* Test double comparision */
- static void test_double_compare()
- {
- MYSQL_STMT *stmt;
- int rc;
- char real_data[10], tiny_data;
- double double_data;
- MYSQL_RES *result;
- MYSQL_BIND my_bind[3];
- ulong length[3];
- char query[MAX_TEST_QUERY_LENGTH];
- myheader("test_double_compare");
- rc= mysql_autocommit(mysql, TRUE);
- myquery(rc);
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_double_compare");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE test_double_compare(col1 tinyint, "
- " col2 float, col3 double )");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO test_double_compare "
- "VALUES (1, 10.2, 34.5)");
- myquery(rc);
- strmov(query, "UPDATE test_double_compare SET col1=100 "
- "WHERE col1 = ? AND col2 = ? AND COL3 = ?");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 3);
- /* Always bzero bind array because there can be internal members */
- bzero((char*) my_bind, sizeof(my_bind));
- /* tinyint */
- my_bind[0].buffer_type= MYSQL_TYPE_TINY;
- my_bind[0].buffer= (void *)&tiny_data;
- /* string->float */
- my_bind[1].buffer_type= MYSQL_TYPE_STRING;
- my_bind[1].buffer= (void *)&real_data;
- my_bind[1].buffer_length= sizeof(real_data);
- my_bind[1].length= &length[1];
- length[1]= 10;
- /* double */
- my_bind[2].buffer_type= MYSQL_TYPE_DOUBLE;
- my_bind[2].buffer= (void *)&double_data;
- tiny_data= 1;
- strmov(real_data, "10.2");
- double_data= 34.5;
- rc= mysql_stmt_bind_param(stmt, my_bind);
- check_execute(stmt, rc);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- verify_affected_rows(0);
- mysql_stmt_close(stmt);
- /* now fetch the results ..*/
- rc= mysql_commit(mysql);
- myquery(rc);
- /* test the results now, only one row should exist */
- rc= mysql_query(mysql, "SELECT * FROM test_double_compare");
- myquery(rc);
- /* get the result */
- result= mysql_store_result(mysql);
- mytest(result);
- rc= my_process_result_set(result);
- DIE_UNLESS((int)tiny_data == rc);
- mysql_free_result(result);
- }
- /* Test simple null */
- static void test_null()
- {
- MYSQL_STMT *stmt;
- int rc;
- uint nData;
- MYSQL_BIND my_bind[2];
- my_bool is_null[2];
- char query[MAX_TEST_QUERY_LENGTH];
- myheader("test_null");
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_null");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE test_null(col1 int, col2 varchar(50))");
- myquery(rc);
- /* insert by prepare, wrong column name */
- strmov(query, "INSERT INTO test_null(col3, col2) VALUES(?, ?)");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt_r(stmt);
- strmov(query, "INSERT INTO test_null(col1, col2) VALUES(?, ?)");
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 2);
- /* Always bzero all members of bind parameter */
- bzero((char*) my_bind, sizeof(my_bind));
- my_bind[0].buffer_type= MYSQL_TYPE_LONG;
- my_bind[0].is_null= &is_null[0];
- is_null[0]= 1;
- my_bind[1]= my_bind[0];
- rc= mysql_stmt_bind_param(stmt, my_bind);
- check_execute(stmt, rc);
- /* now, execute the prepared statement to insert 10 records.. */
- for (nData= 0; nData<10; nData++)
- {
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- }
- /* Re-bind with MYSQL_TYPE_NULL */
- my_bind[0].buffer_type= MYSQL_TYPE_NULL;
- is_null[0]= 0; /* reset */
- my_bind[1]= my_bind[0];
- rc= mysql_stmt_bind_param(stmt, my_bind);
- check_execute(stmt, rc);
- for (nData= 0; nData<10; nData++)
- {
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- }
- mysql_stmt_close(stmt);
- /* now fetch the results ..*/
- rc= mysql_commit(mysql);
- myquery(rc);
- nData*= 2;
- rc= my_stmt_result("SELECT * FROM test_null");;
- DIE_UNLESS((int) nData == rc);
- /* Fetch results */
- my_bind[0].buffer_type= MYSQL_TYPE_LONG;
- my_bind[0].buffer= (void *)&nData; /* this buffer won't be altered */
- my_bind[0].length= 0;
- my_bind[1]= my_bind[0];
- my_bind[0].is_null= &is_null[0];
- my_bind[1].is_null= &is_null[1];
- stmt= mysql_simple_prepare(mysql, "SELECT * FROM test_null");
- check_stmt(stmt);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- rc= mysql_stmt_bind_result(stmt, my_bind);
- check_execute(stmt, rc);
- rc= 0;
- is_null[0]= is_null[1]= 0;
- while (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA)
- {
- DIE_UNLESS(is_null[0]);
- DIE_UNLESS(is_null[1]);
- rc++;
- is_null[0]= is_null[1]= 0;
- }
- DIE_UNLESS(rc == (int) nData);
- mysql_stmt_close(stmt);
- }
- /* Test for NULL as PS parameter (BUG#3367, BUG#3371) */
- static void test_ps_null_param()
- {
- MYSQL_STMT *stmt;
- int rc;
- MYSQL_BIND in_bind;
- my_bool in_is_null;
- long int in_long;
- MYSQL_BIND out_bind;
- ulong out_length;
- my_bool out_is_null;
- char out_str_data[20];
- const char *queries[]= {"select ?", "select ?+1",
- "select col1 from test_ps_nulls where col1 <=> ?",
- NULL
- };
- const char **cur_query= queries;
- myheader("test_null_ps_param_in_result");
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_ps_nulls");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE test_ps_nulls(col1 int)");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO test_ps_nulls values (1), (null)");
- myquery(rc);
- /* Always bzero all members of bind parameter */
- bzero((char*) &in_bind, sizeof(in_bind));
- bzero((char*) &out_bind, sizeof(out_bind));
- in_bind.buffer_type= MYSQL_TYPE_LONG;
- in_bind.is_null= &in_is_null;
- in_bind.length= 0;
- in_bind.buffer= (void *)&in_long;
- in_is_null= 1;
- in_long= 1;
- out_bind.buffer_type= MYSQL_TYPE_STRING;
- out_bind.is_null= &out_is_null;
- out_bind.length= &out_length;
- out_bind.buffer= out_str_data;
- out_bind.buffer_length= array_elements(out_str_data);
- /* Execute several queries, all returning NULL in result. */
- for(cur_query= queries; *cur_query; cur_query++)
- {
- char query[MAX_TEST_QUERY_LENGTH];
- strmov(query, *cur_query);
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- verify_param_count(stmt, 1);
- rc= mysql_stmt_bind_param(stmt, &in_bind);
- check_execute(stmt, rc);
- rc= mysql_stmt_bind_result(stmt, &out_bind);
- check_execute(stmt, rc);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- rc= mysql_stmt_fetch(stmt);
- DIE_UNLESS(rc != MYSQL_NO_DATA);
- DIE_UNLESS(out_is_null);
- rc= mysql_stmt_fetch(stmt);
- DIE_UNLESS(rc == MYSQL_NO_DATA);
- mysql_stmt_close(stmt);
- }
- }
- /* Test fetch null */
- static void test_fetch_null()
- {
- MYSQL_STMT *stmt;
- int rc;
- int i, nData;
- MYSQL_BIND my_bind[11];
- ulong length[11];
- my_bool is_null[11];
- char query[MAX_TEST_QUERY_LENGTH];
- myheader("test_fetch_null");
- rc= mysql_query(mysql, "DROP TABLE IF EXISTS test_fetch_null");
- myquery(rc);
- rc= mysql_query(mysql, "CREATE TABLE test_fetch_null("
- " col1 tinyint, col2 smallint, "
- " col3 int, col4 bigint, "
- " col5 float, col6 double, "
- " col7 date, col8 time, "
- " col9 varbinary(10), "
- " col10 varchar(50), "
- " col11 char(20))");
- myquery(rc);
- rc= mysql_query(mysql, "INSERT INTO test_fetch_null (col11) "
- "VALUES (1000), (88), (389789)");
- myquery(rc);
- rc= mysql_commit(mysql);
- myquery(rc);
- /* fetch */
- bzero((char*) my_bind, sizeof(my_bind));
- for (i= 0; i < (int) array_elements(my_bind); i++)
- {
- my_bind[i].buffer_type= MYSQL_TYPE_LONG;
- my_bind[i].is_null= &is_null[i];
- my_bind[i].length= &length[i];
- }
- my_bind[i-1].buffer= (void *)&nData; /* Last column is not null */
- strmov((char *)query , "SELECT * FROM test_fetch_null");
- rc= my_stmt_result(query);
- DIE_UNLESS(rc == 3);
- stmt= mysql_simple_prepare(mysql, query);
- check_stmt(stmt);
- rc= mysql_stmt_bind_result(stmt, my_bind);
- check_execute(stmt, rc);
- rc= mysql_stmt_execute(stmt);
- check_execute(stmt, rc);
- rc= 0;
- while (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA)
- {
- rc++;
- for (i= 0; i < 10; i++)
- {
- if (!opt_silent)
- fprintf(stdout, "\n data[%d] : %s", i,
- is_null[i] ? "NULL" : "NOT NULL");
- DIE_UNLESS(is_null[i]);
- }
- if (!opt_silent)
- …
Large files files are truncated, but you can click here to view the full file