make DateTime objects work for Oracle
Alexander Hartmaier [Wed, 13 Apr 2011 17:14:24 +0000 (19:14 +0200)]
lib/DBIx/Class/SQLMaker/Oracle.pm
t/sqlmaker/op_dt.t

index 22cbf71..adfb06a 100644 (file)
@@ -257,9 +257,14 @@ sub _insert_returning {
   );
 
   sub _datetime_sql {
-    die $_[0]->_unsupported_date_extraction($_[1], 'Oracle')
-       unless exists $part_map{$_[1]};
-    "EXTRACT($part_map{$_[1]} FROM $_[2])"
+    my ($self, $part, $date) = @_;
+
+    die $self->_unsupported_date_extraction($part, 'Oracle')
+       unless exists $part_map{$part};
+
+    my $rhs = $date eq '?' ? "TO_TIMESTAMP($date)" : $date;
+
+    return "EXTRACT($part_map{$_[1]} FROM $rhs)";
   }
 }
 
@@ -300,7 +305,9 @@ sub _insert_returning {
     die $self->_unsupported_date_adding($part, 'Oracle')
       unless exists $part_map{$part};
 
-    return "($date + $part_map{$part}($amount, '$part'))";
+    my $rhs = $date eq '?' ? "TO_TIMESTAMP($date)" : $date;
+
+    return "($rhs + $part_map{$part}($amount, '$part'))";
   }
 }
 
index 5b28863..0d389f2 100644 (file)
@@ -271,7 +271,7 @@ my @tests = (
       select => "date_part('year', ?)",
     },
     oracle => {
-      select => "EXTRACT(year FROM ?)",
+      select => "EXTRACT(year FROM TO_TIMESTAMP(?))",
     },
   },
 
@@ -330,7 +330,7 @@ my @tests = (
       select => "date_part('year', ?), date_part('month', ?)",
     },
     oracle => {
-      select => "EXTRACT(year FROM ?), EXTRACT(month FROM ?)",
+      select => "EXTRACT(year FROM TO_TIMESTAMP(?)), EXTRACT(month FROM TO_TIMESTAMP(?))",
     },
   },
 
@@ -381,7 +381,7 @@ my @tests = (
       select => "date_part('month', ?)",
     },
     oracle => {
-      select => "EXTRACT(month FROM ?)",
+      select => "EXTRACT(month FROM TO_TIMESTAMP(?))",
     },
   },
 
@@ -432,7 +432,7 @@ my @tests = (
       select => "date_part('day', ?)",
     },
     oracle => {
-      select => "EXTRACT(day FROM ?)",
+      select => "EXTRACT(day FROM TO_TIMESTAMP(?))",
     },
   },
 
@@ -483,7 +483,7 @@ my @tests = (
       select => "date_part('hour', ?)",
     },
     oracle => {
-      select => "EXTRACT(hour FROM ?)",
+      select => "EXTRACT(hour FROM TO_TIMESTAMP(?))",
     },
   },
 
@@ -534,7 +534,7 @@ my @tests = (
       select => "date_part('minute', ?)",
     },
     oracle => {
-      select => "EXTRACT(minute FROM ?)",
+      select => "EXTRACT(minute FROM TO_TIMESTAMP(?))",
     },
   },
 
@@ -585,7 +585,7 @@ my @tests = (
       select => "date_part('second', ?)",
     },
     oracle => {
-      select => "EXTRACT(second FROM ?)",
+      select => "EXTRACT(second FROM TO_TIMESTAMP(?))",
     },
   },
 
@@ -840,8 +840,8 @@ my @tests = (
       select => "(? + ? * interval '1 YEAR')",
     },
     oracle => {
-      select => "(? + NUMTOYMINTERVAL(?, 'year'))",
-      hri    => [{ date => '2014-12-14 12:12:12.000000000' }],
+      select => "(TO_TIMESTAMP(?) + NUMTOYMINTERVAL(?, 'year'))",
+      hri    => [{ date => '2013-12-14 12:12:12.000000000' }],
     },
   },
 
@@ -904,8 +904,8 @@ my @tests = (
       select => "DATE_ADD(?, INTERVAL ? MONTH)",
     },
     oracle => {
-      select => "(? + NUMTOYMINTERVAL(?, 'month'))",
-      hri    => [{ date => '2012-03-14 12:12:12.000000000' }],
+      select => "(TO_TIMESTAMP(?) + NUMTOYMINTERVAL(?, 'month'))",
+      hri    => [{ date => '2011-03-14 12:12:12.000000000' }],
     },
   },
 
@@ -968,8 +968,8 @@ my @tests = (
       select => "DATE_ADD(?, INTERVAL ? DAY)",
     },
     oracle => {
-      select => "(? + NUMTODSINTERVAL(?, 'day'))",
-      hri    => [{ date => '2011-12-17 12:12:12.000000000' }],
+      select => "(TO_TIMESTAMP(?) + NUMTODSINTERVAL(?, 'day'))",
+      hri    => [{ date => '2010-12-17 12:12:12.000000000' }],
     },
   },
 
@@ -1032,8 +1032,8 @@ my @tests = (
       select => "DATE_ADD(?, INTERVAL ? HOUR)",
     },
     oracle => {
-      select => "(? + NUMTODSINTERVAL(?, 'hour'))",
-      hri    => [{ date => '2011-12-14 15:12:12.000000000' }],
+      select => "(TO_TIMESTAMP(?) + NUMTODSINTERVAL(?, 'hour'))",
+      hri    => [{ date => '2010-12-14 15:12:12.000000000' }],
     },
   },
 
@@ -1096,8 +1096,8 @@ my @tests = (
       select => "DATE_ADD(?, INTERVAL ? MINUTE)",
     },
     oracle => {
-      select => "(? + NUMTODSINTERVAL(?, 'minute'))",
-      hri    => [{ date => '2011-12-14 12:15:12.000000000' }],
+      select => "(TO_TIMESTAMP(?) + NUMTODSINTERVAL(?, 'minute'))",
+      hri    => [{ date => '2010-12-14 12:15:12.000000000' }],
     },
   },
 
@@ -1160,8 +1160,8 @@ my @tests = (
       select => "DATE_ADD(?, INTERVAL ? SECOND)",
     },
     oracle => {
-      select => "(? + NUMTODSINTERVAL(?, 'second'))",
-      hri    => [{ date => '2011-12-14 12:12:15.000000000' }],
+      select => "(TO_TIMESTAMP(?) + NUMTODSINTERVAL(?, 'second'))",
+      hri    => [{ date => '2010-12-14 12:12:15.000000000' }],
     },
   },
 
@@ -1226,8 +1226,8 @@ my @tests = (
       select => "DATE_ADD(DATE_ADD(?, INTERVAL ? DAY), INTERVAL ? SECOND)",
     },
     oracle => {
-      select => "((? + NUMTODSINTERVAL(?, 'day')) + NUMTODSINTERVAL(?, 'second'))",
-      hri    => [{ date => '2011-12-15 12:12:15.000000000' }],
+      select => "((TO_TIMESTAMP(?) + NUMTODSINTERVAL(?, 'day')) + NUMTODSINTERVAL(?, 'second'))",
+      hri    => [{ date => '2010-12-15 12:12:15.000000000' }],
     },
   },