From: Alexander Hartmaier Date: Wed, 13 Apr 2011 17:14:24 +0000 (+0200) Subject: make DateTime objects work for Oracle X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=3aa074bfcb1a945ab6da00011b6f96737e09cf33;p=dbsrgits%2FDBIx-Class.git make DateTime objects work for Oracle --- diff --git a/lib/DBIx/Class/SQLMaker/Oracle.pm b/lib/DBIx/Class/SQLMaker/Oracle.pm index 22cbf71..adfb06a 100644 --- a/lib/DBIx/Class/SQLMaker/Oracle.pm +++ b/lib/DBIx/Class/SQLMaker/Oracle.pm @@ -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'))"; } } diff --git a/t/sqlmaker/op_dt.t b/t/sqlmaker/op_dt.t index 5b28863..0d389f2 100644 --- a/t/sqlmaker/op_dt.t +++ b/t/sqlmaker/op_dt.t @@ -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' }], }, },