Fixed autoincrement in primary keys for SQLite
rporres [Tue, 12 Feb 2013 09:05:56 +0000 (10:05 +0100)]
SQLite autoincrement feature behaves differently in primary keys
and non-primary keys.  SQLite generator must take into account
autoincrement in primary keys when generating schemas.

AUTHORS
lib/SQL/Translator/Generator/DDL/SQLite.pm
t/30sqlt-new-diff-sqlite.t
t/48xml-to-sqlite.t
t/56-sqlite-producer.t

diff --git a/AUTHORS b/AUTHORS
index 495ea78..316d78a 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -43,6 +43,7 @@ The following people have contributed to the SQLFairy project:
 -   Moritz Onken <onken@netcubed.de>
 -   Paul Harrington <phrrngtn@users.sourceforge.net>
 -   Peter Rabbitson <ribasushi@cpan.org>
+-   Rafael Porres Molina <rporres@qindel.com>
 -   Robert Bohne <rbo@cpan.org>
 -   Ross Smith II <rossta@users.sf.net>
 -   Ryan D Johnson <ryan@innerfence.com>
index 0f55fd9..a660fd3 100644 (file)
@@ -78,12 +78,13 @@ sub _ipk {
 sub field {
    my ($self, $field) = @_;
 
-
    return join ' ',
       $self->field_comments($field),
       $self->field_name($field),
       ( $self->_ipk($field)
-         ? ( 'INTEGER PRIMARY KEY' )
+         ? $field->is_auto_increment 
+            ? ( 'INTEGER PRIMARY KEY AUTOINCREMENT' ) 
+            : ( 'INTEGER PRIMARY KEY' )
          : ( $self->field_type($field) )
       ),
       $self->field_nullable($field),
index ef7fee7..00272ca 100644 (file)
@@ -122,7 +122,7 @@ ALTER TABLE old_name RENAME TO new_name;
 ALTER TABLE new_name ADD COLUMN new_field int;
 
 CREATE TEMPORARY TABLE person_temp_alter (
-  person_id INTEGER PRIMARY KEY NOT NULL,
+  person_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
   name varchar(20) NOT NULL,
   age int(11) DEFAULT 18,
   weight double(11,2),
@@ -136,7 +136,7 @@ INSERT INTO person_temp_alter( person_id, name, age, weight, iq, is_rock_star, p
 DROP TABLE person;
 
 CREATE TABLE person (
-  person_id INTEGER PRIMARY KEY NOT NULL,
+  person_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
   name varchar(20) NOT NULL,
   age int(11) DEFAULT 18,
   weight double(11,2),
index 21e8ad3..b7b6e32 100644 (file)
@@ -40,7 +40,7 @@ BEGIN TRANSACTION;
 DROP TABLE "Basic";
 
 CREATE TABLE "Basic" (
-  "id" INTEGER PRIMARY KEY NOT NULL,
+  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
   "title" varchar(100) NOT NULL DEFAULT 'hello',
   "description" text DEFAULT '',
   "email" varchar(500),
@@ -62,7 +62,7 @@ CREATE UNIQUE INDEX "very_long_index_name_on_title_field_which_should_be_truncat
 DROP TABLE "Another";
 
 CREATE TABLE "Another" (
-  "id" INTEGER PRIMARY KEY NOT NULL,
+  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
   "num" numeric(10,2)
 );
 
@@ -98,7 +98,7 @@ eq_or_diff(\@sql,
           'BEGIN TRANSACTION',
           q<DROP TABLE "Basic">,
           q<CREATE TABLE "Basic" (
-  "id" INTEGER PRIMARY KEY NOT NULL,
+  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
   "title" varchar(100) NOT NULL DEFAULT 'hello',
   "description" text DEFAULT '',
   "email" varchar(500),
@@ -115,7 +115,7 @@ eq_or_diff(\@sql,
           q<CREATE UNIQUE INDEX "very_long_index_name_on_title_field_which_should_be_truncated_for_various_rdbms" ON "Basic" ("title")>,
           q<DROP TABLE "Another">,
           q<CREATE TABLE "Another" (
-  "id" INTEGER PRIMARY KEY NOT NULL,
+  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
   "num" numeric(10,2)
 )>,
           q<DROP VIEW IF EXISTS "email_list">,
@@ -130,5 +130,3 @@ eq_or_diff(\@sql,
           'COMMIT',
 
           ], 'SQLite translate in list context matches');
-
-
index 5d56adf..2129c29 100644 (file)
@@ -164,4 +164,40 @@ $SQL::Translator::Producer::SQLite::NO_QUOTES = 0;
    is_deeply($result, $expected, 'correctly unquoted excempted DEFAULTs');
 }
 
+{
+   my $table = SQL::Translator::Schema::Table->new(
+       name => 'foo_auto_increment',
+   );
+   $table->add_field(
+       name => 'id',
+       data_type => 'integer',
+       is_nullable => 0,
+       is_auto_increment => 1,
+   );
+   $table->primary_key('id');
+   my $expected = [ qq<CREATE TABLE "foo_auto_increment" (
+  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
+)>];
+   my $result =  [SQL::Translator::Producer::SQLite::create_table($table, { no_comments => 1 })];
+   is_deeply($result, $expected, 'correctly built table with autoincrement on primary key');
+}
+
+{
+   my $table = SQL::Translator::Schema::Table->new(
+       name => 'foo_no_auto_increment',
+   );
+   $table->add_field(
+       name => 'id',
+       data_type => 'integer',
+       is_nullable => 0,
+       is_auto_increment => 0,
+   );
+   $table->primary_key('id');
+   my $expected = [ qq<CREATE TABLE "foo_no_auto_increment" (
+  "id" INTEGER PRIMARY KEY NOT NULL
+)>];
+   my $result =  [SQL::Translator::Producer::SQLite::create_table($table, { no_comments => 1 })];
+   is_deeply($result, $expected, 'correctly built table without autoincrement on primary key');
+}
+
 done_testing;