List:Commits« Previous MessageNext Message »
From:Serge Kozlov Date:May 18 2009 9:07am
Subject:bzr commit into nuts branch (Serge.Kozlov:319) WL#4840 WL#4845 WL#4853
WL#4854
View as plain text  
#At file:///home/ksm/sun/repo/WL4840/nuts/ based on revid:alfranio.correia@stripped

  319 Serge Kozlov	2009-05-18
      1. Update for WL#4840, WL#4845, #WL4846:
       a) main code for support of matrix moved into matrix.pl
       b) now each test has own config file
       c) Rewritten code by code-reviews (remove die/exit, optimization)
      2. WL#4853: added test data_types_charset.pm
      3. WL#4854: added test data_types_eq.pm
      added:
        suites/rep/data_types/
        suites/rep/data_types/config.pl
        suites/rep/data_types/config_charset.pl
        suites/rep/data_types/config_eq.pl
        suites/rep/data_types/data_types.conf
        suites/rep/data_types/matrix.dat
        suites/rep/data_types/matrix.pl
        suites/rep/data_types_charset.pm
        suites/rep/data_types_eq.pm
        suites/rep/data_types_main.pm

=== added directory 'suites/rep/data_types'
=== added file 'suites/rep/data_types/config.pl'
--- a/suites/rep/data_types/config.pl	1970-01-01 00:00:00 +0000
+++ b/suites/rep/data_types/config.pl	2009-05-18 09:07:00 +0000
@@ -0,0 +1,40 @@
+package rep::data_types::config;
+
+BEGIN { }
+
+# Options for test
+
+# Verbose
+our $verbose= 1;
+
+# Record matrix
+our $record= 0;
+
+#
+our $mode= "";
+# Paths to files
+
+our $data_types_config_file= "./suites/rep/data_types/data_types.conf";
+our $error_messages_file= $Parameters::build . "/sql/share/errmsg.txt";
+our $matrix_file= "./suites/rep/data_types/matrix.dat";
+our $matrix_report_file= "./var/tmp/data_types";
+
+# Server options
+our $server_options = [
+    {	
+	"name" => "engine",
+	"affected" => "master,slave",
+	"values" => ["MyISAM", "InnoDB", "MEMORY"],
+#	"values" => ["InnoDB"],
+    },
+    {
+	"name" => "binlog_format",
+	"affected" => "master",
+	"values" => ["MIXED", "STATEMENT", "ROW"],
+#	"values" => ["MIXED"],
+    },
+];
+
+return 1;
+
+END { }

=== added file 'suites/rep/data_types/config_charset.pl'
--- a/suites/rep/data_types/config_charset.pl	1970-01-01 00:00:00 +0000
+++ b/suites/rep/data_types/config_charset.pl	2009-05-18 09:07:00 +0000
@@ -0,0 +1,59 @@
+package rep::data_types::config;
+
+BEGIN { }
+
+# Options for test
+
+# Verbose
+our $verbose= 1;
+
+# Record matrix
+our $record= 0;
+
+#
+our $mode= "";
+# Paths to files
+
+our $data_types_config_file= "./suites/rep/data_types/data_types.conf";
+our $error_messages_file= $Parameters::build . "/sql/share/errmsg.txt";
+our $matrix_file= "./suites/rep/data_types/matrix.dat";
+our $matrix_report_file= "./var/tmp/data_types";
+
+# Server options
+our $server_options = [
+    {	
+	"name" => "engine",
+	"affected" => "master,slave",
+	"values" => ["MyISAM", "InnoDB", "MEMORY"],
+#	"values" => ["InnoDB"],
+    },
+    {
+	"name" => "binlog_format",
+	"affected" => "master",
+	"values" => ["MIXED", "STATEMENT", "ROW"],
+#	"values" => ["MIXED"],
+    },
+    
+];
+
+our $charsets = {
+    "ucs2,utf16,utf32,utf8" => ["_general_ci", "_bin", "_czech_ci", "_danish_ci", "_esperanto_ci", "_estonian_ci", "_hungarian_ci", "_icelandic_ci", "_latvian_ci", "_lithuanian_ci", "_persian_ci", "_polish_ci", "_roman_ci", "_romanian_ci", "_sinhala_ci", "_slovak_ci", "_slovenian_ci", "_spanish2_ci", "_spanish_ci", "_swedish_ci", "_turkish_ci", "_unicode_ci"],
+    "ascii,cp850,macroman,cp852,keybcs2,macce,armscii8,cp1256,geostd8,greek,hebrew,cp866,koi8r,koi8u" => ["_general_ci", "_bin"],
+    "dec8,swe7" => ["_swedish_ci", "_bin"],
+    "hp8" => ["_english_ci", "_bin"],
+    "latin1" => ["_swedish_ci", "_bin", "_danish_ci", "_general_ci", "_general_cs", "_german1_ci", "_german2_ci", "_spanish_ci"],
+    "cp1250" => ["_general_ci", "_bin", "_croatian_ci", "_szech_cs", "_polish_ci"],
+    "latin2" => ["_general_ci", "_bin", "_croatian_ci", "_szech_cs", "_hungarian_ci"],
+    "latin5" => ["_turkish_ci", "_bin"],
+    "cp1257" => ["_general_ci", "_bin", "_lithuanian_ci"],
+    "latin7" => ["_general_ci", "_bin", "_estonian_cs", "_general_cs"],
+    "cp1251" => ["_general_ci", "_bin", "_bulgarian_ci", "_general_cs", "_ukrainian_ci"],
+    "big5,gb2312,gbk" => ["_chinese_ci", "_bin"],
+    "cp932,eucjpms,sjis" => ["_japanese_ci", "_bin"],
+    "euckr" => ["_korean_ci", "_bin"],
+    "tis620" => ["_thai_ci", "_bin"],
+};
+
+return 1;
+
+END { }

