add horrific fix to make Oracle's retarded limit syntax work
Matt S Trout [Sun, 12 Feb 2006 13:43:20 +0000 (13:43 +0000)]
Changes
lib/DBIx/Class/Storage/DBI.pm
t/41orrible.t [new file with mode: 0644]

diff --git a/Changes b/Changes
index 54e8e00..922ef98 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,7 @@
 Revision history for DBIx::Class
 
+        - add horrific fix to make Oracle's retarded limit syntax work
+
 0.05003 2006-02-08 17:50:20
         - add component_class accessors and use them for *_class
         - small fixes to Serialize and ResultSetManager
index 4a72a95..e42b013 100644 (file)
@@ -134,6 +134,14 @@ sub _quote {
   return $self->SUPER::_quote($label);
 }
 
+sub _RowNum {
+   my $self = shift;
+   my $c;
+   $_[0] =~ s/SELECT (.*?) FROM/
+     'SELECT '.join(', ', map { $_.' AS col'.++$c } split(', ', $1)).' FROM'/e;
+   $self->SUPER::_RowNum(@_);
+}
+
 # Accessor for setting limit dialect. This is useful
 # for JDBC-bridge among others where the remote SQL-dialect cannot
 # be determined by the name of the driver alone.
diff --git a/t/41orrible.t b/t/41orrible.t
new file mode 100644 (file)
index 0000000..bd391da
--- /dev/null
@@ -0,0 +1,25 @@
+use strict;
+use warnings;
+
+use Test::More;
+use DBIx::Class::Storage::DBI;
+
+plan tests => 1;
+
+my $sa = new DBIC::SQL::Abstract;
+
+$sa->limit_dialect('RowNum');
+
+is($sa->select('rubbish',
+                  [ 'foo.id', 'bar.id' ],
+                  undef, undef, 1, 3),
+   'SELECT * FROM
+(
+    SELECT A.*, ROWNUM r FROM
+    (
+        SELECT foo.id AS col1, bar.id AS col2 FROM rubbish 
+    ) A
+    WHERE ROWNUM < 5
+) B
+WHERE r >= 4
+', 'Munged stuff to make Oracle not explode');