From: Peter Rabbitson Date: Sun, 7 Jun 2009 21:36:43 +0000 (+0000) Subject: Make empty/default inserts use standard SQL X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=7a72e5a5003eec9bf200b63a94f6f98d8e8d4ee4;p=dbsrgits%2FDBIx-Class-Historic.git Make empty/default inserts use standard SQL --- diff --git a/lib/DBIx/Class/SQLAHacks.pm b/lib/DBIx/Class/SQLAHacks.pm index c0b9937..a454cd5 100644 --- a/lib/DBIx/Class/SQLAHacks.pm +++ b/lib/DBIx/Class/SQLAHacks.pm @@ -193,6 +193,14 @@ sub insert { my $self = shift; my $table = shift; $table = $self->_quote($table) unless ref($table); + + # SQLA will emit INSERT INTO $table ( ) VALUES ( ) + # which is sadly understood only by MySQL. Change default behavior here, + # until SQLA2 comes with proper dialect support + if (! $_[0] or (ref $_[0] eq 'HASH' and !keys %{$_[0]} ) ) { + return "INSERT INTO ${table} DEFAULT VALUES" + } + $self->SUPER::insert($table, @_); } diff --git a/t/18insert_default.t b/t/18insert_default.t new file mode 100644 index 0000000..c3f9369 --- /dev/null +++ b/t/18insert_default.t @@ -0,0 +1,31 @@ +use strict; +use warnings; + +use Test::More; +use lib qw(t/lib); +use DBICTest; + +my $tests = 3; +plan tests => $tests; + +my $schema = DBICTest->init_schema(); +my $rs = $schema->resultset ('Artist'); +my $last_obj = $rs->search ({}, { order_by => { -desc => 'artistid' }, rows => 1})->single; +my $last_id = $last_obj ? $last_obj->artistid : 0; + +my $obj; +eval { $obj = $rs->create ({}) }; +my $err = $@; + +ok ($obj, 'Insert defaults ( $rs->create ({}) )' ); +SKIP: { + skip "Default insert failed: $err", $tests-1 if $err; + + # this should be picked up without calling the DB again + is ($obj->artistid, $last_id + 1, 'Autoinc PK works'); + + # for this we need to refresh + $obj->discard_changes; + is ($obj->rank, 13, 'Default value works'); +} +