Add SQLite support for check constraints
Andrew Gregory [Sun, 7 Jun 2015 06:30:30 +0000 (02:30 -0400)]
Changes
lib/SQL/Translator/Producer/SQLite.pm
t/56-sqlite-producer.t

diff --git a/Changes b/Changes
index 6b576b3..50dd5f3 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,6 +1,7 @@
 Changes for SQL::Translator
 
  * Add support for monotonically increasing SQLite autoincs (GH#47)
+ * Add support for CHECK constraint in SQLite producer (GH#57)
  * Fix forgotten quoting in the MySQL DROP TABLE diff producer (GH#50)
  * Improve add_trigger consistency between producers (GH#48)
  * Declare dependencies in deterministic order (RT#102859)
index 9a2c492..9cc92af 100644 (file)
@@ -236,6 +236,9 @@ sub create_table
         if ($c->type eq "FOREIGN KEY") {
             push @field_defs, create_foreignkey($c);
         }
+        elsif ($c->type eq "CHECK") {
+            push @field_defs, create_check_constraint($c);
+        }
         next unless $c->type eq UNIQUE;
         push @constraint_defs, create_constraint($c);
     }
@@ -245,6 +248,14 @@ sub create_table
     return (@create, $create_table, @index_defs, @constraint_defs );
 }
 
+sub create_check_constraint {
+    my $c     = shift;
+    my $check = '';
+    $check .= 'CONSTRAINT ' . _generator->quote( $c->name ) . ' ' if $c->name;
+    $check .= 'CHECK(' . $c->expression . ')';
+    return $check;
+}
+
 sub create_foreignkey {
     my $c = shift;
 
index 3e962e5..d0d2cfe 100644 (file)
@@ -243,4 +243,12 @@ $SQL::Translator::Producer::SQLite::NO_QUOTES = 0;
     }
 }
 
+{
+    my $table = SQL::Translator::Schema::Table->new( name => 'foobar', fields => ['foo'] );
+    my $constr = $table->add_constraint(name => 'constr', expression => "foo != 'baz'");
+    my ($def) = SQL::Translator::Producer::SQLite::create_check_constraint($constr);
+
+    is($def, q{CONSTRAINT "constr" CHECK(foo != 'baz')}, 'check constraint created');
+}
+
 done_testing;