I'm not to be trusted with the chainsaw
Fabien Wernli [Thu, 25 Feb 2010 09:13:29 +0000 (09:13 +0000)]
lib/SQL/Translator/Producer/Oracle.pm
t/51-xml-to-oracle.t
t/51-xml-to-oracle_quoted.t
t/data/oracle/schema_diff_a.yaml
t/data/oracle/schema_diff_b.yaml
t/data/oracle/schema_diff_c.yaml
t/data/sqlite/named.sql [new file with mode: 0644]

index 67e672c..a52ee1b 100644 (file)
@@ -118,9 +118,9 @@ my %translate  = (
     # MySQL types
     #
     bigint     => 'number',
-    double     => 'number',
+    double     => [ 'float', 126 ],
     decimal    => 'number',
-    float      => 'number',
+    float      => 'float',
     int        => 'number',
     integer    => 'number',
     mediumint  => 'number',
@@ -133,7 +133,7 @@ my %translate  = (
     mediumblob => 'blob',
     longblob   => 'blob',
     tinytext   => 'varchar2',
-    text       => [ 'varchar2', 4000 ],
+    text       => 'clob',
     longtext   => 'clob',
     mediumtext => 'clob',
     enum       => 'varchar2',
@@ -184,6 +184,7 @@ my %translate  = (
 #
 my %max_size = (
     char      => 2000,
+    float     => 126,
     nchar     => 2000,
     nvarchar2 => 4000,
     number    => [ 38, 127 ],
@@ -624,6 +625,16 @@ sub create_field {
         undef @size;
     }
 
+    #
+    # Fixes ORA-00906: missing right parenthesis
+               # if size is 0 or undefined
+    #
+    for (qw/varchar2/) {
+        if ( $data_type =~ /^($_)$/i ) {
+            $size[0] ||= $max_size{$_};
+        }
+    }
+
     $field_def .= " $data_type";
     if ( defined $size[0] && $size[0] > 0 ) {
         $field_def .= '(' . join( ',', @size ) . ')';
index 8b5e02c..06776a9 100644 (file)
@@ -46,11 +46,11 @@ my $want = [
           'CREATE TABLE Basic (
   id number(10) NOT NULL,
   title varchar2(100) DEFAULT \'hello\' NOT NULL,
-  description varchar2(4000) DEFAULT \'\',
+  description clob DEFAULT \'\',
   email varchar2(500),
-  explicitnulldef varchar2,
-  explicitemptystring varchar2 DEFAULT \'\',
-  emptytagdef varchar2 DEFAULT \'\',
+  explicitnulldef varchar2(4000),
+  explicitemptystring varchar2(4000) DEFAULT \'\',
+  emptytagdef varchar2(4000) DEFAULT \'\',
   another_id number(10) DEFAULT \'2\',
   timest date,
   PRIMARY KEY (id),
@@ -110,11 +110,11 @@ CREATE SEQUENCE sq_Basic_id01;
 CREATE TABLE Basic (
   id number(10) NOT NULL,
   title varchar2(100) DEFAULT 'hello' NOT NULL,
-  description varchar2(4000) DEFAULT '',
+  description clob DEFAULT '',
   email varchar2(500),
-  explicitnulldef varchar2,
-  explicitemptystring varchar2 DEFAULT '',
-  emptytagdef varchar2 DEFAULT '',
+  explicitnulldef varchar2(4000),
+  explicitemptystring varchar2(4000) DEFAULT '',
+  emptytagdef varchar2(4000) DEFAULT '',
   another_id number(10) DEFAULT '2',
   timest date,
   PRIMARY KEY (id),
index 2e82dd1..292882d 100644 (file)
@@ -46,11 +46,11 @@ my $want = [
           'CREATE TABLE "Basic" (
   "id" number(10) NOT NULL,
   "title" varchar2(100) DEFAULT \'hello\' NOT NULL,
-  "description" varchar2(4000) DEFAULT \'\',
+  "description" clob DEFAULT \'\',
   "email" varchar2(500),
-  "explicitnulldef" varchar2,
-  "explicitemptystring" varchar2 DEFAULT \'\',
-  "emptytagdef" varchar2 DEFAULT \'\',
+  "explicitnulldef" varchar2(4000),
+  "explicitemptystring" varchar2(4000) DEFAULT \'\',
+  "emptytagdef" varchar2(4000) DEFAULT \'\',
   "another_id" number(10) DEFAULT \'2\',
   "timest" date,
   PRIMARY KEY ("id"),
@@ -110,11 +110,11 @@ CREATE SEQUENCE "sq_Basic_id01";
 CREATE TABLE "Basic" (
   "id" number(10) NOT NULL,
   "title" varchar2(100) DEFAULT 'hello' NOT NULL,
-  "description" varchar2(4000) DEFAULT '',
+  "description" clob DEFAULT '',
   "email" varchar2(500),
-  "explicitnulldef" varchar2,
-  "explicitemptystring" varchar2 DEFAULT '',
-  "emptytagdef" varchar2 DEFAULT '',
+  "explicitnulldef" varchar2(4000),
+  "explicitemptystring" varchar2(4000) DEFAULT '',
+  "emptytagdef" varchar2(4000) DEFAULT '',
   "another_id" number(10) DEFAULT '2',
   "timest" date,
   PRIMARY KEY ("id"),
index 9b66596..fefb46d 100644 (file)
@@ -30,7 +30,7 @@ schema:
           size:
             - 0
         name:
-          data_type: varchar2(10)
+          data_type: varchar2
           default_value: ~
           extra: {}
           is_nullable: 0
@@ -39,9 +39,9 @@ schema:
           name: name
           order: 59
           size:
-            - 0
+            - 10
         other:
-          data_type: varchar2(10)
+          data_type: varchar2
           default_value: ~
           extra: {}
           is_nullable: 1
@@ -50,6 +50,6 @@ schema:
           name: other
           order: 59
           size:
-            - 0
+            - 10
       name: d_operator
       order: 11
index 9f050c5..1b9c898 100644 (file)
@@ -30,7 +30,7 @@ schema:
           size:
             - 0
         name:
-          data_type: nvarchar2(10)
+          data_type: nvarchar2
           default_value: ~
           extra: {}
           is_nullable: 0
@@ -39,9 +39,9 @@ schema:
           name: name
           order: 59
           size:
-            - 0
+            - 10
         other:
-          data_type: nvarchar2(10)
+          data_type: nvarchar2
           default_value: ~
           extra: {}
           is_nullable: 0
@@ -50,6 +50,6 @@ schema:
           name: other
           order: 59
           size:
-            - 0
+            - 10
       name: d_operator
       order: 11
index 78f2e5f..f565ce3 100644 (file)
@@ -30,7 +30,7 @@ schema:
           size:
             - 0
         name:
-          data_type: nvarchar2(10)
+          data_type: nvarchar2
           default_value: ~
           extra: {}
           is_nullable: 0
@@ -39,9 +39,9 @@ schema:
           name: name
           order: 59
           size:
-            - 0
+            - 10
         foo:
-          data_type: nvarchar2(10)
+          data_type: nvarchar2
           default_value: ~
           extra: {}
           is_nullable: 0
@@ -50,9 +50,9 @@ schema:
           name: foo
           order: 59
           size:
-            - 0
+            - 10
         other:
-          data_type: nvarchar2(10)
+          data_type: nvarchar2
           default_value: ~
           extra: {}
           is_nullable: 0
@@ -61,6 +61,6 @@ schema:
           name: other
           order: 59
           size:
-            - 0
+            - 10
       name: d_operator
       order: 11
diff --git a/t/data/sqlite/named.sql b/t/data/sqlite/named.sql
new file mode 100644 (file)
index 0000000..7e93878
--- /dev/null
@@ -0,0 +1,9 @@
+create table pet (
+  "pet_id" int,
+  "person_id" int
+    constraint fk_person_id references person(person_id),
+  "name" varchar(30),
+  "age" int,
+  constraint age_under_100 check ( age < 100 ),
+  constraint pk_pet primary key (pet_id, person_id)
+);