From: Vincent Bachelier Date: Fri, 2 Sep 2011 09:32:21 +0000 (+0200) Subject: test quoted for mysql X-Git-Tag: v0.11009~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ab15e426881522ca7db31ca58a36a25826c3686e;p=dbsrgits%2FSQL-Translator.git test quoted for mysql --- diff --git a/t/38-mysql-producer.t b/t/38-mysql-producer.t index f5691d5..2305f4f 100644 --- a/t/38-mysql-producer.t +++ b/t/38-mysql-producer.t @@ -19,7 +19,7 @@ use FindBin qw/$Bin/; #============================================================================= BEGIN { - maybe_plan(40, + maybe_plan(72, 'YAML', 'SQL::Translator::Producer::MySQL', 'Test::Differences', @@ -279,6 +279,7 @@ my $mysql_out = join(";\n\n", @stmts_no_drop) . ";\n\n"; ############################################################################### # New alter/add subs +{ my $table = SQL::Translator::Schema::Table->new( name => 'mytable'); my $field1 = SQL::Translator::Schema::Field->new( name => 'myfield', @@ -516,3 +517,250 @@ EOV is($sql, "my$type $type", "Skip length param for type $type"); } } + +} #non quoted test + +{ + #Quoted test + my $table = SQL::Translator::Schema::Table->new( name => 'mydb.mytable'); + + my $field1 = SQL::Translator::Schema::Field->new( name => 'myfield', + table => $table, + data_type => 'VARCHAR', + size => 10, + default_value => undef, + is_auto_increment => 0, + is_nullable => 1, + is_foreign_key => 0, + is_unique => 0 ); + + + my $field2 = SQL::Translator::Schema::Field->new( name => 'myfield', + table => $table, + data_type => 'VARCHAR', + size => 25, + default_value => undef, + is_auto_increment => 0, + is_nullable => 0, + is_foreign_key => 0, + is_unique => 0 ); + + my $field3 = SQL::Translator::Schema::Field->new( name => 'myfield', + table => $table, + data_type => 'boolean', + is_nullable => 0, + is_foreign_key => 0, + is_unique => 0 ); + + + my $qt = '`'; + my $qf = '`'; + my $options = { + quote_table_names => $qt, + quote_field_names => $qf, + }; + + + my $alter_field = SQL::Translator::Producer::MySQL::alter_field($field1, $field2, $options); + is($alter_field, 'ALTER TABLE `mydb`.`mytable` CHANGE COLUMN `myfield` `myfield` VARCHAR(25) NOT NULL', 'Alter field works'); + + my $add_field = SQL::Translator::Producer::MySQL::add_field($field1, $options); + + is($add_field, 'ALTER TABLE `mydb`.`mytable` ADD COLUMN `myfield` VARCHAR(10)', 'Add field works'); + + my $drop_field = SQL::Translator::Producer::MySQL::drop_field($field2, $options); + is($drop_field, 'ALTER TABLE `mydb`.`mytable` DROP COLUMN `myfield`', 'Drop field works'); + + my $field3_sql = SQL::Translator::Producer::MySQL::create_field($field3, { mysql_version => 4.1, %$options }); +is($field3_sql, '`myfield` boolean NOT NULL', 'For Mysql >= 4, use boolean type'); +$field3_sql = SQL::Translator::Producer::MySQL::create_field($field3, { mysql_version => 3.22, %$options }); +is($field3_sql, "`myfield` enum('0','1') NOT NULL", 'For Mysql < 4, use enum for boolean type'); +$field3_sql = SQL::Translator::Producer::MySQL::create_field($field3,$options); +is($field3_sql, "`myfield` enum('0','1') NOT NULL", 'When no version specified, use enum for boolean type'); + + my $number_sizes = { + '3, 2' => 'double', + 12 => 'bigint', + 1 => 'tinyint', + 4 => 'int', + }; + for my $size (keys %$number_sizes) { + my $expected = $number_sizes->{$size}; + my $number_field = SQL::Translator::Schema::Field->new( + name => "numberfield_$expected", + table => $table, + data_type => 'number', + size => $size, + is_nullable => 1, + is_foreign_key => 0, + is_unique => 0 + ); + + is( + SQL::Translator::Producer::MySQL::create_field($number_field, $options), + "`numberfield_$expected` $expected($size)", + "Use $expected for NUMBER types of size $size" + ); + } + + my $varchars; + for my $size (qw/255 256 65535 65536/) { + $varchars->{$size} = SQL::Translator::Schema::Field->new( + name => "vch_$size", + table => $table, + data_type => 'varchar', + size => $size, + is_nullable => 1, + ); + } + + + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{255}, { mysql_version => 5.000003, %$options }), + '`vch_255` varchar(255)', + 'VARCHAR(255) is not substituted with TEXT for Mysql >= 5.0.3' + ); + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{255}, { mysql_version => 5.0, %$options }), + '`vch_255` varchar(255)', + 'VARCHAR(255) is not substituted with TEXT for Mysql < 5.0.3' + ); + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{255}, $options), + '`vch_255` varchar(255)', + 'VARCHAR(255) is not substituted with TEXT when no version specified', + ); + + + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{256}, { mysql_version => 5.000003, %$options }), + '`vch_256` varchar(256)', + 'VARCHAR(256) is not substituted with TEXT for Mysql >= 5.0.3' + ); + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{256}, { mysql_version => 5.0, %$options }), + '`vch_256` text', + 'VARCHAR(256) is substituted with TEXT for Mysql < 5.0.3' + ); + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{256}, $options), + '`vch_256` text', + 'VARCHAR(256) is substituted with TEXT when no version specified', + ); + + + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{65535}, { mysql_version => 5.000003, %$options }), + '`vch_65535` varchar(65535)', + 'VARCHAR(65535) is not substituted with TEXT for Mysql >= 5.0.3' + ); + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{65535}, { mysql_version => 5.0, %$options }), + '`vch_65535` text', + 'VARCHAR(65535) is substituted with TEXT for Mysql < 5.0.3' + ); + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{65535}, $options), + '`vch_65535` text', + 'VARCHAR(65535) is substituted with TEXT when no version specified', + ); + + + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{65536}, { mysql_version => 5.000003, %$options }), + '`vch_65536` text', + 'VARCHAR(65536) is substituted with TEXT for Mysql >= 5.0.3' + ); + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{65536}, { mysql_version => 5.0, %$options }), + '`vch_65536` text', + 'VARCHAR(65536) is substituted with TEXT for Mysql < 5.0.3' + ); + is ( + SQL::Translator::Producer::MySQL::create_field($varchars->{65536}, $options), + '`vch_65536` text', + 'VARCHAR(65536) is substituted with TEXT when no version specified', + ); + + { + my $view1 = SQL::Translator::Schema::View->new( name => 'view_foo', + fields => [qw/id name/], + sql => 'SELECT `id`, `name` FROM `my`.`thing`', + extra => { + mysql_definer => 'CURRENT_USER', + mysql_algorithm => 'MERGE', + mysql_security => 'DEFINER', + }); + my $create_opts = { add_replace_view => 1, no_comments => 1, %$options }; + my $view1_sql1 = SQL::Translator::Producer::MySQL::create_view($view1, $create_opts); + + my $view_sql_replace = <<'EOV'; +CREATE OR REPLACE + ALGORITHM = MERGE + DEFINER = CURRENT_USER + SQL SECURITY DEFINER + VIEW `view_foo` ( `id`, `name` ) AS + SELECT `id`, `name` FROM `my`.`thing` +EOV + + is($view1_sql1, $view_sql_replace, 'correct "CREATE OR REPLACE VIEW" SQL'); + + + my $view2 = SQL::Translator::Schema::View->new( name => 'view_foo', + fields => [qw/id name/], + sql => 'SELECT `id`, `name` FROM `my`.`thing`',); + my $create2_opts = { add_replace_view => 0, no_comments => 1, %$options }; + my $view1_sql2 = SQL::Translator::Producer::MySQL::create_view($view2, $create2_opts); + my $view_sql_noreplace = <<'EOV'; +CREATE + VIEW `view_foo` ( `id`, `name` ) AS + SELECT `id`, `name` FROM `my`.`thing` +EOV + + is($view1_sql2, $view_sql_noreplace, 'correct "CREATE VIEW" SQL'); + + { + my %extra = $view1->extra; + is_deeply \%extra, + { + 'mysql_algorithm' => 'MERGE', + 'mysql_definer' => 'CURRENT_USER', + 'mysql_security' => 'DEFINER' + }, + 'Extra attributes'; + } + + $view1->remove_extra(qw/mysql_definer mysql_security/); + { + my %extra = $view1->extra; + is_deeply \%extra, { 'mysql_algorithm' => 'MERGE', }, 'Extra attributes after first reset_extra call'; + } + + $view1->remove_extra(); + { + my %extra = $view1->extra; + is_deeply \%extra, {}, 'Extra attributes completely removed'; + } + } + + { + + # certain types do not support a size, see also: + # http://dev.mysql.com/doc/refman/5.1/de/create-table.html + for my $type (qw/date time timestamp datetime year/) { + my $field = SQL::Translator::Schema::Field->new( + name => "my$type", + table => $table, + data_type => $type, + size => 10, + default_value => undef, + is_auto_increment => 0, + is_nullable => 1, + is_foreign_key => 0, + is_unique => 0 + ); + my $sql = SQL::Translator::Producer::MySQL::create_field($field, $options); + is($sql, "`my$type` $type", "Skip length param for type $type"); + } + } +}