mysql tests
Arthur Axel 'fREW' Schmidt [Sat, 26 Mar 2011 03:45:52 +0000 (22:45 -0500)]
lib/DBIx/Class/SQLMaker/MySQL.pm
t/sqlmaker/op_dt.t

index 555c8c7..542fcb5 100644 (file)
@@ -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]};
index 1a035fa..3c22901 100644 (file)
@@ -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);