=== added file 'suites/rep/data_types/config_eq.pl'
--- a/suites/rep/data_types/config_eq.pl	1970-01-01 00:00:00 +0000
+++ b/suites/rep/data_types/config_eq.pl	2009-05-18 09:07:00 +0000
@@ -0,0 +1,39 @@
+package rep::data_types::config;
+
+BEGIN { }
+
+# Options for test
+
+# Verbose
+our $verbose= 1;
+
+# Record matrix
+our $record= 0;
+
+#
+our $mode= "";
+# Paths to files
+
+our $data_types_config_file= "./suites/rep/data_types/data_types.conf";
+our $error_messages_file= $Parameters::build . "/sql/share/errmsg.txt";
+our $matrix_file= "./suites/rep/data_types/matrix.dat";
+
+# Server options
+our $server_options = [
+    {	
+	"name" => "engine",
+	"affected" => "master,slave",
+	"values" => ["MyISAM", "InnoDB", "MEMORY"],
+#	"values" => ["InnoDB"],
+    },
+    {
+	"name" => "binlog_format",
+	"affected" => "master",
+	"values" => ["MIXED", "STATEMENT", "ROW"],
+#	"values" => ["MIXED"],
+    },
+];
+
+return 1;
+
+END { }

=== added file 'suites/rep/data_types/data_types.conf'
--- a/suites/rep/data_types/data_types.conf	1970-01-01 00:00:00 +0000
+++ b/suites/rep/data_types/data_types.conf	2009-05-18 09:07:00 +0000
@@ -0,0 +1,151 @@
+[BIT]
+group: numeric
+values: 0b0000000000000000000000000000000000000000000000000000000000000000, 0b1111111111111111111111111111111111111111111111111111111111111111
+
+[TINYINT SIGNED]
+group: numeric
+values: -128, 0, 127
+
+[TINYINT UNSIGNED]
+group: numeric
+values: 0, 255
+
+[SMALLINT SIGNED]
+group: numeric
+values: -32768, 0, 32767
+
+[SMALLINT UNSIGNED]
+group: numeric
+values: 0, 65535
+
+[MEDIUMINT SIGNED]
+group: numeric
+values: -8388608, 0, 8388607
+
+[MEDIUMINT UNSIGNED]
+group: numeric
+values: 0, 16777215
+
+[INT SIGNED]
+group: numeric
+values: -2147483648, 0, 2147483647
+
+[INT UNSIGNED]
+group: numeric
+values: 0, 4294967295
+
+[BIGINT SIGNED]
+group: numeric
+values: -9223372036854775808, 0, 9223372036854775807
+
+[BIGINT UNSIGNED]
+group: numeric
+values: 0, 18446744073709551615
+
+[FLOAT SIGNED]
+group: numeric
+values: -3.402823466E+38, -1.175494351E-38, 0, 1.175494351E-38, 3.402823466E+38
+
+[FLOAT UNSIGNED]
+group: numeric
+values: 0, 1.175494351E-38, 3.402823466E+38
+
+[DOUBLE SIGNED]
+group: numeric
+values: -1.7976931348623157e+308, -2.2250738585072014E-308, 0, 2.2250738585072014E-308, 1.7976931348623157e+308
+
+[DOUBLE UNSIGNED]
+group: numeric
+values: 0, 2.2250738585072014E-308, 1.7976931348623157e+308
+
+[DATETIME]
+group: datetime
+values: '1000-01-01 00:00:00', '9999-12-31 23:59:59'
+
+[DATE]
+group: datetime
+values: '1000-01-01', '9999-12-31'
+
+[TIME]
+group: datetime
+values: '-838:59:59', '838:59:59'
+
+[TIMESTAMP]
+group: datetime
+values: '1970-01-01 00:00:01', '2038-01-09 03:14:07'
+
+[YEAR(2)]
+group: datetime
+values: '00', '69', '70', '99'
+
+[YEAR(4)]
+group: datetime
+values: '1901', '2155'
+
+[CHAR(255)]
+group: string
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: @test_data
+
+[VARCHAR(255)]
+group: string
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: @test_data
+
+[BINARY(255)]
+group: binary
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: @test_data
+
+[VARBINARY(255)]
+group: binary
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: @test_data
+
+[TINYBLOB]
+group: binary
+engines: innodb, myisam
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: @test_data
+
+[BLOB]
+group: binary
+engines: innodb, myisam
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: REPEAT(@test_data,200)
+
+[MEDIUMBLOB]
+group: binary
+engines: innodb, myisam
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: REPEAT(@test_data,1000)
+
+#[LONGBLOB]
+#group: string
+#engines: innodb, myisam
+#query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+#values: REPEAT(@test_data,65000)
+
+[TINYTEXT]
+group: string
+engines: innodb, myisam
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: @test_data
+
+[TEXT]
+group: string
+engines: innodb, myisam
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: REPEAT(@test_data,200)
+
+[MEDIUMTEXT]
+group: string
+engines: innodb, myisam
+query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+values: REPEAT(@test_data,1000)
+
+#[LONGTEXT]
+#group: string
+#engines: innodb, myisam
+#query_before: SET @test_data = CHAR(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
+#values: REPEAT(@test_data,66000)

=== added file 'suites/rep/data_types/matrix.dat'
Binary files a/suites/rep/data_types/matrix.dat	1970-01-01 00:00:00 +0000 and b/suites/rep/data_types/matrix.dat	2009-05-18 09:07:00 +0000 differ

