add on_or_(before|after) ops
[dbsrgits/DBIx-Class.git] / t / sqlmaker / op_dt.t
index 3c22901..5b40621 100644 (file)
@@ -5,6 +5,7 @@ use Test::More;
 use Test::Exception;
 
 use lib qw(t/lib);
+use DBICTest::RunMode;
 use DBIC::SqlMakerTest;
 use DateTime;
 use DBIx::Class::SQLMaker::MSSQL;
@@ -157,35 +158,13 @@ $s;
 
 my %rs = map { $_ => $schema{$_}->resultset('Event') } keys %schema;
 
-$rs{sqlite}->populate([
- [qw(starts_at created_on skip_inflation)],
- ['2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12'],
- ['2010-12-12', '2011-12-14 12:12:12', '2011-12-12 12:12:12'],
-]);
-
-$rs{mssql}->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{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'],
- ['2010-12-12', '2011-12-14 12:12:12', '2011-12-12 12:12:12'],
-]) if $schema{postgres}->storage->connected;
-
-$rs{oracle}->populate([
- [qw(starts_at created_on skip_inflation)],
- ['2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12'],
- ['2010-12-12', '2011-12-14 12:12:12', '2011-12-12 12:12:12'],
-]) if $schema{oracle}->storage->connected;
+for (grep { $schema{$_}->storage->connected } keys %rs) {
+   $rs{$_}->populate([
+     [qw(starts_at created_on skip_inflation)],
+     ['2010-12-12', '2010-12-14 12:12:12', '2019-12-12 12:12:12'],
+     ['2010-12-12', '2011-12-14 12:12:12', '2011-12-12 12:12:12'],
+   ])
+}
 
 my $date = DateTime->new(
    year => 2010,
@@ -269,7 +248,7 @@ my @tests = (
       hri    => [{ year => 2010 }],
     },
     postgres => {
-      select => "EXTRACT(year FROM me.created_on)",
+      select => "date_part('year', me.created_on)",
       where => "me.id = ?",
       bind   => [[{ dbic_colname => 'me.id', sqlt_datatype => 'integer' } => 1 ]],
       hri    => [{ year => 2010 }],
@@ -307,7 +286,7 @@ my @tests = (
       hri    => [{ year => 2010, month => 12 }],
     },
     postgres => {
-      select => "EXTRACT(year FROM me.created_on), EXTRACT(month FROM me.created_on)",
+      select => "date_part('year', me.created_on), date_part('month', me.created_on)",
       where => "me.id = ?",
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
       hri    => [{ year => 2010, month => 12 }],
@@ -344,7 +323,7 @@ my @tests = (
       hri    => [{ month => 12 }],
     },
     postgres => {
-      select => "EXTRACT(month FROM me.created_on)",
+      select => "date_part('month', me.created_on)",
       where => "me.id = ?",
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
       hri    => [{ month => 12 }],
@@ -381,7 +360,7 @@ my @tests = (
       hri    => [{ day => 14 }],
     },
     postgres => {
-      select => "EXTRACT(day FROM me.created_on)",
+      select => "date_part('day', me.created_on)",
       where => "me.id = ?",
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
       hri    => [{ day => 14 }],
@@ -418,7 +397,7 @@ my @tests = (
       hri    => [{ hour => 12 }],
     },
     postgres => {
-      select => "EXTRACT(hour FROM me.created_on)",
+      select => "date_part('hour', me.created_on)",
       where => "me.id = ?",
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
       hri    => [{ hour => 12 }],
@@ -455,7 +434,7 @@ my @tests = (
       hri    => [{ minute => 12 }],
     },
     postgres => {
-      select => "EXTRACT(minute FROM me.created_on)",
+      select => "date_part('minute', me.created_on)",
       where => "me.id = ?",
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
       hri    => [{ minute => 12 }],
@@ -492,7 +471,7 @@ my @tests = (
       hri    => [{ second => 12 }],
     },
     postgres => {
-      select => "EXTRACT(second FROM me.created_on)",
+      select => "date_part('second', me.created_on)",
       where => "me.id = ?",
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 1 ]],
       hri    => [{ second => 12 }],
@@ -529,7 +508,7 @@ my @tests = (
       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))",
+      select   => "date_part('EPOCH', me.created_on) - date_part('EPOCH', me.skip_inflation)",
       where => "me.id = ?",
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri => [{ sec_diff => 2*24*60*60 }],
@@ -566,7 +545,7 @@ my @tests = (
       hri => [{ day_diff => 2 }],
     },
     postgres => {
-      select   => "EXTRACT(DAY FROM (me.created_on::timestamp with time zone - me.skip_inflation::timestamp with time zone))",
+      select   => "date_part('DAY', me.created_on) - date_part('DAY', me.skip_inflation)",
       where => "me.id = ?",
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri => [{ day_diff => 2 }],
@@ -599,6 +578,12 @@ my @tests = (
       bind   => [[{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri => [{ year => -1 }],
     },
+    postgres => {
+      select   => "date_part('YEAR', me.starts_at) - date_part('YEAR', me.created_on)",
+      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 = ?",
@@ -619,11 +604,10 @@ my @tests = (
       hri    => [{ date => '2014-12-14 12:12:12' }],
     },
     mssql => {
-      select => "(DATEADD(year, ?, me.created_on))",
+      select => "(DATEADD(year, CAST(? AS INTEGER), me.created_on))",
       where => "me.id = ?",
-      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      bind   => [[{sqlt_datatype => 'integer'}, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri    => [{ date => '2014-12-14 12:12:12.000' }],
-      skip   => 'need working bindtypes',
     },
     mysql => {
       select => "DATE_ADD(me.created_on, INTERVAL ? YEAR)",
@@ -631,6 +615,13 @@ my @tests = (
       bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri    => [{ date => '2014-12-14 12:12:12' }],
     },
+    postgres => {
+      select => "(me.created_on + ? * interval '1 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 = ?",
@@ -651,12 +642,18 @@ my @tests = (
       hri    => [{ date => '2012-03-14 12:12:12' }],
     },
     mssql => {
-      select => "(DATEADD(month, ?, me.created_on))",
+      select => "(DATEADD(month, CAST(? AS INTEGER), me.created_on))",
       where => "me.id = ?",
-      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      bind   => [[{sqlt_datatype => 'integer'}, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri    => [{ date => '2012-03-14 12:12:12.000' }],
-      skip   => 'need working bindtypes',
     },
+    postgres => {
+      select => "(me.created_on + ? * interval '1 MONTH')",
+      where => "me.id = ?",
+      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      hri    => [{ date => '2012-03-14 12:12:12' }],
+    },
+
     mysql => {
       select => "DATE_ADD(me.created_on, INTERVAL ? MONTH)",
       where => "me.id = ?",
@@ -683,12 +680,18 @@ my @tests = (
       hri    => [{ date => '2011-12-17 12:12:12' }],
     },
     mssql => {
-      select => "(DATEADD(dayofyear, ?, me.created_on))",
+      select => "(DATEADD(dayofyear, CAST(? AS INTEGER), me.created_on))",
       where => "me.id = ?",
-      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      bind   => [[{sqlt_datatype => 'integer'}, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri    => [{ date => '2011-12-17 12:12:12.000' }],
-      skip   => 'need working bindtypes',
     },
+    postgres => {
+      select => "(me.created_on + ? * interval '1 DAY')",
+      where => "me.id = ?",
+      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      hri    => [{ date => '2011-12-17 12:12:12' }],
+    },
+
     mysql => {
       select => "DATE_ADD(me.created_on, INTERVAL ? DAY)",
       where => "me.id = ?",
@@ -715,11 +718,16 @@ my @tests = (
       hri    => [{ date => '2011-12-14 15:12:12' }],
     },
     mssql => {
-      select => "(DATEADD(hour, ?, me.created_on))",
+      select => "(DATEADD(hour, CAST(? AS INTEGER), me.created_on))",
       where => "me.id = ?",
-      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      bind   => [[{sqlt_datatype => 'integer'}, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri    => [{ date => '2011-12-14 15:12:12.000' }],
-      skip   => 'need working bindtypes',
+    },
+    postgres => {
+      select => "(me.created_on + ? * interval '1 HOUR')",
+      where => "me.id = ?",
+      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      hri    => [{ date => '2011-12-14 15:12:12' }],
     },
     mysql => {
       select => "DATE_ADD(me.created_on, INTERVAL ? HOUR)",
@@ -747,11 +755,16 @@ my @tests = (
       hri    => [{ date => '2011-12-14 12:15:12' }],
     },
     mssql => {
-      select => "(DATEADD(minute, ?, me.created_on))",
+      select => "(DATEADD(minute, CAST(? AS INTEGER), me.created_on))",
       where => "me.id = ?",
-      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      bind   => [[{sqlt_datatype => 'integer'}, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri    => [{ date => '2011-12-14 12:15:12.000' }],
-      skip   => 'need working bindtypes',
+    },
+    postgres => {
+      select => "(me.created_on + ? * interval '1 MINUTE')",
+      where => "me.id = ?",
+      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      hri    => [{ date => '2011-12-14 12:15:12' }],
     },
     mysql => {
       select => "DATE_ADD(me.created_on, INTERVAL ? MINUTE)",
@@ -779,11 +792,16 @@ my @tests = (
       hri    => [{ date => '2011-12-14 12:12:15' }],
     },
     mssql => {
-      select => "(DATEADD(second, ?, me.created_on))",
+      select => "(DATEADD(second, CAST(? AS INTEGER), me.created_on))",
       where => "me.id = ?",
-      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      bind   => [[{sqlt_datatype => 'integer'}, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
       hri    => [{ date => '2011-12-14 12:12:15.000' }],
-      skip   => 'need working bindtypes',
+    },
+    postgres => {
+      select => "(me.created_on + ? * interval '1 SECOND')",
+      where => "me.id = ?",
+      bind   => [[unknown_col, 3], [{dbic_colname => 'me.id', sqlt_datatype => 'integer'} => 2 ]],
+      hri    => [{ date => '2011-12-14 12:12:15' }],
     },
     mysql => {
       select => "DATE_ADD(me.created_on, INTERVAL ? SECOND)",
@@ -811,11 +829,16 @@ my @tests = (
       hri    => [{ date => '2011-12-15 12:12:15' }],
     },
     mssql => {
-      select => "(DATEADD(second, ?, (DATEADD(dayofyear, ?, me.created_on))))",
+      select => "(DATEADD(second, CAST(? AS INTEGER), (DATEADD(dayofyear, CAST(? AS INTEGER), me.created_on))))",
       where => "me.id = ?",
-      bind   => [[unknown_col, 3 ], [unknown_col, 1], [{dbic_colname => 'me.id', sqlt_datatype => 'integer' }, 2]],
+      bind   => [[{sqlt_datatype => 'integer'}, 3 ], [{sqlt_datatype => 'integer'}, 1], [{dbic_colname => 'me.id', sqlt_datatype => 'integer' }, 2]],
       hri    => [{ date => '2011-12-15 12:12:15.000' }],
-      skip   => 'need working bindtypes',
+    },
+     postgres => {
+      select => "((me.created_on + ? * interval '1 DAY') + ? * interval '1 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' }],
     },
     mysql => {
       select => "DATE_ADD(DATE_ADD(me.created_on, INTERVAL ? DAY), INTERVAL ? SECOND)",
@@ -830,6 +853,155 @@ my @tests = (
       hri    => [{ date => '2011-12-15 12:12:15.000000000' }],
     },
   },
+
+  {
+    msg    => '-dt_before works',
+    search => { 'me.created_on' => { -dt_before => '2011-12-14 12:12:12' } },
+    select   => [ [ -ident => 'me.created_on' ] ],
+    as       => [ 'date' ],
+    sqlite => {
+      select   => "me.created_on",
+      where => "me.created_on < ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }],
+    },
+    postgres => {
+      select   => "me.created_on",
+      where => "me.created_on < ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }],
+    },
+    mysql => {
+      select   => "me.created_on",
+      where => "me.created_on < ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }],
+    },
+    mssql => {
+      select   => "me.created_on",
+      where => "me.created_on < ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }],
+    },
+    oracle => {
+      select   => "me.created_on",
+      where => "me.created_on < ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }],
+    },
+  },
+
+  {
+    msg    => '-dt_on_or_before works',
+    search => { 'me.created_on' => { -dt_on_or_before => '2011-12-14 12:12:12' } },
+    select   => [ [ -ident => 'me.created_on' ] ],
+    as       => [ 'date' ],
+    sqlite => {
+      select   => "me.created_on",
+      where => "me.created_on <= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+    postgres => {
+      select   => "me.created_on",
+      where => "me.created_on <= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+    mysql => {
+      select   => "me.created_on",
+      where => "me.created_on <= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+    mssql => {
+      select   => "me.created_on",
+      where => "me.created_on <= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+    oracle => {
+      select   => "me.created_on",
+      where => "me.created_on <= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2011-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+  },
+
+  {
+    msg    => '-dt_after works',
+    search => { 'me.created_on' => { -dt_after => '2010-12-14 12:12:12' } },
+    select   => [ [ -ident => 'me.created_on' ] ],
+    as       => [ 'date' ],
+    sqlite => {
+      select   => "me.created_on",
+      where => "me.created_on > ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2011-12-14 12:12:12' }],
+    },
+    postgres => {
+      select   => "me.created_on",
+      where => "me.created_on > ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2011-12-14 12:12:12' }],
+    },
+    mysql => {
+      select   => "me.created_on",
+      where => "me.created_on > ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2011-12-14 12:12:12' }],
+    },
+    mssql => {
+      select   => "me.created_on",
+      where => "me.created_on > ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2011-12-14 12:12:12' }],
+    },
+    oracle => {
+      select   => "me.created_on",
+      where => "me.created_on > ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2011-12-14 12:12:12' }],
+    },
+  },
+
+  {
+    msg    => '-dt_on_or_after works',
+    search => { 'me.created_on' => { -dt_on_or_after => '2010-12-14 12:12:12' } },
+    select   => [ [ -ident => 'me.created_on' ] ],
+    as       => [ 'date' ],
+    sqlite => {
+      select   => "me.created_on",
+      where => "me.created_on >= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+    postgres => {
+      select   => "me.created_on",
+      where => "me.created_on >= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+    mysql => {
+      select   => "me.created_on",
+      where => "me.created_on >= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+    mssql => {
+      select   => "me.created_on",
+      where => "me.created_on >= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+    oracle => {
+      select   => "me.created_on",
+      where => "me.created_on >= ?",
+      bind   => [[{dbic_colname => 'me.created_on', sqlt_datatype => 'timestamp' }, '2010-12-14 12:12:12']],
+      hri    => [{ date => '2010-12-14 12:12:12' }, { date => '2011-12-14 12:12:12' }],
+    },
+  },
+
 );
 
 for my $t (@tests) {