fix excepted and scalarref quoting for DEFAULTS in SQLite (and SQL Server)
Arthur Axel 'fREW' Schmidt [Mon, 30 Apr 2012 16:03:31 +0000 (11:03 -0500)]
lib/SQL/Translator/Generator/DDL/SQLite.pm
lib/SQL/Translator/Generator/Role/DDL.pm
t/56-sqlite-producer.t

index ec2febe..eaf147a 100644 (file)
@@ -81,7 +81,11 @@ sub field {
          : ( $self->field_type($field) )
       ),
       $self->field_nullable($field),
-      $self->field_default($field),
+      $self->field_default($field, {
+         NULL => 1,
+         'now()' => 1,
+         'CURRENT_TIMESTAMP' => 1,
+      }),
 }
 
 1;
index d1fd536..1691467 100644 (file)
@@ -5,6 +5,7 @@ package SQL::Translator::Generator::Role::DDL;
 
 use Moo::Role;
 use SQL::Translator::Utils qw(header_comment);
+use Scalar::Util;
 
 requires '_build_type_map';
 requires '_build_numeric_types';
@@ -62,11 +63,19 @@ sub table_comments {
 sub field_nullable { ($_[1]->is_nullable ? $_[0]->nullable : 'NOT NULL' ) }
 
 sub field_default {
-  return () if !defined $_[1]->default_value;
-
-  my $val = $_[1]->default_value;
-  $val = "'$val'" unless $_[0]->numeric_types->{$_[1]->data_type};
-  return ( "DEFAULT $val" )
+  my ($self, $field, $exceptions) = @_;
+
+  my $default = $field->default_value;
+  return () if !defined $default;
+
+  $default = \"$default"
+    if $exceptions and !ref $default and $exceptions->{$default};
+  if (ref $default) {
+      $default = $$default;
+  } elsif (!($self->numeric_types->{lc($field->data_type)} && Scalar::Util::looks_like_number ($default))) {
+     $default = "'$default'";
+  }
+  return ( "DEFAULT $default" )
 }
 
 sub field_type {
index 79e7880..5d56adf 100644 (file)
@@ -110,4 +110,58 @@ $SQL::Translator::Producer::SQLite::NO_QUOTES = 0;
    is_deeply($result, $expected, 'correctly translated bytea to blob');
 }
 
+{
+   my $table = SQL::Translator::Schema::Table->new(
+       name => 'foo_table',
+   );
+   $table->add_field(
+       name => 'id',
+       data_type => 'integer',
+       default_value => \'gunshow',
+   );
+   my $expected = [ qq<CREATE TABLE "foo_table" (\n  "id" integer DEFAULT gunshow\n)>];
+   my $result =  [SQL::Translator::Producer::SQLite::create_table($table, { no_comments => 1 })];
+   is_deeply($result, $expected, 'correctly unquoted DEFAULT');
+}
+
+{
+   my $table = SQL::Translator::Schema::Table->new(
+       name => 'foo_table',
+   );
+   $table->add_field(
+       name => 'id',
+       data_type => 'integer',
+       default_value => 'frew',
+   );
+   my $expected = [ qq<CREATE TABLE "foo_table" (\n  "id" integer DEFAULT 'frew'\n)>];
+   my $result =  [SQL::Translator::Producer::SQLite::create_table($table, { no_comments => 1 })];
+   is_deeply($result, $expected, 'correctly quoted DEFAULT');
+}
+
+{
+   my $table = SQL::Translator::Schema::Table->new(
+       name => 'foo',
+   );
+   $table->add_field(
+       name => 'id',
+       data_type => 'integer',
+       default_value => 'NULL',
+   );
+   $table->add_field(
+       name => 'when',
+       default_value => 'now()',
+   );
+   $table->add_field(
+       name => 'at',
+       default_value => 'CURRENT_TIMESTAMP',
+   );
+   my $expected = [ qq<CREATE TABLE "foo" (
+  "id" integer DEFAULT NULL,
+  "when"  DEFAULT now(),
+  "at"  DEFAULT CURRENT_TIMESTAMP
+)>];
+   my $result =  [SQL::Translator::Producer::SQLite::create_table($table, { no_comments => 1 })];
+   is_deeply($result, $expected, 'correctly unquoted excempted DEFAULTs');
+}
+
 done_testing;