# Helper file to perform one insert of a value into a table with
# different types on master and slave.  The file will insert the
# result into the type_conversions table *on the slave* to get a
# summary of failing and succeeding tests.

# Input:
#    $source_type      Type on the master
#    $target_type      Type on the slave
#    $source_value     Value on the master (inserted into the table)
#    $target_value     Value on the slave (expected value in the table
#                      on the slave)
#    $can_convert      True if conversion shall work, false if it
#                      shall generate an error 
#    $engine_type      The storage engine to be used for storing table
#                      on both master and slave

if (!$engine_type)
{
  # Use the default storage engine
  let $engine_type=`SELECT @@default_storage_engine`;
}

if ($rpl_debug)
{
  --echo source_type=$source_type target_type=$target_type source_value=$source_value target_value=$target_value can_convert=$can_convert engine_type=$engine_type
  SELECT @@GLOBAL.SLAVE_TYPE_CONVERSIONS;
}

--source include/rpl_connection_master.inc
disable_warnings;
DROP TABLE IF EXISTS t1;
enable_warnings;
eval CREATE TABLE t1(
  pk INT NOT NULL PRIMARY KEY,
  a $source_type
) ENGINE=$engine_type;
--source include/sync_slave_sql_with_master.inc
eval ALTER TABLE t1 MODIFY a $target_type;

--source include/rpl_connection_master.inc
eval INSERT INTO t1 VALUES(1, $source_value);
if ($can_convert) {
  --source include/sync_slave_sql_with_master.inc
  eval SELECT a = $target_value into @compare FROM t1;
  eval INSERT INTO type_conversions SET
       Source = "$source_type",
       Target = "$target_type",
       Flags = @@slave_type_conversions,
       On_Master = $source_value,
       Expected = $target_value,
       Compare = @compare;
  UPDATE type_conversions
     SET On_Slave = (SELECT a FROM t1)
   WHERE TestNo = LAST_INSERT_ID();
}
if (!$can_convert) {
  --source include/rpl_connection_slave.inc
  wait_for_slave_to_stop;
  let $error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
  eval INSERT INTO type_conversions SET
       Source = "$source_type",
       Target = "$target_type",
       Flags = @@slave_type_conversions,
       On_Master = $source_value,
       Error = "$error";
  SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
  START SLAVE;
}
