polardbxengine/mysql-test/include/begin_replace_combination.inc

118 lines
4.7 KiB
PHP

# ==== Purpose ====
#
# The replication suites are often run in multiple 'combinations',
# e.g. with binlog_format=row, mixed, or statement. Some specific
# test cases do not care about this variable, but need to run with
# multiple values of some *other* variable, which the test framework
# does not explicitly vary.
#
# This file is used to replace one variable combination by another.
#
# Notice that there is currently no other way to run a test with
# a non-standard 'combination', and verify that the result file is
# the same for all cases.
#
# ==== Usage ====
#
# --let $replace_combination_from= {SESSION|GLOBAL|BOTH}.VARIABLE_NAME=VAL1,VAL2[,VAL3[,VAL4...]]
# --let $replace_combination_to= {SESSION|GLOBAL|BOTH}.VARIABLE_NAME=VAL1,VAL2[,VAL3[,VAL4...]]
# [--let $replace_on_all_servers= 1]
# --source include/begin_replace_combination.inc
#
# ... test test test ...
#
# --source include/end_replace_combination.inc
#
# Parameters:
# $replace_combination_from
# Variable that the test suite varies, and a comma-separated list
# of expected values. This variable will be set to the first
# value in the list. It will be set in the specified scopes: only
# global, only session, or both.
#
# $replace_combination_to
# Variable that this script will vary instead of
# $replace_combination_from. If the variable in
# $replace_combination_from takes the Nth value from the value
# list in $replace_combination_from, then the variable in
# $replace_combination_to will take the Nth value in the value
# list in $replace_combination_to. The variable will be set in
# the specified scopes: only global, only session, or both.
#
# $replace_combination_on_all_servers
# Use rpl_for_each_server_stmt.inc to set the variable on all
# servers. This requires previous use of master-slave.inc or
# rpl_init.inc.
#
# Notes:
# - The *session* variable is only set on the current connection when
# $replace_combinations_on_all_servers=0. It is only set on the
# connection server_N (where N=1,2...), when
# $replace_combinations_on_all_servers=1.
--let $include_filename= begin_replace_combination.inc [$replace_combination_from -> $replace_combination_to]
--source include/begin_include_file.inc
--disable_query_log
# Extract scopes, variables, and value lists from script parameters.
--let $_rc_from_variable_scope= `SELECT SUBSTRING_INDEX('$replace_combination_from', '.', 1)`
--let $_rc_to_variable_scope= `SELECT SUBSTRING_INDEX('$replace_combination_to', '.', 1)`
--let $_rc_from_variable= `SELECT SUBSTRING_INDEX(SUBSTR('$replace_combination_from', LENGTH('$_rc_from_variable_scope') + 2), '=', 1)`
--let $_rc_to_variable= `SELECT SUBSTRING_INDEX(SUBSTR('$replace_combination_to', LENGTH('$_rc_to_variable_scope') + 2), '=', 1)`
--let $_rc_from_value_list= `SELECT SUBSTR('$replace_combination_from', LENGTH('$_rc_from_variable_scope.$_rc_from_variable') + 2)`
--let $_rc_to_value_list= `SELECT SUBSTR('$replace_combination_to', LENGTH('$_rc_to_variable_scope.$_rc_to_variable') + 2)`
# Get current value of 'from' variable and translate to new value of
# 'to' variable.
--let $_rc_from_value= `SELECT @@GLOBAL.$_rc_from_variable`
--let $_rc_from_value_index= `SELECT FIND_IN_SET('$_rc_from_value', '$_rc_from_value_list')`
if ($_rc_from_value_index == 0)
{
--echo Variable '$_rc_from_variable' has value '$_rc_from_value' which is not listed in '$_rc_from_value_list'
--die 'From' variable has a value that is not among the listed values
}
--let $_rc_to_value= `SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('$_rc_to_value_list', ',', $_rc_from_value_index), ',', -1)`
# Backup old 'to' value and compute new 'from' value.
--let $_rc_new_from_value= `SELECT SUBSTRING_INDEX('$_rc_from_value_list', ',', 1)`
--let $_rc_old_to_value= `SELECT @@GLOBAL.$_rc_to_variable`
# Build SQL statements.
--let $rpl_sql= SET
if ($_rc_to_variable_scope != SESSION)
{
--let $rpl_sql= $rpl_sql @@GLOBAL.$_rc_to_variable = '$_rc_to_value',
}
if ($_rc_to_variable_scope != GLOBAL)
{
--let $rpl_sql= $rpl_sql @@SESSION.$_rc_to_variable = '$_rc_to_value',
}
if ($_rc_from_variable_scope != SESSION)
{
--let $rpl_sql= $rpl_sql @@GLOBAL.$_rc_from_variable = '$_rc_new_from_value'
if ($_rc_from_variable_scope == BOTH)
{
--let $rpl_sql= $rpl_sql,
}
}
if ($_rc_from_variable_scope != GLOBAL)
{
--let $rpl_sql= $rpl_sql @@SESSION.$_rc_from_variable = '$_rc_new_from_value'
}
# Execute SQL statements.
if ($replace_combination_on_all_servers)
{
--source include/rpl_for_each_server_stmt.inc
}
if (!$replace_combination_on_all_servers)
{
--eval $rpl_sql
}
--let $include_filename= begin_replace_combination.inc [$replace_combination_from -> $replace_combination_to]
--source include/end_include_file.inc