# pushed_join.inc
#
# SUMMARY
#
# Run the $push_query and verify it's push properties
# according to the given arguments by looking at the handler
# status variables and examining the EXPLAIN output.
#
# USAGE
#
# let $push_query=
# The select query to evaluate for pushed join
#
# $push_expected=
# The expected number of pushed joins executed by query
#
# $push_message=
# Expect the query to contain the given $message
# in EXPLAIN or SHOW WARNINGS output
#
#
if (!$push_query)
{
die Need $push_query as parameter to pushed_join_check_pushed.inc;
}
# Save ndb_pushed_* before query
let $defined_before =
`select VARIABLE_VALUE from information_schema.session_status
where variable_name like 'ndb_pushed_queries_defined'`;
let $executed_before =
`select VARIABLE_VALUE from information_schema.session_status
where variable_name like 'ndb_pushed_queries_executed'`;
let $dropped_before =
`select VARIABLE_VALUE from information_schema.session_status
where variable_name like 'ndb_pushed_queries_dropped'`;
let $reads_before =
`select VARIABLE_VALUE from information_schema.session_status
where variable_name like 'ndb_pushed_reads'`;
# Run the query
--disable_result_log ONCE
eval $push_query;
# Save ndb_pushed_* after query
let $defined_after =
`select VARIABLE_VALUE from information_schema.session_status
where variable_name like 'ndb_pushed_queries_defined'`;
let $executed_after =
`select VARIABLE_VALUE from information_schema.session_status
where variable_name like 'ndb_pushed_queries_executed'`;
let $dropped_after =
`select VARIABLE_VALUE from information_schema.session_status
where variable_name like 'ndb_pushed_queries_dropped'`;
let $reads_after =
`select VARIABLE_VALUE from information_schema.session_status
where variable_name like 'ndb_pushed_reads'`;
# Calculate number of pushed queries generated by the query
let $defined = `select $defined_after - $defined_before`;
let $executed = `select $executed_after - $executed_before`;
let $dropped = `select $dropped_after - $dropped_before`;
let $reads = `select $reads_after - $reads_before`;
#echo defined: $defined;
#echo executed: $executed;
#echo dropped: $dropped;
#echo reads: $reads;
#eval EXPLAIN $push_query;
if ($push_expected)
{
#
# The query is expected to be pushed, check that counters have
# been incremented appropriately
#
# More than one pushed query must have been defined
if (!$defined)
{
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--echo - push_query: '$push_query'
--echo - defined: $defined
--echo - executed: $executed
--echo - dropped: $dropped
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--die No pushed join defined for expected push!
}
# More than one pushed query must have been executed unless
# dropped
if (!$executed)
{
if (!$dropped)
{
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--echo - push_query: '$push_query'
--echo - defined: $defined
--echo - executed: $executed
--echo - dropped: $dropped
--echo - reads: $reads
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--die No pushed join executed for expected push!
}
}
if ($dropped)
{
# Print a message to log telling about the drop
--echo Dropped $dropped pushed joins
}
# The number of reads should be greater then zero unless
# all pushed joins where dropped
if ($reads == 0)
{
# No reads (although queries was defined and executed)
# Allow zero read when all defined queries have been dropped
if ($defined != $dropped)
{
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--echo - push_query: '$push_query'
--echo - defined: $defined
--echo - executed: $executed
--echo - dropped: $dropped
--echo - reads: $reads
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--die No pushed reads although join was pushed!
}
# Print a message to log telling about this condition
--echo No pushed reads since all defined were dropped
}
}
if (!$push_expected)
{
#
# The query is expected to not be pushed, check that counters have
# been incremented appropriately
#
if ($defined)
{
# There was a pushed join defined
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--echo - push_query: '$push_query'
--echo - defined: $defined
--echo - executed: $executed
--echo - dropped: $dropped
--echo - reads: $reads
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--die Found defined pushes when push down was not expected!
}
# There should not be any executed when none defined
if ($executed)
{
# There was a pushed join executed
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--echo - push_query: '$push_query'
--echo - defined: $defined
--echo - executed: $executed
--echo - dropped: $dropped
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--die Found executed pushes when push down was not expected!
}
# There should not be any dropped when none defined
if ($executed)
{
# There was a pushed join dropped
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--echo - push_query: '$push_query'
--echo - defined: $defined
--echo - executed: $executed
--echo - dropped: $dropped
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--die Found dropped pushes when push down was not expected!
}
# There should not be any reads when none defined
if ($reads)
{
# There was pushed join reads
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--echo - push_query: '$push_query'
--echo - defined: $defined
--echo - executed: $executed
--echo - dropped: $dropped
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--die Found pushed reads when push down was not expected!
}
}
if ($push_message)
{
#
# Check that EXPLAIN or the warnings contains the expected message
# - dump the EXPLAIN to a file and load it back into a table
# which then is queried with a REGEXP
#
--disable_query_log
CREATE TEMPORARY TABLE messages(txt varchar(1024));
# Dump EXPLAIN to file
let $dump_file = $MYSQLTEST_VARDIR/tmp/explain.txt;
--output $dump_file
eval EXPLAIN FORMAT=TRADITIONAL $push_query;
--chmod 0777 $dump_file # needed for embedded
eval LOAD DATA INFILE '$dump_file' INTO TABLE messages
FIELDS TERMINATED BY '\n';
--remove_file $dump_file
#SELECT * FROM messages;
# check if $message contains the expected message
if (!`SELECT count(txt) FROM messages WHERE txt REGEXP $push_message`)
{
--echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--echo Could not find expected message in EXPLAIN or SHOW WARNINGS!
--echo - expected: $push_message
--echo - found:
SELECT * FROM messages;
--die Did not find expected push message in EXPLAIN
}
DROP TABLE messages;
--enable_query_log
--echo Expected push message found in EXPLAIN;
}
# Add empty new line
--echo
# Reset the argument variables to detect missing assignment
let $push_query=;
let $push_expected=;
let $push_message=;