// This cpp file is a generated trace that consists of the following "sections": // // - Connection parameters for mysql_real_connect: // - Helper functions // - The actual trace (marked by ****** Begin/End of trace ******) // - Functions to create and populate the necessary tables // - A dump of the current mysql variables // This cpp file should be compilable with: // gcc -g -I ${MYSQL_DIR}/include ${THIS_FILE} ${MYSQL_DIR}/lib/libmysqlclient.a -lm -lz -lstdc++ // To replay the trace you should have a database "baan", or you can change the // DB_NAME variable below. // You should also have two users: bsp/bsp, who has SELECT, INSERT, UPDATE, DELETE // privileges on all objects and baan/baan (the owner), who has ALL PRIVILEGES. // You may choose to use other users/passwords by changing the USER_*/OWNER_* // variables below. // You can connect to MySQL through TCP/IP by setting the HOST_NAME variable, or // you can use sockets by setting HOST_NAME to NULL and setting the right UNIX_SOCKET. // // The trace replays successfully if the program silently terminates with exit status 0. #include #include #include #include #include // Connection parameters const char *HOST_NAME = "localhost"; const char *USER_NAME = "root"; const char *USER_PWD = ""; const char *DB_NAME = "test"; const char *UNIX_SOCKET = NULL; // For ddl statements we use a different user/pwd const char *OWNER_NAME = NULL; const char *OWNER_PWD = NULL; // use "#define ASSERT_EQ (void)" to disable data validation #define ASSERT(C) assert(C) #define ASSERT_EQ(X,Y) assert( check_eq(X,Y) ) #define ASSERT_EQ_DATETIME(X,Y,M,D,h,m,s) assert( check_eq_datetime(X,Y,M,D,h,m,s) ) #include "mysql.h" void create_tables(void); // Global variables const char *stmt_text; int mysql_ret; int count; int mysql_err; MYSQL_TIME mysql_time; MYSQL_RES *mysql_result; MYSQL_ROW mysql_row; const unsigned long select_cursor = CURSOR_TYPE_READ_ONLY; const unsigned long update_cursor = CURSOR_TYPE_FOR_UPDATE; const unsigned long no_cursor = CURSOR_TYPE_NO_CURSOR; // Helper functions void set_bind_attrs( MYSQL_BIND *mysql_bind, enum_field_types ext_type, void *buf, int bufsz, unsigned long *act_len, my_bool *is_null ) { mysql_bind->buffer_type = ext_type; mysql_bind->buffer = buf; mysql_bind->length = act_len; mysql_bind->is_null = is_null; mysql_bind->buffer_length = bufsz; } void bind_time(void *ptr,int ye,int mo,int da,int ho,int mi,int se) { MYSQL_TIME t = {ye,mo,da,ho,mi,se}; memcpy(ptr,&t,sizeof(t)); } int check_eq(unsigned long v,unsigned long val) { return( v == val ); } int check_eq(void *ptr,const char *val) { return( memcmp((char*)ptr,val,strlen(val))==0); } int check_eq(void *ptr,int val) { return( *((int*)ptr) == val ); } int check_eq(void *ptr,float val) { return( *((float*)ptr) == val ); } int check_eq(void *ptr,double val) { return( *((double*)ptr) == val ); } int check_eq_datetime(void *ptr,int ye,int mo,int da,int ho,int mi,int se) { MYSQL_TIME *t = (MYSQL_TIME*)ptr; return (t->year == ye) && (t->month == mo) && (t->day == da) && (t->hour == ho) && (t->minute == mi) && (t->second == se); } int main(void) { // Create the tables needed to run this trace create_tables(); // ****** Begin of trace ****** MYSQL *sess_1; sess_1 = mysql_init( NULL ); assert(sess_1); mysql_real_connect(sess_1, HOST_NAME, USER_NAME, USER_PWD, DB_NAME, 3306, NULL, 0); mysql_autocommit(sess_1, 0); mysql_query(sess_1, "SET SESSION sql_mode=ERROR_FOR_DIVISION_BY_ZERO"); mysql_query(sess_1, "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"); MYSQL_STMT *stmt_1; stmt_1 = mysql_stmt_init(sess_1); mysql_ret = mysql_stmt_attr_set(stmt_1,STMT_ATTR_CURSOR_TYPE,(const void *) &select_cursor); assert(mysql_ret==0); stmt_text = "SELECT a0.t_empno,MIN(a0.t_projno) FROM tdbtst180000 a0 GROUP BY a0.t_empno"; mysql_ret = mysql_stmt_prepare(stmt_1,stmt_text,strlen(stmt_text)); assert(mysql_ret==0); count = mysql_stmt_param_count(stmt_1); assert( count==0 ); MYSQL_BIND *output_1 = (MYSQL_BIND *)calloc(2, sizeof(MYSQL_BIND)); char data_1[4]; unsigned long len_1; my_bool null_1; set_bind_attrs(&output_1[0],MYSQL_TYPE_LONG,&data_1,4,&len_1,&null_1); char data_2[6]; unsigned long len_2; my_bool null_2; set_bind_attrs(&output_1[1],MYSQL_TYPE_VAR_STRING,&data_2,6,&len_2,&null_2); count = mysql_warning_count(sess_1); assert(count==0); mysql_ret = mysql_stmt_execute(stmt_1); assert(mysql_ret==0); count = mysql_warning_count(sess_1); assert(count==0); mysql_stmt_bind_result(stmt_1,output_1); count = mysql_warning_count(sess_1); assert(count==0); mysql_ret = mysql_stmt_fetch(stmt_1); assert(mysql_ret==0); count = mysql_warning_count(sess_1); assert(count==0); ASSERT_EQ(data_1,10); ASSERT_EQ(len_2,6); ASSERT_EQ(data_2,"AD3100"); count = mysql_warning_count(sess_1); assert(count==0); mysql_ret = mysql_stmt_fetch(stmt_1); assert(mysql_ret==0); count = mysql_warning_count(sess_1); assert(count==1); // count = mysql_warning_count(sess_1); assert(count==0); // MYSQL CRASHES HERE: /* mysql> show databases; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 3 Current database: *** NONE *** */ mysql_ret = mysql_rollback(sess_1); assert(mysql_ret==0); mysql_close(sess_1); } // Following code creates all tables needed to run this trace void create_dbtst180000( void ) { FILE *fp = fopen("/tmp/baan_table_dump","w"); fprintf(fp,"%s\n","-- MySQL dump 10.10"); fprintf(fp,"%s\n","--"); fprintf(fp,"%s\n","-- Host: localhost Database: baan"); fprintf(fp,"%s\n","-- ------------------------------------------------------"); fprintf(fp,"%s\n","-- Server version\0115.0.10-beta-nightly-20050712-debug"); fprintf(fp,"%s\n",""); fprintf(fp,"%s\n","/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;"); fprintf(fp,"%s\n","/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;"); fprintf(fp,"%s\n","/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;"); fprintf(fp,"%s\n","/*!40101 SET NAMES utf8 */;"); fprintf(fp,"%s\n","/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;"); fprintf(fp,"%s\n","/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;"); fprintf(fp,"%s\n","/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;"); fprintf(fp,"%s\n","/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;"); fprintf(fp,"%s\n",""); fprintf(fp,"%s\n","--"); fprintf(fp,"%s\n","-- Table structure for table `tdbtst180000`"); fprintf(fp,"%s\n","--"); fprintf(fp,"%s\n",""); fprintf(fp,"%s\n","DROP TABLE IF EXISTS `tdbtst180000`;"); fprintf(fp,"%s\n","CREATE TABLE `tdbtst180000` ("); fprintf(fp,"%s\n"," `t_empno` int(11) NOT NULL,"); fprintf(fp,"%s\n"," `t_projno` varchar(6) collate latin1_bin NOT NULL,"); fprintf(fp,"%s\n"," `t_emstdate` date NOT NULL,"); fprintf(fp,"%s\n"," `t_emendate` date NOT NULL,"); fprintf(fp,"%s\n"," `t_Refcntd` int(11) NOT NULL,"); fprintf(fp,"%s\n"," `t_Refcntu` int(11) NOT NULL,"); fprintf(fp,"%s\n"," PRIMARY KEY (`t_empno`,`t_projno`,`t_emstdate`,`t_emendate`),"); fprintf(fp,"%s\n"," UNIQUE KEY `Itdbtst180000_2` (`t_projno`,`t_empno`,`t_emstdate`,`t_emendate`)"); fprintf(fp,"%s\n",") ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;"); fprintf(fp,"%s\n",""); fprintf(fp,"%s\n","--"); fprintf(fp,"%s\n","-- Dumping data for table `tdbtst180000`"); fprintf(fp,"%s\n","--"); fprintf(fp,"%s\n",""); fprintf(fp,"%s\n",""); fprintf(fp,"%s\n","/*!40000 ALTER TABLE `tdbtst180000` DISABLE KEYS */;"); fprintf(fp,"%s\n","LOCK TABLES `tdbtst180000` WRITE;"); fprintf(fp,"%s\n","INSERT INTO `tdbtst180000` VALUES (10,'AD3100','1982-01-01','1982-07-01',0,0),(10,'MA2100','1982-01-01','1982-11-01',0,0),(10,'MA2110','1982-01-01','1983-02-01',0,0),(20,'PL2100','1982-01-01','1982-09-15',0,0),(30,'IF1000','1982-06-01','1983-01-01',0,0),(30,'IF2000','1982-01-01','1983-01-01',0,0),(50,'OP1000','1982-01-01','1983-02-01',0,0),(50,'OP2010','1982-01-01','1983-02-01',0,0),(70,'AD3110','1982-01-01','1983-02-01',0,0),(90,'OP1010','1982-01-01','1983-02-01',0,0),(100,'OP2010','1982-01-01','1983-02-01',0,0),(110,'MA2100','1982-01-01','1982-03-01',0,0),(130,'IF1000','1982-01-01','1982-10-01',0,0),(140,'IF1000','1982-10-01','1983-01-01',0,0),(140,'IF2000','1982-01-01','1982-03-01',0,0),(150,'MA2112','1982-01-01','1982-07-15',0,0),(160,'MA2113','1982-07-15','1983-02-01',0,0),(170,'MA2112','1982-01-01','1983-06-01',0,0),(170,'MA2113','1982-01-01','1983-02-01',0,0),(180,'MA2113','1982-04-01','1982-06-15',0,0),(190,'MA2112','1982-02-01','1982-10-01',0,0),(200,'MA2111','1982-01-01','1982-06-15',0,0),(210,'MA2113','1982-10-01','1983-02-01',0,0),(220,'MA2111','1982-01-01','1983-02-01',0,0),(230,'AD3111','1982-01-01','1982-03-15',0,0),(240,'AD3111','1982-02-15','1982-09-15',0,0),(250,'AD3112','1982-01-01','1982-02-01',0,0),(260,'AD3113','1982-06-15','1982-07-01',0,0),(270,'AD3113','1982-03-01','1982-04-01',0,0),(280,'OP1010','1982-01-01','1983-02-01',0,0),(290,'OP1010','1982-01-01','1983-02-01',0,0),(300,'OP1010','1982-01-01','1983-02-01',0,0),(310,'OP1010','1982-01-01','1983-02-01',0,0),(320,'OP2011','1982-01-01','1983-02-01',0,0),(330,'OP2012','1982-01-01','1983-02-01',0,0),(340,'OP2013','1982-01-01','1983-02-01',0,0);"); fprintf(fp,"%s\n","UNLOCK TABLES;"); fprintf(fp,"%s\n","/*!40000 ALTER TABLE `tdbtst180000` ENABLE KEYS */;"); fprintf(fp,"%s\n",""); fprintf(fp,"%s\n","/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;"); fprintf(fp,"%s\n","/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;"); fprintf(fp,"%s\n","/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;"); fprintf(fp,"%s\n","/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;"); fprintf(fp,"%s\n","/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;"); fprintf(fp,"%s\n","/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;"); fprintf(fp,"%s\n","/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;"); fprintf(fp,"%s\n",""); fclose(fp); std::string cmd = std::string("mysql"); if ( OWNER_NAME ) cmd += std::string(" --user=") + OWNER_NAME; if ( OWNER_PWD ) cmd += std::string(" --password=") + OWNER_PWD; if ( HOST_NAME ) cmd += std::string(" --host=") + HOST_NAME; // if ( UNIX_SOCKET ) cmd += std::string(" --socket=") + UNIX_SOCKET; cmd += std::string(" ") + DB_NAME; cmd += " < /tmp/baan_table_dump"; int ret = system(cmd.data()); if ( ret != 0 ) fprintf(stderr,"Command \"%s\" failed\n",cmd.data()); } void create_tables( void ) { create_dbtst180000(); }