=== added file 'suites/rep/data_types/matrix.pl'
--- a/suites/rep/data_types/matrix.pl	1970-01-01 00:00:00 +0000
+++ b/suites/rep/data_types/matrix.pl	2009-05-18 09:07:00 +0000
@@ -0,0 +1,566 @@
+package rep::data_types::matrix;
+
+BEGIN {}
+
+use strict;
+use warnings;
+use Storable;
+use My::Nuts::Library::Kernel::Server;
+use My::Nuts::Library::Kernel::Manager;
+use My::Nuts::Library::Kernel::Result;
+use My::Nuts::Library::Kernel::Replication;
+use My::Nuts::Library::Tests::SimpleTest;
+
+
+sub retrieve_matrix()
+{
+    my $filename= shift;
+    my $matrix= {};
+    $matrix= retrieve($filename) unless (!-e $filename);
+    return $matrix;
+}
+
+sub store_matrix()
+{
+    my ($mref, $filename)= @_;
+    $mref->{"info"}->{"created"}= localtime(); 
+    store($mref, $filename);
+}
+
+
+sub get_data_types()
+{
+    my $filename= shift;
+    my $types= {};
+    my $section;
+    open F, $filename or exit_from_test (1, "Could not open configuration file \"$filename\"");
+    while(<F>)
+    {
+	if (/^\#.*$/)
+	{
+	    next;
+	}
+	elsif (/\[(.+)\]/)
+	{
+	    $section= "$1";
+	}
+	elsif (/^values *\:\ *(.+\,.+)/)
+	{
+	    $types->{$section}->{"values"}= [(split /\,\ +/, $1)];
+	}
+	elsif (/^size *\:\ *(.+\.\..+)/)
+	{
+	    $types->{$section}->{"size"}= [(split /\ *\.\.\ */, $1)];
+	}
+	elsif (/^(query_before|group)\ *\:\ *(.+)/)
+	{
+	    $types->{$section}->{$1}= $2;
+	}	
+	elsif (/^([a-z\_A-Z]+)\ *\:\ *(.+\,.+)/)
+	{
+	    $types->{$section}->{$1}= [(split /\,\ */, $2)];
+	}	
+	elsif (/^([a-z\_A-Z]+)\ *\:\ *(.+)/)
+	{
+	    $types->{$section}->{$1}= [$2];
+	}	
+    }
+    close F;
+    return $types;
+}
+
+sub generate_matrix()
+{
+    my $params= shift;
+    my $types= $params->{"data_types"};
+    my $mode= $params->{"mode"};
+    my $matrix= [];  
+    my $types_null;
+    if ($mode->{"null"})
+    {
+	$types_null = [$mode->{"null"}];
+    }
+    else
+    {  
+	$types_null = ["NULL", "NOT NULL"];
+    }
+    # Generate matrix
+    foreach my $type_from (sort keys %$types)
+    {
+        foreach my $type_to (sort keys %$types)
+	{	
+	    foreach my $null_from ( @$types_null )
+	    {
+		foreach my $null_to ( @$types_null )
+		{
+		    my @values_from = @{$types->{$type_from}->{"values"}};
+		    if ($null_from =~ m/^NULL$/)
+		    {
+			unshift(@values_from, "NULL");
+		    }
+		    my @values_to = @{$types->{$type_to}->{"values"}};
+		    if ($null_to =~ m/^NULL$/)
+		    {
+			unshift(@values_to, "NULL");
+		    }			
+		    my $ext_from= "$type_from $null_from";
+		    $ext_from=~s/\ {2,10}//g;
+		    $ext_from=~s/\ *$//g;
+		    my $ext_to= "$type_to $null_to";
+		    $ext_to=~s/\ {2,10}//g;
+		    $ext_to=~s/\ *$//g;
+		    my $add= 0;
+		    if ($mode->{"collect"})
+		    {
+			if ($ext_from eq $ext_to && $mode->{"collect"} eq "equal")
+			{
+			    $add= 1;
+			}
+		    }
+		    if ($mode->{"group"})
+		    {
+			my $group = $mode->{"group"};
+			if ($types->{$type_from}->{"group"} =~ qr/$group/ && $types->{$type_to}->{"group"} =~ qr/$group/ )
+			{
+			    $add= 1;
+			}
+		    }
+		    if (scalar(keys %$mode) == 0) 
+		    {
+			$add= 1;
+		    }
+		    if ($add == 1)
+		    {
+			push(@$matrix, {"from_orig"=> $type_from, "to_orig"=> $type_to, "from"=> $ext_from, "to"=> $ext_to, "values_from"=> [@values_from], "values_to"=> [@values_to]});		
+		    }
+		}
+	    }	    	
+	}
+    }
+    return $matrix;
+}
+
+sub get_server_options()
+{
+    my $params= shift;
+    my $server_options= $params->{"server_options"};
+    my $filter= $params->{"filter"};
+    my $opts= [];
+    my $option_num= 1;
+    my $diva= {};
+    my $cur_val;
+    foreach my $option (@{$server_options})
+    {
+	if ($option->{"affected"} =~ m/$filter/)
+	{
+    	    $diva->{$option->{"name"}}= $option_num;
+    	    $option_num= $option_num * scalar( @{$option->{"values"}} );
+    	}
+    }
+    for (my $i = 0; $i < $option_num; $i++)
+    {
+	$cur_val= $i;
+	my $opt= {};
+	foreach my $option (reverse @{$server_options})
+	{
+	    if ($option->{"affected"} =~ m/$filter/)
+	    {
+		my $k= int($cur_val/$diva->{$option->{"name"}});
+		if ($diva->{$option->{"name"}} == 1)
+		{
+		    $k= $cur_val % scalar( @{$option->{"values"}} );
+		}
+		$opt->{$option->{"name"}}= $option->{"values"}->[$k];
+		$cur_val= $cur_val % $diva->{$option->{"name"}};	    
+	    }
+	}
+	push(@$opts, $opt);
+    }
+    return $opts;
+}
+
+
+sub get_error_msgs()
+{
+    my $errfile= shift;
+    my $errors= {};
+    open F, $errfile or exit_from_test (1, "Could not open file \"$errfile\"");
+    my $start_error_number;
+    while(<F>)
+    {
+	if (m/start-error-number +(\d+)/)
+	{
+	    $start_error_number= $1;
+	}
+	elsif (m/^((ER|WARN)[A-Za-z0-9_\-]+)/)
+	{
+	    $errors->{$start_error_number}= $1;
+	    $errors->{$start_error_number}=~ s/\s+$//;
+	    $start_error_number++;
+	}
+    }
+    close F;
+    return $errors;
+}
+
+sub vprint
+{
+    my $vmode= shift;
+    my $text= shift;
+    if ($rep::data_types::config::verbose >= $vmode) 
+    {
+	print $text;
+    }
+}
+
+sub sync
+{
+    my ($master,$slave)= @_;
+    if (
+	(retrieve_master_status($master, "Position") eq retrieve_slave_status($slave, "Exec_Master_Log_Pos")) &&
+	(retrieve_slave_status($slave, "Slave_IO_Running") =~ m/yes/i) &&
+	(retrieve_slave_status($slave, "Slave_SQL_Running") =~ m/yes/i))
+    {
+	return 0;
+    }
+    else
+    {
+	return 1;
+    }
+}
+
+sub matrix_key
+{
+    my ($opt_from, $opt_to, $type_from, $type_to) = @_;
+    my $opt_name;
+    my $matrix_key = "master:[type=" . $type_from . ",";
+    foreach $opt_name ( sort keys %$opt_from)
+    {
+	$matrix_key .= "$opt_name=" . $opt_from->{$opt_name} . ",";
+    }
+    $matrix_key =~ s/\,$//;
+    $matrix_key .= "];slave:[type=" . $type_to . ",";;
+    foreach $opt_name ( sort keys %$opt_to)
+    {
+	$matrix_key .= "$opt_name=" . $opt_to->{$opt_name} . ",";
+    }
+    $matrix_key =~ s/\,$//;
+    $matrix_key .= "]";
+    return lc $matrix_key;
+}
+
+sub report_matrix()
+{
+    my $params= shift;
+    my $mref= $params->{"matrix"};
+    my $filename= $params->{"filename"};
+    my $r_matrix = {};
+    my $opt;
+    my $t_from;
+    my $t_to;
+    my $html_out = "<html>\n<head><title>Data type matrix</title></head><body>\nReport created by ".$mref->{"info"}->{"created"}."<br>\n";
+    $html_out .= "ER_* - MySQL error messages, TER_* - errors in test: data replicated but invalid<br>\r";
+    # repack matrix
+    foreach my $key ( keys %$mref )
+    {
+	if ($key =~ m/^master\:\[type\=([0-9a-z ()]+)\,*.*\];slave\:\[type\=([0-9a-z ()]+)\,*.*\]$/)
+	{
+	    $t_from= $1;
+	    $t_to= $2;
+	    $opt= $key;
+	    $opt=~ s/type\=[0-9a-z ()]+\,//g;
+	    $r_matrix->{$opt}->{$t_from}->{$t_to}= $mref->{$key}->{"result"};	    
+	}
+    }
+    foreach $opt ( keys %$r_matrix)
+    {
+	$html_out .= "<h3>$opt</h3>\n<table border=1><tr>\n\t<td></td>\n";
+	foreach $t_from ( sort keys %{$r_matrix->{$opt}} )
+	{
+	    $html_out .= "\t<td><b>$t_from</b></td>\n";
+	}
+	$html_out .= "</tr>\n";
+	foreach $t_from ( sort keys %{$r_matrix->{$opt}} )
+	{	
+	    $html_out .= "<tr>\n\t<td><b>$t_from</b></td>\n";
+	    foreach $t_to ( sort keys %{$r_matrix->{$opt}->{$t_from}} )
+	    {
+		my $result= "";
+		my $bg= "#ffffff";
+		if ($r_matrix->{$opt}->{$t_from}->{$t_to})
+		{
+		    $result= $r_matrix->{$opt}->{$t_from}->{$t_to};
+		    if ($result =~ m/ok/i)
+		    {
+			$bg= "#80ff80";
+		    }
+		    elsif ($result =~ m/^TER_.+_ENGINE_WRONG_TYPE/)
+		    {
+			$bg= "#c0c0c0";
+		    }
+		    elsif ($result =~ m/^(ER\_|TER\_).+/)
+		    {
+			$bg= "#ff5b5b";
+		    }
+		}
+		$html_out .= "\t<td bgcolor=$bg>$result</td>\n";
+	    }	
+	    $html_out .= "</tr>\n";
+	}
+	$html_out .= "</tr>\n</table>\n";	
+    }
+    $html_out .= "</body>\n</html>\n";
+    open MATRIX, ">$filename";
+    print MATRIX $html_out;
+    close MATRIX;
+}
+
+sub test_matrix()
+{
+    my $params= shift;
+    my $master= $params->{"master"};
+    my $slave= $params->{"slave"};
+    my $options_from= $params->{"master_options"};
+    my $options_to= $params->{"slave_options"};
+    my $types= $params->{"data_types"};
+    my $errors= $params->{"errors"};
+    my $matrix= $params->{"matrix"};
+    my $matrix_cur= $params->{"current_matrix"};
+    my $matrix_orig= $params->{"original_matrix"};
+    my $counter= 1;
+    my $test_error;
+    my $test_desc;
+    my $slave_query;
+    my $rs;
+    my @rs_data= ();
+    my $matrix_key;
+    my $err;    
+    foreach my $option_set_from (@$options_from)
+    {
+	foreach my $option_set_to (@$options_to)
+	{
+	    my $engine_from= " ENGINE=" . $option_set_from->{"engine"};
+	    my $engine_to= " ENGINE=" . $option_set_to->{"engine"};
+	    my $need_restart_rep= 0;
+	    my $skip_pair= 0;
+	    ok_sql ( $master, "SET BINLOG_FORMAT='" . $option_set_from->{"binlog_format"} . "'" );
+	    vprint(1, "*** master:" . join(",", (values %$option_set_from)) . ", slave:" . join(",", (values %$option_set_to)) . " ***\n");
+	    foreach my $pair (@$matrix)
+	    {
+		my $type_from= $pair->{"from"};
+		my $type_to= $pair->{"to"};
+		my $values_from= $pair->{"values_from"};
+		$matrix_key = matrix_key($option_set_from, $option_set_to, $type_from, $type_to);	
+    		my $test_info= "$type_from -> $type_to";
+		if ($need_restart_rep == 1)
+		{
+		    stop_replication($slave);
+		    reset_master($master);
+		    reset_slave($slave);
+		    attach($master, $slave);
+		    ok_wait_start_replication($slave, 0.1);
+		    $need_restart_rep= 0;
+		}
+		if ($types->{$pair->{"from_orig"}}->{"engines"})
+		{
+		    if ( join(",", @{$types->{$pair->{"from_orig"}}->{"engines"}}) !~ qr/$option_set_from->{"engine"}/i)
+		    {
+			$skip_pair= 1;
+			$test_desc= "Engine " . $option_set_from->{"engine"} . " on master does not support type $type_from";		
+			$test_error= "TER_MASTER_ENGINE_WRONG_TYPE";
+		    }    	    
+		}
+		if ($types->{$pair->{"to_orig"}}->{"engines"})
+		{
+		    if ( join(",", @{$types->{$pair->{"to_orig"}}->{"engines"}}) !~ qr/$option_set_to->{"engine"}/i)
+		    {
+			$skip_pair= 1;
+			$test_desc= "Engine " . $option_set_to->{"engine"} . " on slave does not support type $type_to";		
+			$test_error= "TER_SLAVE_ENGINE_WRONG_TYPE";
+		    }    	    
+		}
+		if ($skip_pair == 0)
+		{
+		    ok_sql ( $master, "DROP TABLE IF EXISTS t_test,t_orig;" );
+		    ok_sql ( $master, "CREATE TABLE t_test (col_num INT NOT NULL, col_test $type_from, col_info VARCHAR(250)) $engine_from;" );	        
+		    ok_sql ( $master, "CREATE TABLE t_orig (col_num INT NOT NULL, col_test $type_from, col_info VARCHAR(250)) $engine_from;" );	        
+		    $rs= sql( $master, "SHOW CREATE TABLE t_test;" );	        
+		    @rs_data= get_next($rs);
+		    if (scalar(@rs_data) >= 2)
+		    {
+			if ($rs_data[1] !~ qr/$engine_from/i)
+			{
+			    $_= $rs_data[1];
+			    s/\n//g;
+	    		    vprint(1, "... unable to set $engine_from on master: $_\n");
+			    $counter++;
+			}	
+		    }
+		    else
+		    {
+	    		vprint(1, "$counter ERROR:    $test_info\n    unable to create table on master\n");
+			$counter++;
+			next;
+		    }
+		    ok_synchronize ( $master, $slave );
+		    ok_sql ( $slave, "DROP TABLE IF EXISTS t_test,t_conv;" );	        
+		    ok_sql ( $slave, "CREATE TABLE t_test (col_num INT NOT NULL, col_test $type_to, col_info VARCHAR(250)) $engine_to;" );	        
+		    ok_sql ( $slave, "CREATE TABLE t_conv (col_num INT NOT NULL, col_test $type_from, col_info VARCHAR(250)) $engine_from;" );	        
+		    $rs= sql( $slave, "SHOW CREATE TABLE t_test;" );	        
+		    @rs_data= get_next($rs);
+		    if (scalar(@rs_data) >= 2)
+		    {
+			if ($rs_data[1] !~ qr/$engine_to/i)
+			{
+			    $_= $rs_data[1];
+			    s/\n//g;
+	    		    vprint(1, "$counter ERROR:    $test_info\n    unable to set $engine_to on slave: $_\n");
+			    $counter++;
+			    next;
+			}	
+		    }
+		    else
+		    {
+	    		vprint(1, "$counter ERROR:    $test_info\n    unable to create table on slave\n");
+			$counter++;
+			next;
+		    }
+		    my $test_ok= 1;
+		    $test_error= "";
+		    if ($types->{$pair->{"from_orig"}}->{"query_before"})
+		    {
+			ok_sql ( $master, $types->{$pair->{"from_orig"}}->{"query_before"}.";" );
+		    }
+		    # create inserts
+		    my $i= 1;
+		    foreach my $test_value (@$values_from)
+		    {
+			sql ( $master, "INSERT INTO t_test VALUES ($i, $test_value, \"$counter. $i. $type_from -> $type_to\");");				
+			sql ( $master, "INSERT INTO t_orig VALUES ($i, $test_value, \"$counter. $i. $type_from -> $type_to\");");				
+			$i++;
+		    }
+		    $err= 0;
+		    synchronize ( $master, $slave );
+		    my $sync= sync($master, $slave);
+		    if ($sync == 0)
+		    {
+			$rs= sql ($slave, "SELECT COUNT(*) FROM t_test;");
+			@rs_data= get_next($rs);
+			if ($rs_data[0] == scalar(@$values_from))
+			{
+			    # convert data
+			    ok_sql ( $slave, "INSERT INTO t_conv (SELECT * FROM t_test);" );				    		
+			    $i= 1;
+			    foreach my $test_value (@$values_from)
+			    {		    
+				if ($test_value =~ m/NULL/)
+				{
+				    $slave_query= "SELECT COUNT(*) FROM t_orig,t_conv WHERE t_orig.col_num = t_conv.col_num AND t_orig.col_num = $i AND t_orig.col_test IS NULL AND t_conv.col_test IS NULL;";	
+				}
+				else
+				{
+    				    $slave_query= "SELECT COUNT(*) FROM t_orig,t_conv WHERE t_orig.col_num = t_conv.col_num AND t_orig.col_num = $i AND t_orig.col_test = t_conv.col_test";	
+    				}
+    				$rs= sql ($slave, $slave_query);
+    				if ( !is_error($rs) )
+    				{    			
+        			    @rs_data= get_next($rs);
+    				    if ($rs_data[0])
+    				    {
+    					if ($rs_data[0] == 0)
+    					{
+    					    $test_ok= 0;
+    					    $test_error= "TER_DATA_NOT_EQ";    				
+    					    $test_desc= "Data for row $i is not equal";    				
+    					}
+    				    }
+    				    else
+    				    {
+    					$test_ok= 0;
+    					$test_error= "TER_NO_DATA";
+    					$test_desc= "No data for row $i ($test_value)";    				    				
+    				    }
+				}
+    				else
+    				{
+    				    $test_ok= 0;    		    
+    				    $test_error= $errors->{get_errors_code($rs)};    		
+    				    $test_desc= "Error for query $slave_query";    				
+    				}   	    
+    				$i++;
+			    }
+			}
+			else
+			{
+			    # not replicated
+			    $test_ok= 0;
+			    $test_error= "TER_WRONG_ROW_NUM";
+    			    $test_desc= "Some rows are not replicated (" . $rs_data[0] . "/" . scalar(@$values_from) . ")";    				    		    
+			}
+		    }
+		    else
+		    {
+			# not sync
+    			$test_ok= 0;
+    			$err= retrieve_slave_status($slave, "Last_SQL_Errno");
+    			if ($err =~ /[0-9]{2,4}/)
+    			{
+    	    		    $test_error= $errors->{$err};
+    			    $test_desc= "Slave SQL thread stopped with error";    				
+    			}
+    			else
+    			{
+    	    		    $test_error= "TER_SYNC";
+    			    $test_desc= "Slave are not synchronized with master";    				
+    			}
+    			$need_restart_rep= 1;
+		    }	    
+		    if ($test_ok == 1)
+    		    {
+    			vprint(2, "$counter OK:   $test_info\n");
+    			$matrix_cur->{$matrix_key}->{"result"} =  "OK";
+    		    }    
+    		    else
+    		    {
+    			vprint(2, "$counter $test_error:   $test_info\n");
+    			$matrix_cur->{$matrix_key}->{"result"} =  $test_error;
+    			#$matrix_cur->{$matrix_key}->{"description"} =  $test_desc;
+    		    }
+    		}
+    		else
+    		{
+    		    vprint(2, "$counter $test_error:   $test_info\n");
+    		    $matrix_cur->{$matrix_key}->{"result"}= $test_error;
+    		    #$matrix_cur->{$matrix_key}->{"description"} =  $test_desc;
+    		    $skip_pair= 0;
+    		}
+    		if (defined $matrix_cur->{$matrix_key}->{"result"} && defined $matrix_orig->{$matrix_key}->{"result"})
+    		{
+    		    if ($matrix_cur->{$matrix_key}->{"result"} ne $matrix_orig->{$matrix_key}->{"result"})
+    		    {
+    			vprint(0, "$counter DIFF:   $test_info\n    expected:" . $matrix_orig->{$matrix_key}->{"result"} . "    got:" . $matrix_cur->{$matrix_key}->{"result"} . "\n") unless ($rep::data_types::config::record > 0);    	    
+    		    }
+    		}
+    		else
+    		{
+    		    vprint(0, "$counter DIFF_NO_DATA:   $test_info\n") unless ($rep::data_types::config::record > 0);    	    
+    		}
+    		$counter++;
+    	    }
+    	}
+    }
+}
+
+
+sub exit_from_test
+{
+    my ($code, $text)= @_;
+    print $text . "\n";
+    return $code;
+}
+
+return 1;
+
+END {}
+
+

=== added file 'suites/rep/data_types_charset.pm'
--- a/suites/rep/data_types_charset.pm	1970-01-01 00:00:00 +0000
+++ b/suites/rep/data_types_charset.pm	2009-05-18 09:07:00 +0000
@@ -0,0 +1,206 @@
+package rep::data_types_charset;
+use Exporter;
+our @ISA = qw(Exporter My::Nuts::Library::Tests::SimpleTest);
+use strict;
+use warnings;
+use My::Nuts::Library::Kernel::Server;
+use My::Nuts::Library::Kernel::Manager;
+use My::Nuts::Library::Kernel::Result;
+use My::Nuts::Library::Tests::SimpleTest;
+use My::Nuts::Library::Kernel::Replication;
+use Test::More;
+use Storable;
+
+# Test configuration
+require "data_types/config_charset.pl";
+require "data_types/matrix.pl";
+
+# Internal variables
+our $types = {};
+our $matrix = [];
+our $errors = {};
+our $master_options = [];
+our $slave_options = [];
+our $matrix_orig = {};
+our $matrix_cur = {};
+our $counter= 1;
+
+sub prepare
+{
+    # Get error codes
+    $errors= rep::data_types::matrix::get_error_msgs($rep::data_types::config::error_messages_file);
+    # Read stored matrix
+    $matrix_orig= rep::data_types::matrix::retrieve_matrix($rep::data_types::config::matrix_file);
+    # Read config file for data types
+    $types= rep::data_types::matrix::get_data_types($rep::data_types::config::data_types_config_file);
+    # Generate array of pairs of types (matrix)
+    $matrix= rep::data_types::matrix::generate_matrix(
+	{
+	    "data_types" => 	$types,
+	    "mode" => 		
+	    {
+		"group" => 	"string",
+		"null" => 	"NOT NULL",
+	    },
+	}
+    );
+    vprint(1, "\nFound " . scalar(@$matrix) . " combinations\n");
+    $matrix= add_charsets($matrix, $rep::data_types::config::charsets);
+    vprint(1, "Extended with charsets and collations to " . scalar(@$matrix) . "\n");
+    rep::data_types::matrix::report_matrix(
+	{
+	    "matrix" =>		$matrix_orig, 
+	    "filename" =>	$rep::data_types::config::matrix_report_file . ".orig.html"
+	}
+    );
+    # Read master options
+    $master_options= rep::data_types::matrix::get_server_options(
+	{
+	    "server_options" => 	$rep::data_types::config::server_options, 
+	    "filter" => 		"master"
+	}
+    );
+    # Read slave options
+    $slave_options= rep::data_types::matrix::get_server_options(
+	{
+	    "server_options" => 	$rep::data_types::config::server_options, 
+	    "filter" => 		"slave"
+	}
+    );
+    vprint(1, "Extended with server options to " . (scalar(@$matrix) * scalar(@$master_options) * scalar(@$slave_options)) . "\n");
+    return;
+}
+
+sub startup
+{
+    return;
+}
+
+sub fire
+{
+    my ($test) = @_;
+    my $master = server ($test);
+    my $slave   = server ($test);
+    my $dbname  = "test";
+    plan tests => 12342;
+    
+    # Setup topology
+    attach ( $master, $slave );
+
+    # Initial workload
+    ok_sql ( $master, "CREATE DATABASE IF NOT EXISTS " . $dbname );
+    ok_sql ( $master, "USE " . $dbname );
+    ok_sql ( $slave, "USE " . $dbname );
+    rep::data_types::matrix::test_matrix(
+	{
+	    "master" =>		$master, 
+	    "slave" => 		$slave, 
+	    "master_options" =>	$master_options, 
+	    "slave_options" =>	$slave_options,
+	    "data_types" => 	$types, 
+	    "matrix" => 	$matrix, 
+	    "errors" =>		$errors, 
+	    "current_matrix" =>	$matrix_cur, 
+	    "original_matrix"=>	$matrix_orig
+	}
+    );
+    $matrix_cur->{"info"}->{"created"}= localtime();
+    #rep::data_types::matrix::report_matrix(
+    #	{
+    #	    "matrix"=> $matrix_cur, 
+    #	    "filename"=> $rep::data_types::config::matrix_report_file . ".cur.html"
+    #	}
+    #);
+}
+
+sub add_charsets()
+{
+    my ($matrix, $charsets)= @_;    
+    my $char_coll= [];
+    my $matrix_cl= [];
+    foreach my $group (keys %$charsets)
+    {
+	my @csets= ($group);
+	if ($group =~ m/\,/i)
+	{
+	    @csets= split(",", $group);
+	}
+	foreach my $cset (@csets)
+	{
+	    foreach my $coll (@{$charsets->{$group}})
+	    {
+		push(@$char_coll, {"charset"=>$cset, "collation"=>"$cset$coll"})	
+	    }
+	}
+    }
+    foreach my $pair (@$matrix)
+    {
+	foreach my $from_cs (@$char_coll)
+	{
+	    foreach my $to_cs (@$char_coll)
+	    {
+		my %pair_h= ();
+		%pair_h= %$pair;
+		my $pair_cl= \%pair_h;
+		$_= " CHARACTER SET " . $from_cs->{"charset"} . " COLLATE " . $from_cs->{"collation"};
+		$pair_cl->{"from"} =~ s/ /$_ /; 
+		$_= " CHARACTER SET " . $to_cs->{"charset"} . " COLLATE " . $to_cs->{"collation"};
+		$pair_cl->{"to"} =~ s/ /$_ /; 
+		push(@$matrix_cl, $pair_cl);
+		#print $matrix_cl->[scalar(@$matrix_cl)-1]->{"from"} . " -> " . $matrix_cl->[scalar(@$matrix_cl)-1]->{"to"} . "\n\n";		
+	    }
+	}
+    }
+    return $matrix_cl;
+}
+
+
+sub vprint()
+{
+    my $vmode= shift;
+    my $text= shift;
+    if ($rep::data_types::config::verbose >= $vmode) 
+    {
+	print $text;
+    }
+}
+
+sub sync()
+{
+    my ($master,$slave)= @_;
+    if (
+	(retrieve_master_status($master, "Position") eq retrieve_slave_status($slave, "Exec_Master_Log_Pos")) &&
+	(retrieve_slave_status($slave, "Slave_IO_Running") =~ m/yes/i) &&
+	(retrieve_slave_status($slave, "Slave_SQL_Running") =~ m/yes/i))
+    {
+	return 0;
+    }
+    else
+    {
+	return 1;
+    }
+}
+
+sub exit_from_test
+{
+    my ($code, $text)= @_;
+    print $text . "\n";
+    return $code;
+}
+
+sub shutdown
+{
+    return;
+}
+1;
+__END__;
+
+=head1 NAME
+
+rep::data_types
+
+=head1 SYNOPSIS
+
+Matrix builder
+
+=back

=== added file 'suites/rep/data_types_eq.pm'
--- a/suites/rep/data_types_eq.pm	1970-01-01 00:00:00 +0000
+++ b/suites/rep/data_types_eq.pm	2009-05-18 09:07:00 +0000
@@ -0,0 +1,151 @@
+package rep::data_types_eq;
+use Exporter;
+our @ISA = qw(Exporter My::Nuts::Library::Tests::SimpleTest);
+use strict;
+use warnings;
+use My::Nuts::Library::Kernel::Server;
+use My::Nuts::Library::Kernel::Manager;
+use My::Nuts::Library::Kernel::Result;
+use My::Nuts::Library::Tests::SimpleTest;
+use My::Nuts::Library::Kernel::Replication;
+use Test::More;
+use Storable;
+
+# Test configuration
+require "data_types/config_eq.pl";
+require "data_types/matrix.pl";
+
+# Internal variables
+our $types = {};
+our $matrix = [];
+our $errors = {};
+our $master_options = [];
+our $slave_options = [];
+our $matrix_orig = {};
+our $matrix_cur = {};
+our $counter= 1;
+
+sub prepare
+{
+    # Get error codes
+    $errors= rep::data_types::matrix::get_error_msgs($rep::data_types::config::error_messages_file);
+    # Read stored matrix
+    $matrix_orig= rep::data_types::matrix::retrieve_matrix($rep::data_types::config::matrix_file);
+    # Read config file for data types
+    $types= rep::data_types::matrix::get_data_types($rep::data_types::config::data_types_config_file);
+    # Generate array of pairs of types (matrix)
+    $matrix= rep::data_types::matrix::generate_matrix(
+	{
+	    "data_types" => 	$types,
+	    "mode" => 		{ "collect" => "equal" }
+	}
+    );
+    # Read master options
+    $master_options= rep::data_types::matrix::get_server_options(
+	{
+	    "server_options" => 	$rep::data_types::config::server_options, 
+	    "filter" => 		"master"
+	}
+    );
+    # Read slave options
+    $slave_options= rep::data_types::matrix::get_server_options(
+	{
+	    "server_options" => 	$rep::data_types::config::server_options, 
+	    "filter" => 		"slave"
+	}
+    );
+    vprint(1, "\nFound " . scalar(@$matrix) . " combinations, extended with server options to " . (scalar(@$matrix) * scalar(@$master_options) * scalar(@$slave_options)) . "\n");
+    return;
+}
+
+sub startup
+{
+    return;
+}
+
+sub fire
+{
+    my ($test) = @_;
+    my $master = server ($test);
+    my $slave   = server ($test);
+    my $dbname  = "test";
+    plan tests => 12342;
+    
+    # Setup topology
+    attach ( $master, $slave );
+
+    # Initial workload
+    ok_sql ( $master, "CREATE DATABASE IF NOT EXISTS " . $dbname );
+    ok_sql ( $master, "USE " . $dbname );
+    ok_sql ( $slave, "USE " . $dbname );
+    rep::data_types::matrix::test_matrix(
+	{
+	    "master" =>		$master, 
+	    "slave" => 		$slave, 
+	    "master_options" =>	$master_options, 
+	    "slave_options" =>	$slave_options,
+	    "data_types" => 	$types, 
+	    "matrix" => 	$matrix, 
+	    "errors" =>		$errors, 
+	    "current_matrix" =>	$matrix_cur, 
+	    "original_matrix"=>	$matrix_orig
+	}
+    );
+    $matrix_cur->{"info"}->{"created"}= localtime();
+    #rep::data_types::matrix::report_matrix(
+    #	{
+    #	    "matrix"=> $matrix_cur, 
+    #	    "filename"=> $rep::data_types::config::matrix_report_file . ".cur.html"
+    #	}
+    #);
+}
+
+sub vprint()
+{
+    my $vmode= shift;
+    my $text= shift;
+    if ($rep::data_types::config::verbose >= $vmode) 
+    {
+	print $text;
+    }
+}
+
+sub sync()
+{
+    my ($master,$slave)= @_;
+    if (
+	(retrieve_master_status($master, "Position") eq retrieve_slave_status($slave, "Exec_Master_Log_Pos")) &&
+	(retrieve_slave_status($slave, "Slave_IO_Running") =~ m/yes/i) &&
+	(retrieve_slave_status($slave, "Slave_SQL_Running") =~ m/yes/i))
+    {
+	return 0;
+    }
+    else
+    {
+	return 1;
+    }
+}
+
+sub exit_from_test
+{
+    my ($code, $text)= @_;
+    print $text . "\n";
+    return $code;
+}
+
+sub shutdown
+{
+    return;
+}
+1;
+__END__;
+
+=head1 NAME
+
+rep::data_types
+
+=head1 SYNOPSIS
+
+Matrix builder
+
+=back

=== added file 'suites/rep/data_types_main.pm'
--- a/suites/rep/data_types_main.pm	1970-01-01 00:00:00 +0000
+++ b/suites/rep/data_types_main.pm	2009-05-18 09:07:00 +0000
@@ -0,0 +1,161 @@
+package rep::data_types_main;
+use Exporter;
+our @ISA = qw(Exporter My::Nuts::Library::Tests::SimpleTest);
+use strict;
+use warnings;
+use My::Nuts::Library::Kernel::Server;
+use My::Nuts::Library::Kernel::Manager;
+use My::Nuts::Library::Kernel::Result;
+use My::Nuts::Library::Tests::SimpleTest;
+use My::Nuts::Library::Kernel::Replication;
+use Test::More;
+use Storable;
+
+# Test configuration
+require "data_types/config.pl";
+require "data_types/matrix.pl";
+
+# Internal variables
+our $types = {};
+our $matrix = [];
+our $errors = {};
+our $master_options = [];
+our $slave_options = [];
+our $matrix_orig = {};
+our $matrix_cur = {};
+our $counter= 1;
+
+sub prepare
+{
+    # Get error codes
+    $errors= rep::data_types::matrix::get_error_msgs($rep::data_types::config::error_messages_file);
+    # Read stored matrix
+    $matrix_orig= rep::data_types::matrix::retrieve_matrix($rep::data_types::config::matrix_file);
+    # Read config file for data types
+    $types= rep::data_types::matrix::get_data_types($rep::data_types::config::data_types_config_file);
+    # Generate array of pairs of types (matrix)
+    $matrix= rep::data_types::matrix::generate_matrix(
+	{
+	    "data_types" => 	$types,
+	    "mode" => 		{}
+	}
+    );
+    rep::data_types::matrix::report_matrix(
+	{
+	    "matrix" =>		$matrix_orig, 
+	    "filename" =>	$rep::data_types::config::matrix_report_file . ".orig.html"
+	}
+    );
+    # Read master options
+    $master_options= rep::data_types::matrix::get_server_options(
+	{
+	    "server_options" => 	$rep::data_types::config::server_options, 
+	    "filter" => 		"master"
+	}
+    );
+    # Read slave options
+    $slave_options= rep::data_types::matrix::get_server_options(
+	{
+	    "server_options" => 	$rep::data_types::config::server_options, 
+	    "filter" => 		"slave"
+	}
+    );
+    vprint(1, "\nFound " . scalar(@$matrix) . " combinations, extended with server options to " . (scalar(@$matrix) * scalar(@$master_options) * scalar(@$slave_options)) . "\n");
+    return;
+}
+
+sub startup
+{
+    return;
+}
+
+sub fire
+{
+    my ($test) = @_;
+    my $master = server ($test);
+    my $slave   = server ($test);
+    my $dbname  = "test";
+    plan tests => 1;
+    
+    # Setup topology
+    attach ( $master, $slave );
+
+    # Initial workload
+    ok_sql ( $master, "CREATE DATABASE IF NOT EXISTS " . $dbname );
+    ok_sql ( $master, "USE " . $dbname );
+    ok_sql ( $slave, "USE " . $dbname );
+    rep::data_types::matrix::test_matrix(
+	{
+	    "master" =>		$master, 
+	    "slave" => 		$slave, 
+	    "master_options" =>	$master_options, 
+	    "slave_options" =>	$slave_options,
+	    "data_types" => 	$types, 
+	    "matrix" => 	$matrix, 
+	    "errors" =>		$errors, 
+	    "current_matrix" =>	$matrix_cur, 
+	    "original_matrix"=>	$matrix_orig
+	}
+    );
+	    #rep::data_types::matrix::store_matrix($matrix_cur, $rep::data_types::config::matrix_file);	    
+    if (!-e $rep::data_types::config::matrix_file || $rep::data_types::config::record > 0)
+    {
+	rep::data_types::matrix::store_matrix($matrix_cur, $rep::data_types::config::matrix_file)
+    }
+    rep::data_types::matrix::report_matrix(
+	{
+	    "matrix"=> $matrix_cur, 
+	    "filename"=> $rep::data_types::config::matrix_report_file . ".cur.html"
+	}
+    );
+}
+
+sub vprint()
+{
+    my $vmode= shift;
+    my $text= shift;
+    if ($rep::data_types::config::verbose >= $vmode) 
+    {
+	print $text;
+    }
+}
+
+sub sync()
+{
+    my ($master,$slave)= @_;
+    if (
+	(retrieve_master_status($master, "Position") eq retrieve_slave_status($slave, "Exec_Master_Log_Pos")) &&
+	(retrieve_slave_status($slave, "Slave_IO_Running") =~ m/yes/i) &&
+	(retrieve_slave_status($slave, "Slave_SQL_Running") =~ m/yes/i))
+    {
+	return 0;
+    }
+    else
+    {
+	return 1;
+    }
+}
+
+sub exit_from_test
+{
+    my ($code, $text)= @_;
+    print $text . "\n";
+    return $code;
+}
+
+sub shutdown
+{
+    return;
+}
+1;
+__END__;
+
+=head1 NAME
+
+rep::data_types
+
+=head1 SYNOPSIS
+
+Matrix builder
+
+=back

Thread
bzr commit into nuts branch (Serge.Kozlov:319) WL#4840 WL#4845 WL#4853WL#4854Serge Kozlov18 May