
#include <stdlib.h>
#include <stdio.h>
#include <mysql/mysql.h>

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 : "<nil>",
		fields[i].org_name ? fields[i].org_name : "<nil>",
		fields[i].type, fields[i].flags, fields[i].charsetnr);
    // And, finally, clean up
    mysql_close(conn);
    mysql_library_end();
    return 0;
}
