#include #include #include int main(int argc, char *argv[]) { // Init MySQL mysql_library_init(0, 0, 0); // Connect to database MYSQL *conn = mysql_init(0); if(!mysql_real_connect(conn, 0, 0, 0, "test", 0, 0, CLIENT_MULTI_STATEMENTS)){ fprintf(stderr, "Connect failed: %s\n", mysql_error(conn)); exit(1); } // Report versions fprintf(stderr, "Bugtest: Client=\"%s\", Server=\"%s\", Protocol=%d\n", mysql_get_client_info(), mysql_get_server_info(conn), mysql_get_proto_info(conn)); // Make test tables if(mysql_query(conn, "CREATE TEMPORARY TABLE foo1 (f1 INT NOT NULL," " f2 DATE NOT NULL, f3 DATE NOT NULL, f4 INT NOT NULL," " f5 INT NOT NULL, f6 VARCHAR(24), f7 VARCHAR(24)," " f8 DECIMAL(10,2), PRIMARY KEY (f1));")){ fprintf(stderr, "Create failed on foo1: %s\n", mysql_error(conn)); exit(1); } if(mysql_query(conn, "CREATE TEMPORARY TABLE foo2 (f1 INT NOT NULL," " f2 VARCHAR(40), f3 DATE NOT NULL, f4 VARCHAR(40));")){ fprintf(stderr, "Create failed on foo2: %s\n", mysql_error(conn)); exit(1); } if(mysql_query(conn, "CREATE TEMPORARY TABLE foo3 (f1 INT NOT NULL," " f2 VARCHAR(40), f3 DECIMAL(10,4) NOT NULL);")){ fprintf(stderr, "Create failed on foo2: %s\n", mysql_error(conn)); exit(1); } // Add test data if(mysql_query(conn, "INSERT INTO foo1 VALUES " "(1,'2008-01-01','2008-02-01',101,201,'test1',NULL,12.01)," "(2,'2008-01-02','2008-02-02',102,202,'test2',NULL,13.02)," "(3,'2008-01-03','2008-02-03',103,203,'test3',NULL,14.03)," "(4,'2008-01-04','2008-02-04',104,204,'test4',NULL,15.04)," "(5,'2008-01-05','2008-02-05',105,205,'test5',NULL,16.05);")){ fprintf(stderr, "Insert failed on foo1: %s\n", mysql_error(conn)); exit(1); } if(mysql_query(conn, "INSERT INTO foo2 VALUES " "(3,'test2','2007-01-01','x')," "(4,'test2','2007-02-01','x');")){ fprintf(stderr, "Insert failed on foo2: %s\n", mysql_error(conn)); exit(1); } if(mysql_query(conn, "INSERT INTO foo3 VALUES " "(1,'test-x1',12.34)," "(2,'test-x2',43.21);")){ fprintf(stderr, "Insert failed on foo3: %s\n", mysql_error(conn)); exit(1); } // Query added data // if(mysql_query(conn, "SELECT COALESCE(f1,f2) FROM foo1;")){ if(mysql_query(conn, "SELECT t1.f1,t1.f2,t1.f3,t1.f4,t1.f5,t1.f6,t1.f7," "COALESCE(" "(SELECT t2.f3 FROM foo2 AS t2 WHERE t2.f1=t1.f1 LIMIT 1)," "t1.f2) AS baddate, COALESCE(t3.f3,t1.f8) FROM foo1 AS t1" " LEFT JOIN foo3 AS t3 ON t3.f1=t1.f1" " ORDER BY baddate,f1;")){ fprintf(stderr, "Select failed: %s\n", mysql_error(conn)); exit(1); } // Fetch the result int nfields = mysql_field_count(conn); if(!nfields){ fprintf(stderr, "Select returned nothing: %s\n", mysql_error(conn)); exit(1); } MYSQL_RES *res = mysql_store_result(conn); if(!res){ fprintf(stderr, "Failed to get result: %s\n", mysql_error(conn)); exit(1); } // Now show the problem MYSQL_FIELD *fields = mysql_fetch_fields(res); if(!res){ fprintf(stderr, "Failed to get fields: %s\n", mysql_error(conn)); exit(1); } for(int i = 0; i < nfields; ++i) fprintf(stderr, "Field#%d \"%s\" from \"%s\", type %d, flags %d, charset %d\n", i, fields[i].name ? fields[i].name : "", fields[i].org_name ? fields[i].org_name : "", fields[i].type, fields[i].flags, fields[i].charsetnr); // And, finally, clean up mysql_close(conn); mysql_library_end(); return 0; }