summaryrefslogtreecommitdiff
path: root/mysql-test/include
diff options
context:
space:
mode:
authorunknown <mleich@mysql.com>2004-11-11 20:12:12 +0100
committerunknown <mleich@mysql.com>2004-11-11 20:12:12 +0100
commit3a98b7831826418d656f8dc4d8f9ca2592e51c36 (patch)
tree717a2f3a7f48202f7d5a8ab1b89679af43b55a56 /mysql-test/include
parent02d8fa295202649863fef5f9d6eadde8dee51a06 (diff)
downloadmariadb-git-3a98b7831826418d656f8dc4d8f9ca2592e51c36.tar.gz
Result of
WL#2225 Extend the test cases for PS + develop a basic test routine for PS The basic test routine mysql-test/include/patchwork-check.inc Test cases for the the basic test routine mysql-test/t/tool_test.test mysql-test/r/tool_test.result Test cases for prepared statements with functions mysql-test/t/ps_12func.test mysql-test/r/ps_12func.result Some statements are set to comment, because of open bugs. Fresh MySQL V4.1 and V5.0 souces produce in the moment (~11-Nov-2004) the same result files.
Diffstat (limited to 'mysql-test/include')
-rw-r--r--mysql-test/include/patchwork-check.inc330
1 files changed, 330 insertions, 0 deletions
diff --git a/mysql-test/include/patchwork-check.inc b/mysql-test/include/patchwork-check.inc
new file mode 100644
index 00000000000..b11db7fa50d
--- /dev/null
+++ b/mysql-test/include/patchwork-check.inc
@@ -0,0 +1,330 @@
+###################### patchwork-check.inc #############################
+# #
+# Basic routine for the generation and execution of prepared and non #
+# prepared SQL statements. #
+# #
+# Purpose: Simplify the check of complex statements with different #
+# sets of parameters (data type, value) #
+# #
+########################################################################
+
+#
+# NOTE: PLEASE BE VERY CAREFULL, WHEN CHANGING OR USING ;-) THIS ROUTINE.
+#
+# Please be aware, that this routine
+# - will be sourced by several test case files stored within the
+# directory 'mysql-test/t'. So every change here will affect
+# several test cases.
+# - does not check its own prequisites
+# - modifies the content and the data type of the
+# uservariables @var_1 ... @var_<n>
+#
+# Please preserve the '__<name>_' naming of the the auxiliary variables.
+# These names should avoid that a test case writer accidently creates a
+# variable with the same name.
+#
+
+# naming conventions:
+# stmt_c_ --> statement with constants like "select 1 "
+# stmt_uv_ --> statement with uservariables like "select @var_1 "
+# stmt_ph_ --> prepared statement with placeholders like "select ? "
+
+
+#
+# Explanation how to use this routine by an example:
+#
+# Content of the caller script:
+# ....
+# set @stmt_part1= 'SELECT f1 + '
+# set @stmt_part2= ' from t1 where f2= ' ;
+# set @stmt_part3= '' ;
+# set @string_1= "1"; set @type_1= "BIGINT";
+# set @string_2= "-2.3E-4"; set @type_2= "DOUBLE";
+# set @max_var_number= 2;
+# --source include/patchwork-check.inc
+#
+# # The next testing rounds could start with
+# set @string_1= "NULL"; set @type_1= "BIGINT";
+# set @string_2= "-2.3E-4"; set @type_2= "DOUBLE";
+# --source include/patchwork-check.inc
+#
+# set @string_1= "1"; set @type_1= "BIGINT";
+# set @string_2= "NULL"; set @type_2= "LONGTEXT";
+# --source include/patchwork-check.inc
+#
+# Statements and uservariables to be produced and executed by this routine
+# 1. Statements with constants
+# 1.1 stmt1= SELECT f1 + 1 from t1 where f2= -2.3E-4 ;
+# 1.2 stmt1 as prepared statement
+# 2. Statements with uservariables
+# @var_n should be of data type @type_n (if possible) and have the
+# content @string_n .
+# 2.1 stmt2= SELECT f1 + @var_1 from t1 where f2= @var_2
+# 2.2 stmt2 as prepared statement
+# 3. prepared statement with placeholders
+# prepare stmt1 from 'SELECT f1 + ? from t1 where f2= ?'
+# execute stmt1 using @var_1, @var_2
+#
+# Every prepared statement variant of the "patchwork" is 3 times executed.
+#
+#
+# Please have also also a look into
+# - t/tooltest.test , which checks or
+# - t/ps_12func.test , which contains test cases using
+# this routine.
+#
+
+
+##############
+#
+# Prerequisites:
+#
+# The caller script must set the following uservariables:
+#
+# The statement pieces: @stmt_part1, @stmt_part2, ... , @stmt_part<n>
+#
+# The parameter values: @string_1, ... , @string_<n - 1>
+# The parameter value should fit to the data type !
+# UPPER(@stmt_part1) = 'NULL' will cause (SQL) NULL as content.
+#
+# The parameter data types: @type_1, ... , @type_<n - 1>
+# valid types are: BIGINT, DOUBLE, LONGTEXT, LONGBLOB
+#
+# Attention: All other type assignments will lead to a
+# uservariable of type LONGTEXT !!
+#
+# The number of parameter values must be published via
+# set @max_var_number= <n - 1> ;
+#
+# Attention: This routine does not perform any check of the content
+# of these variables.
+#
+
+##############
+#
+# How is intended uservariable generated:
+#
+# Step 1: generate a uservariable of the intended type
+#
+# UPPER(@type_<n>) statement
+# BIGINT set @var_<n>= 0
+# DOUBLE' set @var_<n>idx_= 0.0
+# LONGTEXT' set @var_<n>= "INIT"
+# LONGBLOB' set @var_<n>= CAST("INIT" AS BINARY)
+# <all other> set @var_<n>= "INIT"
+#
+# Step 2: assign the value to the uservariable
+#
+# IF ( UPPER(@string_<n>) != 'NULL')
+# UPPER(@type_<n>)
+# BIGINT set @var_<n>= CEIL(@string_<n>)
+# DOUBLE set @var_<n>= @string_<n> + 0.0
+# LONGTEXT set @var_<n>= @string_<n>
+# LONGBLOB set @var_<n>= CAST(@string_<n> AS BINARY)
+# <all other> set @var_<n>= @string_<n>
+# ELSE
+# set @var_<n>= NULL
+#
+
+
+#
+# How to debug this routine if something goes wrong:
+#
+# 1. Put the line '--disable_abort_on_error' into the caller script
+# --> There will be no abort of mysqltest, if a statement fails.
+# You will get a protocol (in most cases).
+# 2. Put the line 'set $__debug_= 1 ;' into the caller script .
+# The next call of patchwork-check.inc will print
+# the type and content of generated uservariables and statements.
+# 3. disable the '--disable_query_log' option some lines below
+#
+# and please be patient towards this routine, it is far away from being perfect.
+#
+
+
+# Suppress the majority of the huge output concerning the statement and
+# uservariable generation
+--disable_query_log
+
+let $__idx_= 1 ;
+eval set @__stmt_c_= @stmt_part_$__idx_ ;
+# If the number of variables is greater 0, we need also
+# - the statement with uservariables (stmt_uv) and
+# - the prepared statement with placeholders (stmt_ph) and
+# - the execute for the prepared statement with placeholders (execute_stmt_ph)
+let $__with_var_= `select @max_var_number > 0`;
+while ($__with_var_)
+{
+ eval set @__stmt_uv_= @stmt_part_$__idx_ ;
+ eval set @__stmt_ph_= @stmt_part_$__idx_ ;
+ set @__execute_stmt_ph= 'execute __stmt_ph_ using ' ;
+ let $__num_= `select @max_var_number`;
+ while ($__num_)
+ {
+ ##### Generate the Uservariables
+ eval set @__my_init_= CASE UPPER(@type_$__idx_)
+ WHEN 'BIGINT' THEN 'set @var_$__idx_= 0'
+ WHEN 'DOUBLE' THEN 'set @var_$__idx_= 0.0'
+ WHEN 'LONGTEXT' THEN 'set @var_$__idx_= "INIT"'
+ WHEN 'LONGBLOB' THEN 'set @var_$__idx_= CAST("INIT" AS BINARY)'
+ ELSE 'set @var_$__idx_= "INIT"' END;
+ # select @__my_init_ as "@__my_init_ is: " ;
+ let $__my_init_= `select @__my_init_`;
+ eval $__my_init_ ;
+
+ eval set @__my_init_= CASE UPPER(@type_$__idx_)
+ WHEN 'BIGINT' THEN
+ "set @var_$__idx_= IF(UPPER(@string_$__idx_)!='NULL',CEIL(@string_$__idx_),NULL)"
+ WHEN 'DOUBLE' THEN
+ "set @var_$__idx_= IF(UPPER(@string_$__idx_)!='NULL',@string_$__idx_ + 0.0,NULL)"
+ WHEN 'LONGTEXT' THEN
+ "set @var_$__idx_= IF(UPPER(@string_$__idx_)!='NULL',@string_$__idx_,NULL)"
+ WHEN 'LONGBLOB' THEN
+ "set @var_$__idx_= IF(UPPER(@string_$__idx_)!='NULL',CAST(@string_$__idx_ AS BINARY),NULL)"
+ ELSE
+ "set @var_$__idx_= IF(UPPER(@string_$__idx_)!='NULL',@string_$__idx_,NULL)" END;
+ let $__my_init_= `select @__my_init_`;
+ eval $__my_init_ ;
+
+ ##### concat the variable to the statements
+ ## with Constants
+ # 1. replace ugly NULLs like 'NuLl' with 'NULL' for better readability
+ # 2. Strings to be inserted into the statement must be quoted
+ eval set @__stmt_c_= concat(
+ @__stmt_c_,
+ IF(UPPER(@string_$__idx_)='NULL','NULL',
+ IF(UPPER(@type_$__idx_)='LONGTEXT' or UPPER(@type_$__idx_)='LONGBLOB',
+ concat('''',@string_$__idx_,''''), @string_$__idx_
+ ))) ;
+ ## with Uservariables
+ eval set @__stmt_uv_= concat(@__stmt_uv_, '@var_$__idx_') ;
+ ## with placeholders
+ eval set @__stmt_ph_= concat(@__stmt_ph_, '?') ;
+
+ ##### complete the execute for the prepared statement with placeholders
+ eval set @__execute_stmt_ph= concat(@__execute_stmt_ph, '@var_$__idx_,') ;
+
+ inc $__idx_ ;
+ ##### concat the next part of the statement to the statements
+ eval set @__stmt_c_= concat(@__stmt_c_, @stmt_part_$__idx_ );
+ eval set @__stmt_uv_= concat(@__stmt_uv_, @stmt_part_$__idx_ );
+ eval set @__stmt_ph_= concat(@__stmt_ph_, @stmt_part_$__idx_ );
+
+ dec $__num_ ;
+ }
+ # @__execute_stmt_ph contains a trailing ',' which must be cut away
+ set @__execute_stmt_ph= substr(@__execute_stmt_ph,1,length(@__execute_stmt_ph) - 1);
+ dec $__with_var_ ;
+}
+
+while ($__debug_)
+{
+ ### Print debug informations for patchwork with variables
+ let $__with_var_= `select @max_var_number > 0`;
+ while ($__with_var_)
+ {
+ ### Print out the content of the statement variables
+ eval select "--------------------------------------"
+ as "the content of the statement variables"
+ union select concat('@__stmt_c_ is: ',@__stmt_c_)
+ union select concat('@__stmt_uv_ is: ',@__stmt_uv_)
+ union select concat('@__stmt_ph_ is: ',@__stmt_ph_)
+ union select concat('@__execute_stmt_ph is: ',@__execute_stmt_ph);
+
+
+ ### Print out the content of the uservariables
+ select '--------------------------------------'
+ as "the content of the parameter variables";
+ set @__parameter_= 'select ';
+ let $__num_= `select @max_var_number`;
+ let $__idx_= 1 ;
+ while ($__num_)
+ {
+ eval select @type_$__idx_ as type,
+ @string_$__idx_ as string,
+ @var_$__idx_ as uservariable ;
+ eval set @__parameter_= concat(@__parameter_, '@var_$__idx_ ,');
+ inc $__idx_ ;
+
+ dec $__num_ ;
+ }
+ # @__parameter_ contains a trailing ',' which must be cut away
+ set @__parameter_= substr(@__parameter_,1,length(@__parameter_) - 1);
+ let $__aux_= `select @__parameter_` ;
+ eval $__aux_ ;
+
+
+ ### Create a table from the uservariables and print out the column types
+ let $__aux_= `select concat('CREATE TABLE t9 AS ',@__parameter_)` ;
+ --disable_warnings
+ drop table if exists t9;
+ --enable_warnings
+ eval $__aux_ ;
+ show create table t9;
+ drop table t9;
+
+ dec $__with_var_ ;
+ }
+ ### Print debug informations for patchwork without variables
+ ### stmt_uv, stmt_ph, execute_stmt_ph and uservariables do NOT exist
+ let $__with_var_= `select @max_var_number = 0`;
+ while ($__with_var_)
+ {
+ ### Print out the content of the statement variables
+ eval select "--------------------------------------"
+ as "the content of the statement variable"
+ union select concat('@__stmt_c_ is: ',@__stmt_c_) ;
+
+ dec $__with_var_ ;
+ }
+
+
+ dec $__debug_ ;
+}
+
+## copy the statements and the execute into $variables
+# (__stmt_ph_ is not needed)
+## + generate the prepared statements
+--enable_query_log
+let $__stmt_c_= `select @__stmt_c_`;
+eval prepare __stmt_c_ from @__stmt_c_ ;
+let $__with_var_= `select @max_var_number > 0`;
+while ($__with_var_)
+{
+ let $__stmt_uv_= `select @__stmt_uv_`;
+ eval prepare __stmt_uv_ from @__stmt_uv_ ;
+ let $__execute_ph= `select @__execute_stmt_ph`;
+ eval prepare __stmt_ph_ from @__stmt_ph_ ;
+ dec $__with_var_ ;
+}
+
+
+##### The execution of all statements
+## statement with Constants
+eval $__stmt_c_ ;
+## prepared statement with Constants
+execute __stmt_c_ ;
+# Try to detect if the prior executes damaged the parse tree by
+# two additional executes .
+execute __stmt_c_ ;
+execute __stmt_c_ ;
+let $__with_var_= `select @max_var_number > 0`;
+while ($__with_var_)
+{
+ ## statement with Uservariables
+ eval $__stmt_uv_ ;
+ ## prepared statement with Uservariables
+ execute __stmt_uv_ ;
+ # Try to detect if the prior executes damaged the parse tree by
+ # two additional executes .
+ execute __stmt_uv_ ;
+ execute __stmt_uv_ ;
+ ## prepared statement with placeholders
+ eval $__execute_ph ;
+ # Try to detect if the prior executes damaged the parse tree by
+ # two additional executes .
+ eval $__execute_ph ;
+ eval $__execute_ph ;
+
+ dec $__with_var_ ;
+}