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

void finish_with_error(MYSQL *con)
{
  fprintf(stderr, "%s\n", mysql_error(con));
  mysql_close(con);
  exit(1);
}

int main(int argc, char **argv)
{
  printf("MySQL client version: %s\n", mysql_get_client_info());
  MYSQL *con = mysql_init(NULL);

  if (con == NULL)
  {
      fprintf(stderr, "%s\n", mysql_error(con));
      exit(1);
  }

  if (mysql_real_connect(con, "127.0.0.1", "root", "", "testj", 3306, NULL, 0) == NULL) {
      finish_with_error(con);
  }

  if (mysql_query(con, "DROP TABLE IF EXISTS foo_inner")) {
      finish_with_error(con);
  }

  if (mysql_query(con, "DROP TABLE IF EXISTS foo_outer")) {
      finish_with_error(con);
  }
	
  if (mysql_query(con, "CREATE TABLE foo_outer (original_id varchar(100), key_p2 DATETIME, some_value text, PRIMARY KEY (original_id, key_p2))")) {
      finish_with_error(con);
  }

  if (mysql_query(con, "INSERT IGNORE INTO foo_outer (original_id, key_p2, some_value) VALUES ('oid_a', '2020-06-01 00:00', 'some_value_a')")) {
      finish_with_error(con);
  }

  if (mysql_query(con, "CREATE TABLE foo_inner (original_id varchar(100), other_id varchar(100), PRIMARY KEY (original_id, other_id))")) {
      finish_with_error(con);
  }
  
  if (mysql_query(con, "INSERT IGNORE INTO foo_inner (original_id, other_id) VALUES ('oid_a', 'otherid_1')")) {
      finish_with_error(con);
  }

  if (mysql_query(con, "INSERT IGNORE INTO foo_inner (original_id, other_id) VALUES ('oid_b', 'otherid_1')")) {
      finish_with_error(con);
  }
	
  if (mysql_query(con, "SELECT original_id AS alt_id, key_p2 as p2, some_value FROM foo_outer WHERE original_id IN (SELECT DISTINCT(inner1.original_id) FROM foo_inner AS inner1 RIGHT JOIN foo_inner AS inner2 ON inner1.other_id = inner2.other_id WHERE inner1.original_id = 'oid_a') ORDER BY key_p2")) {
      finish_with_error(con);
  }
	
  MYSQL_RES *result = mysql_store_result(con);

  if (result == NULL) {
      finish_with_error(con);
  }

  MYSQL_FIELD *field;
  field = mysql_fetch_field(result);

  printf("field name: %s, org_name:%s\n", field->name, field->org_name);
//expect 
// field name: alt_id, org_name:original_id
// but is :
// field name: alt_id, org_name:alt_id
	
 	printf("finished\n");

  mysql_close(con);
  exit(0);
}