From: Arthur Axel 'fREW' Schmidt Date: Sat, 26 Mar 2011 03:45:52 +0000 (-0500) Subject: mysql tests X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=a53284b5c8cb36e4728ba13aa83bf59c5d826232;p=dbsrgits%2FDBIx-Class.git mysql tests --- diff --git a/lib/DBIx/Class/SQLMaker/MySQL.pm b/lib/DBIx/Class/SQLMaker/MySQL.pm index 555c8c7..542fcb5 100644 --- a/lib/DBIx/Class/SQLMaker/MySQL.pm +++ b/lib/DBIx/Class/SQLMaker/MySQL.pm @@ -77,11 +77,22 @@ sub _datetime_now_sql { 'NOW()' } unless exists $part_map{$_[1]}; "EXTRACT($part_map{$_[1]} FROM $_[2])" } + sub _reorder_add_datetime_vars { + my ($self, $amount, $date) = @_; + + return ($date, $amount); + } sub _datetime_add_sql { die $_[0]->_unsupported_date_adding($_[1], 'MySQL') unless exists $diff_part_map{$_[1]}; "DATE_ADD($_[2], INTERVAL $_[3] $diff_part_map{$_[1]})" } + sub _reorder_diff_datetime_vars { + my ($self, $d1, $d2) = @_; + + return ($d2, $d1); + } + sub _datetime_diff_sql { die $_[0]->_unsupported_date_diff($_[1], 'MySQL') unless exists $diff_part_map{$_[1]}; diff --git a/t/sqlmaker/op_dt.t b/t/sqlmaker/op_dt.t index 1a035fa..3c22901 100644 --- a/t/sqlmaker/op_dt.t +++ b/t/sqlmaker/op_dt.t @@ -53,6 +53,35 @@ $s; DBICTest->init_schema( no_deploy=> 1, storage_type => '::DBI::MSSQL' ) } }, + mysql => do { + my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/}; + if ($dsn && $user) { + my $s = DBICTest::Schema->connect($dsn, $user, $pass); + try { $s->storage->ensure_connected }; + + $s->storage->dbh_do (sub { + my ($storage, $dbh) = @_; + eval { $dbh->do("DROP TABLE event") }; + $dbh->do(<<'SQL'); +CREATE TABLE event ( + id INT AUTO_INCREMENT NOT NULL, + starts_at DATE NOT NULL, + created_on DATETIME NOT NULL, + varchar_date VARCHAR(20), + varchar_datetime VARCHAR(20), + skip_inflation DATETIME, + ts_without_tz DATETIME, + + primary key(id) +) +SQL + $dbs_to_test{mysql} = 1; +}); +$s; + } else { + DBICTest->init_schema( no_deploy=> 1, storage_type => '::DBI::mysql' ) + } + }, ## copypasta'd for great justice postgres => do { my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/}; @@ -140,6 +169,12 @@ $rs{mssql}->populate([ ['2010-12-12', '2011-12-14 12:12:12.000', '2011-12-12 12:12:12.000'], ]) if $schema{mssql}->storage->connected; +$rs{mysql}->populate([ + [qw(starts_at created_on skip_inflation)], + ['2010-12-12', '2010-12-14 12:12:12.000', '2019-12-12 12:12:12.000'], + ['2010-12-12', '2011-12-14 12:12:12.000', '2011-12-12 12:12:12.000'], +]) if $schema{mysql}->storage->connected; + $rs{postgres}->populate([ [qw(starts_at created_on skip_inflation)], ['2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12'], @@ -175,7 +210,7 @@ my $date2 = $date->clone->set_day(16); ## search => { dbic_search_code/params } ## rdbms_name => literal_sql my @tests = ( -## -dt-now tests + { search => { 'me.created_on' => { -dt => $date } }, sqlite => { @@ -190,6 +225,12 @@ my @tests = ( bind => [[{ dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12.000' ]], hri => [hri_thing('2010-12-12', '2010-12-14 12:12:12.000', '2019-12-12 12:12:12.000')], }, + mysql => { + select => 'me.starts_at, me.created_on, me.skip_inflation', + where => 'me.created_on = ?', + bind => [[{ dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12' ]], + hri => [hri_thing('2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12')], + }, postgres => { select => 'me.starts_at, me.created_on, me.skip_inflation', where => 'me.created_on = ?', @@ -204,7 +245,7 @@ my @tests = ( }, msg => '-dt_now works', }, -## -dt_year tests + { search => { 'me.id' => 1 }, select => [ [ -dt_year => { -ident => 'me.created_on' } ] ], @@ -215,6 +256,12 @@ my @tests = ( bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]], hri => [{ year => 2010 }], }, + mysql => { + select => "EXTRACT(YEAR FROM me.created_on)", + where => "me.id = ?", + bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]], + hri => [{ year => 2010 }], + }, sqlite => { select => "STRFTIME('%Y', me.created_on)", where => "me.id = ?", @@ -247,6 +294,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]], hri => [{ year => 2010, month => 12 }], }, + mysql => { + select => "EXTRACT(YEAR FROM me.created_on), EXTRACT(MONTH FROM me.created_on)", + where => "me.id = ?", + bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]], + hri => [{ year => 2010, month => 12 }], + }, sqlite => { select => "STRFTIME('%Y', me.created_on), STRFTIME('%m', me.created_on)", where => "me.id = ?", @@ -284,6 +337,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]], hri => [{ month => 12 }], }, + mysql => { + select => "EXTRACT(MONTH FROM me.created_on)", + where => "me.id = ?", + bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]], + hri => [{ month => 12 }], + }, postgres => { select => "EXTRACT(month FROM me.created_on)", where => "me.id = ?", @@ -315,6 +374,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]], hri => [{ day => 14 }], }, + mysql => { + select => "EXTRACT(DAY FROM me.created_on)", + where => "me.id = ?", + bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]], + hri => [{ day => 14 }], + }, postgres => { select => "EXTRACT(day FROM me.created_on)", where => "me.id = ?", @@ -346,6 +411,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]], hri => [{ hour => 12 }], }, + mysql => { + select => "EXTRACT(HOUR FROM me.created_on)", + where => "me.id = ?", + bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]], + hri => [{ hour => 12 }], + }, postgres => { select => "EXTRACT(hour FROM me.created_on)", where => "me.id = ?", @@ -377,6 +448,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]], hri => [{ minute => 12 }], }, + mysql => { + select => "EXTRACT(MINUTE FROM me.created_on)", + where => "me.id = ?", + bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]], + hri => [{ minute => 12 }], + }, postgres => { select => "EXTRACT(minute FROM me.created_on)", where => "me.id = ?", @@ -408,6 +485,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]], hri => [{ second => 12 }], }, + mysql => { + select => "EXTRACT(SECOND FROM me.created_on)", + where => "me.id = ?", + bind => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]], + hri => [{ second => 12 }], + }, postgres => { select => "EXTRACT(second FROM me.created_on)", where => "me.id = ?", @@ -439,6 +522,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], hri => [{ sec_diff => 2*24*60*60 }], }, + mysql => { + select => "TIMESTAMPDIFF(SECOND, me.skip_inflation, me.created_on)", + where => "me.id = ?", + bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ sec_diff => 2*24*60*60 }], + }, postgres => { select => "EXTRACT(epoch FROM (me.created_on::timestamp with time zone - me.skip_inflation::timestamp with time zone))", where => "me.id = ?", @@ -470,6 +559,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], hri => [{ day_diff => 2 }], }, + mysql => { + select => "TIMESTAMPDIFF(DAY, me.skip_inflation, me.created_on)", + where => "me.id = ?", + bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ day_diff => 2 }], + }, postgres => { select => "EXTRACT(DAY FROM (me.created_on::timestamp with time zone - me.skip_inflation::timestamp with time zone))", where => "me.id = ?", @@ -498,6 +593,12 @@ my @tests = ( bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], hri => [{ year => -1 }], }, + mysql => { + select => "TIMESTAMPDIFF(YEAR, me.created_on, me.starts_at)", + where => "me.id = ?", + bind => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ year => -1 }], + }, oracle => { select => "TRUNC(MONTHS_BETWEEN(me.starts_at, me.created_on) / 12)", where => "me.id = ?", @@ -524,6 +625,12 @@ my @tests = ( hri => [{ date => '2014-12-14 12:12:12.000' }], skip => 'need working bindtypes', }, + mysql => { + select => "DATE_ADD(me.created_on, INTERVAL ? YEAR)", + where => "me.id = ?", + bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ date => '2014-12-14 12:12:12' }], + }, oracle => { select => "(me.created_on + NUMTOYMINTERVAL(?, 'year'))", where => "me.id = ?", @@ -550,6 +657,12 @@ my @tests = ( hri => [{ date => '2012-03-14 12:12:12.000' }], skip => 'need working bindtypes', }, + mysql => { + select => "DATE_ADD(me.created_on, INTERVAL ? MONTH)", + where => "me.id = ?", + bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ date => '2012-03-14 12:12:12' }], + }, oracle => { select => "(me.created_on + NUMTOYMINTERVAL(?, 'month'))", where => "me.id = ?", @@ -576,6 +689,12 @@ my @tests = ( hri => [{ date => '2011-12-17 12:12:12.000' }], skip => 'need working bindtypes', }, + mysql => { + select => "DATE_ADD(me.created_on, INTERVAL ? DAY)", + where => "me.id = ?", + bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ date => '2011-12-17 12:12:12' }], + }, oracle => { select => "(me.created_on + NUMTODSINTERVAL(?, 'day'))", where => "me.id = ?", @@ -602,6 +721,12 @@ my @tests = ( hri => [{ date => '2011-12-14 15:12:12.000' }], skip => 'need working bindtypes', }, + mysql => { + select => "DATE_ADD(me.created_on, INTERVAL ? HOUR)", + where => "me.id = ?", + bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ date => '2011-12-14 15:12:12' }], + }, oracle => { select => "(me.created_on + NUMTODSINTERVAL(?, 'hour'))", where => "me.id = ?", @@ -628,6 +753,12 @@ my @tests = ( hri => [{ date => '2011-12-14 12:15:12.000' }], skip => 'need working bindtypes', }, + mysql => { + select => "DATE_ADD(me.created_on, INTERVAL ? MINUTE)", + where => "me.id = ?", + bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ date => '2011-12-14 12:15:12' }], + }, oracle => { select => "(me.created_on + NUMTODSINTERVAL(?, 'minute'))", where => "me.id = ?", @@ -654,6 +785,12 @@ my @tests = ( hri => [{ date => '2011-12-14 12:12:15.000' }], skip => 'need working bindtypes', }, + mysql => { + select => "DATE_ADD(me.created_on, INTERVAL ? SECOND)", + where => "me.id = ?", + bind => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ date => '2011-12-14 12:12:15' }], + }, oracle => { select => "(me.created_on + NUMTODSINTERVAL(?, 'second'))", where => "me.id = ?", @@ -680,6 +817,12 @@ my @tests = ( hri => [{ date => '2011-12-15 12:12:15.000' }], skip => 'need working bindtypes', }, + mysql => { + select => "DATE_ADD(DATE_ADD(me.created_on, INTERVAL ? DAY), INTERVAL ? SECOND)", + where => "me.id = ?", + bind => [[unknown_col, 1], [unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]], + hri => [{ date => '2011-12-15 12:12:15' }], + }, oracle => { select => "((me.created_on + NUMTODSINTERVAL(?, 'day')) + NUMTODSINTERVAL(?, 'second'))", where => "me.id = ?", @@ -694,7 +837,10 @@ for my $t (@tests) { DB_TEST: for my $db (keys %rs) { my $db_test = $t->{$db}; - next DB_TEST unless $db_test; + unless ($db_test) { + ok 0, "$t->{msg} ($db not tested!)"; + next DB_TEST; + } my ($r, $my_rs);