Fix default insert on Oracle ( $rs->create({}) with empty hashref ) feature_needs_rework/oracle_default_insert
Lasse Makholm [Mon, 29 Sep 2014 16:37:32 +0000 (18:37 +0200)]
Oracle does not support the INSERT INTO ... DEFAULT VALUES syntax used by
SQLMaker by default. Furthermore, Oracle has no equivalent way of inserting
a row without specifying any columns, so the only reasonably fix seems to
be to pick the first column and supply the DEFAULT keyword as value for it.

AUTHORS
Changes
lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
t/60core.t
t/73oracle.t

diff --git a/AUTHORS b/AUTHORS
index 180d485..350654c 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -105,6 +105,7 @@ jshirley: J. Shirley <jshirley@gmail.com>
 kaare: Kaare Rasmussen
 kd: Kieren Diment <diment@gmail.com>
 konobi: Scott McWhirter <konobi@cpan.org>
+Lasse Makholm <lasse@unity3d.com>
 lejeunerenard: Sean Zellmer <sean@lejeunerenard.com>
 littlesavage: Alexey Illarionov <littlesavage@orionet.ru>
 lukes: Luke Saunders <luke.saunders@gmail.com>
diff --git a/Changes b/Changes
index a65fd89..547e8cb 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,6 +1,7 @@
 Revision history for DBIx::Class
 
     * Fixes
+        - Fix $rs->create() with no values on Oracle
         - Silence with_deferred_fk_checks() warning on PostgreSQL 9.4
 
     * Misc
index 2b4ce75..a90755c 100644 (file)
@@ -115,6 +115,21 @@ sub deployment_statements {
   $self->next::method($schema, $type, $version, $dir, $sqltargs, @rest);
 }
 
+sub insert {
+  my ($self, $source, $to_insert) = @_;
+
+  # Oracle does not understand INSERT INTO ... DEFAULT VALUES syntax
+  # Furthermore it does not have any way to insert without specifying any columns
+  # We can't fix this in SQLMaker::Oracle because it doesn't know which column to add to the statement
+  unless (%$to_insert)
+  {
+    my ($col) = $source->columns;
+    $to_insert = { $col => \'DEFAULT' };
+  }
+
+  return $self->next::method($source, $to_insert);
+}
+
 sub _dbh_last_insert_id {
   my ($self, $dbh, $source, @columns) = @_;
   my @ids = ();
index 1f7e5f9..d848a91 100644 (file)
@@ -576,6 +576,9 @@ lives_ok (sub { my $newlink = $newbook->link}, "stringify to false value doesn't
 {
     my $new_artist = $schema->resultset('Artist')->new({});
     isa_ok( $new_artist, 'DBIx::Class::Row', '$rs->new gives a row object' );
+    lives_ok { $new_artist->insert() } 'inserting without specifying any columns works';
+    $new_artist->discard_changes;
+    $new_artist->delete;
 }
 
 # make sure we got rid of the compat shims
index a8a1e70..f6da1a1 100644 (file)
@@ -201,6 +201,13 @@ sub _run_tests {
     like ($seq, qr/\.${q}artist_pk_seq${q}$/, 'Correct PK sequence selected for sqlt-like trigger');
   }
 
+  lives_ok {
+    $new = $schema->resultset('Artist')->create({});
+    $new->discard_changes;
+    ok $new->artistid, 'Created row has id'
+  } 'Create with empty hashref works';
+
+
 # test LIMIT support
   for (1..6) {
     $schema->resultset('Artist')->create({ name => 'Artist ' . $_ });