r53366 - in /trunk/sqlfairy: ./ debian/ lib/SQL/ lib/SQL/Translator/Parser/ lib/SQL/Translator/Parser/DBI/ lib/SQL/Translator/Producer/ t/ t/data/ t/data/mysql/

jawnsy-guest at users.alioth.debian.org jawnsy-guest at users.alioth.debian.org
Fri Feb 26 22:39:15 UTC 2010


Author: jawnsy-guest
Date: Fri Feb 26 22:39:09 2010
New Revision: 53366

URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=53366
Log:
New upstream release

Added:
    trunk/sqlfairy/t/51-xml-to-oracle_quoted.t
      - copied unchanged from r53365, branches/upstream/sqlfairy/current/t/51-xml-to-oracle_quoted.t
    trunk/sqlfairy/t/53-oracle-delay-constraints_quoted.t
      - copied unchanged from r53365, branches/upstream/sqlfairy/current/t/53-oracle-delay-constraints_quoted.t
Modified:
    trunk/sqlfairy/AUTHORS
    trunk/sqlfairy/Changes
    trunk/sqlfairy/MANIFEST
    trunk/sqlfairy/META.yml
    trunk/sqlfairy/debian/changelog
    trunk/sqlfairy/lib/SQL/Translator.pm
    trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/Oracle.pm
    trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm
    trunk/sqlfairy/lib/SQL/Translator/Parser/MySQL.pm
    trunk/sqlfairy/lib/SQL/Translator/Parser/PostgreSQL.pm
    trunk/sqlfairy/lib/SQL/Translator/Producer/Oracle.pm
    trunk/sqlfairy/t/02mysql-parser.t
    trunk/sqlfairy/t/03mysql-to-oracle.t
    trunk/sqlfairy/t/14postgres-parser.t
    trunk/sqlfairy/t/51-xml-to-oracle.t
    trunk/sqlfairy/t/53-oracle-delay-constraints.t
    trunk/sqlfairy/t/data/mysql/create.sql
    trunk/sqlfairy/t/data/roundtrip_autogen.yaml

Modified: trunk/sqlfairy/AUTHORS
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/AUTHORS?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/AUTHORS (original)
+++ trunk/sqlfairy/AUTHORS Fri Feb 26 22:39:09 2010
@@ -11,6 +11,7 @@
 -   Daniel Ruoso <daniel at ruoso.com>
 -   Darren Chamberlain <dlc at users.sourceforge.net>
 -   Dave Cash <dave at gnofn.org>
+-   Fabien Wernli <faxmodem at cpan.org>
 -   Geoff Cant <geoff at catalyst.net.nz>
 -   Gudmundur A. Thorisson <mummi at cshl.org>
 -   Guillermo Roditi <groditi at cpan.org>

Modified: trunk/sqlfairy/Changes
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/Changes?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/Changes (original)
+++ trunk/sqlfairy/Changes Fri Feb 26 22:39:09 2010
@@ -1,3 +1,14 @@
+# ----------------------------------------------------------
+# 0.11005 2010-02-24
+# ----------------------------------------------------------
+* Fix Parser::DBI::Oracle reading too many tables (RT#49413)
+* Fix Parser::MySQL tripping up on PRIMARY KEY ... USING (currently value is ignored) (RT#50468)
+* Fix runaway debug trace (RT#52276)
+* Fix Parser::PostgreSQL choking on commit; statements in DDL (#RT52277)
+* Producer::Oracle now respects quote_field|table_names, and
+  no longer does name munging of reserved table names
+* Producer::Oracle now correctly outputs databse-unique index names
+
 # ----------------------------------------------------------
 # 0.11004 2010-02-14
 # ----------------------------------------------------------

Modified: trunk/sqlfairy/MANIFEST
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/MANIFEST?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/MANIFEST (original)
+++ trunk/sqlfairy/MANIFEST Fri Feb 26 22:39:09 2010
@@ -157,8 +157,10 @@
 t/49xml-to-pg-samefield.t
 t/50-sqlserver-parser.t
 t/51-xml-to-oracle.t
+t/51-xml-to-oracle_quoted.t
 t/52-oracle-options.t
 t/53-oracle-delay-constraints.t
+t/53-oracle-delay-constraints_quoted.t
 t/54-oracle-alter-field.t
 t/55-oracle-add-field.t
 t/56-sqlite-producer.t

Modified: trunk/sqlfairy/META.yml
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/META.yml?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/META.yml (original)
+++ trunk/sqlfairy/META.yml Fri Feb 26 22:39:09 2010
@@ -53,4 +53,4 @@
   bugtracker: http://rt.cpan.org/NoAuth/Bugs.html?Dist=SQL-Translator
   license: http://opensource.org/licenses/gpl-license.php
   repository: https://sqlfairy.svn.sourceforge.net/svnroot/sqlfairy
-version: 0.11004
+version: 0.11005

Modified: trunk/sqlfairy/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/debian/changelog?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/debian/changelog (original)
+++ trunk/sqlfairy/debian/changelog Fri Feb 26 22:39:09 2010
@@ -1,3 +1,9 @@
+sqlfairy (0.11005-1) UNRELEASED; urgency=low
+
+  * New upstream release
+
+ -- Jonathan Yu <jawnsy at cpan.org>  Fri, 26 Feb 2010 17:50:28 -0500
+
 sqlfairy (0.11004-1) unstable; urgency=low
 
   [ Jonathan Yu ]

Modified: trunk/sqlfairy/lib/SQL/Translator.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/lib/SQL/Translator.pm?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/lib/SQL/Translator.pm (original)
+++ trunk/sqlfairy/lib/SQL/Translator.pm Fri Feb 26 22:39:09 2010
@@ -24,7 +24,7 @@
 
 require 5.005;
 
-$VERSION  = '0.11004';
+$VERSION  = '0.11005';
 $DEBUG    = 0 unless defined $DEBUG;
 $ERROR    = "";
 

Modified: trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/Oracle.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/Oracle.pm?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/Oracle.pm (original)
+++ trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/Oracle.pm Fri Feb 26 22:39:09 2010
@@ -48,10 +48,10 @@
 
     my $schema = $tr->schema;
 
-    my $sth = $dbh->table_info();
+    my $db_user = uc $tr->parser_args()->{db_user};
+    my $sth = $dbh->table_info(undef, $db_user, '%', 'TABLE');
 
     while(my $table_info = $sth->fetchrow_hashref('NAME_uc')) {
-        next unless ($table_info->{TABLE_TYPE} eq 'TABLE');
         next if ($table_info->{TABLE_NAME} =~ /\$/);
 
         # create the table

Modified: trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm (original)
+++ trunk/sqlfairy/lib/SQL/Translator/Parser/DBI/PostgreSQL.pm Fri Feb 26 22:39:09 2010
@@ -184,7 +184,7 @@
         
         $fk_select->execute('public',$table_name) or die "Can't execute: $@";
         my $fkeys = $fk_select->fetchall_arrayref({});
-        print Dumper $fkeys;
+        $DEBUG and print Dumper $fkeys;
         for my $con (@$fkeys){
             my $con_name         = $con->{conname};
             my $fields           = $con->{fields};

Modified: trunk/sqlfairy/lib/SQL/Translator/Parser/MySQL.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/lib/SQL/Translator/Parser/MySQL.pm?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/lib/SQL/Translator/Parser/MySQL.pm (original)
+++ trunk/sqlfairy/lib/SQL/Translator/Parser/MySQL.pm Fri Feb 26 22:39:09 2010
@@ -641,39 +641,41 @@
     /foreign key/i
     { $return = '' }
 
-primary_key_def : primary_key index_name(?) '(' name_with_opt_paren(s /,/) ')'
+primary_key_def : primary_key index_name_not_using(?) index_type(?) '(' name_with_opt_paren(s /,/) ')' index_type(?)
     { 
         $return       = { 
             supertype => 'constraint',
-            name      => $item{'index_name(?)'}[0],
+            name      => $item[2][0],
             type      => 'primary_key',
-            fields    => $item[4],
+            fields    => $item[5],
+            options   => $item[3][0] || $item[7][0],
         };
     }
 
-unique_key_def : UNIQUE KEY(?) index_name(?) '(' name_with_opt_paren(s /,/) ')'
+unique_key_def : UNIQUE KEY(?) index_name_not_using(?) index_type(?) '(' name_with_opt_paren(s /,/) ')' index_type(?)
     { 
         $return       = { 
             supertype => 'constraint',
-            name      => $item{'index_name(?)'}[0],
+            name      => $item[3][0],
             type      => 'unique',
-            fields    => $item[5],
+            fields    => $item[6],
+            options   => $item[4][0] || $item[8][0],
         } 
     }
 
-normal_index : KEY index_name_not_using(?) index_type(?) '(' name_with_opt_paren(s /,/) ')'
+normal_index : KEY index_name_not_using(?) index_type(?) '(' name_with_opt_paren(s /,/) ')' index_type(?)
     { 
         $return       = { 
             supertype => 'index',
             type      => 'normal',
             name      => $item[2][0],
             fields    => $item[5],
-            options   => $item[3][0],
-        } 
+            options   => $item[3][0] || $item[7][0],
+        }
     }
 
 index_name_not_using : QUOTED_NAME
-    | /(\b(?!using)\w+\b)/ { $return = $1 }
+    | /(\b(?!using)\w+\b)/ { $return = ($1 =~ /^using/i) ? undef : $1 }
 
 index_type : /using (btree|hash|rtree)/i { $return = uc $1 }
 

Modified: trunk/sqlfairy/lib/SQL/Translator/Parser/PostgreSQL.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/lib/SQL/Translator/Parser/PostgreSQL.pm?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/lib/SQL/Translator/Parser/PostgreSQL.pm (original)
+++ trunk/sqlfairy/lib/SQL/Translator/Parser/PostgreSQL.pm Fri Feb 26 22:39:09 2010
@@ -152,7 +152,10 @@
   | select
   | copy
   | readin_symbol
+  | commit
   | <error>
+
+commit : /commit/i ';'
 
 connect : /^\s*\\\connect.*\n/
 

Modified: trunk/sqlfairy/lib/SQL/Translator/Producer/Oracle.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/lib/SQL/Translator/Producer/Oracle.pm?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/lib/SQL/Translator/Producer/Oracle.pm (original)
+++ trunk/sqlfairy/lib/SQL/Translator/Producer/Oracle.pm Fri Feb 26 22:39:09 2010
@@ -42,6 +42,15 @@
 This option remove the primary key and other key constraints from the
 CREATE TABLE statement and adds ALTER TABLEs at the end with it.
 
+=item quote_field_names
+
+Controls whether quotes are being used around column names in generated DDL.
+
+=item quote_table_names
+
+Controls whether quotes are being used around table, sequence and trigger names in
+generated DDL.
+
 =back
 
 =head1 NOTES
@@ -124,7 +133,7 @@
     mediumblob => 'blob',
     longblob   => 'blob',
     tinytext   => 'varchar2',
-    text       => 'clob',
+    text       => [ 'varchar2', 4000 ],
     longtext   => 'clob',
     mediumtext => 'clob',
     enum       => 'varchar2',
@@ -170,36 +179,6 @@
 );
 
 #
-# Oracle reserved words from:
-# http://technet.oracle.com/docs/products/oracle8i/doc_library/\
-# 817_doc/server.817/a85397/ap_keywd.htm
-#
-my %ora_reserved = map { $_, 1 } qw(
-    ACCESS ADD ALL ALTER AND ANY AS ASC AUDIT 
-    BETWEEN BY
-    CHAR CHECK CLUSTER COLUMN COMMENT COMPRESS CONNECT CREATE CURRENT
-    DATE DECIMAL DEFAULT DELETE DESC DISTINCT DROP
-    ELSE EXCLUSIVE EXISTS 
-    FILE FLOAT FOR FROM
-    GRANT GROUP 
-    HAVING
-    IDENTIFIED IMMEDIATE IN INCREMENT INDEX INITIAL INSERT
-    INTEGER INTERSECT INTO IS
-    LEVEL LIKE LOCK LONG 
-    MAXEXTENTS MINUS MLSLABEL MODE MODIFY 
-    NOAUDIT NOCOMPRESS NOT NOWAIT NULL NUMBER 
-    OF OFFLINE ON ONLINE OPTION OR ORDER
-    PCTFREE PRIOR PRIVILEGES PUBLIC
-    RAW RENAME RESOURCE REVOKE ROW ROWID ROWNUM ROWS
-    SELECT SESSION SET SHARE SIZE SMALLINT START 
-    SUCCESSFUL SYNONYM SYSDATE 
-    TABLE THEN TO TRIGGER 
-    UID UNION UNIQUE UPDATE USER
-    VALIDATE VALUES VARCHAR VARCHAR2 VIEW
-    WHENEVER WHERE WITH
-);
-
-#
 # Oracle 8/9 max size of data types from:
 # http://www.ss64.com/orasyntax/datatypes.html
 #
@@ -216,8 +195,10 @@
 my $max_id_length    = 30;
 my %used_identifiers = ();
 my %global_names;
-my %unreserve;
 my %truncated;
+
+# Quote used to escape table, field, sequence and trigger names
+my $quote_char  = '"';
 
 # -------------------------------------------------------------------
 sub produce {
@@ -227,10 +208,13 @@
     my $no_comments    = $translator->no_comments;
     my $add_drop_table = $translator->add_drop_table;
     my $schema         = $translator->schema;
+    my $oracle_version  = $translator->producer_args->{oracle_version} || 0;
     my $delay_constraints = $translator->producer_args->{delay_constraints};
     my ($output, $create, @table_defs, @fk_defs, @trigger_defs, @index_defs, @constraint_defs);
 
     $create .= header_comment unless ($no_comments);
+    my $qt = 1 if $translator->quote_table_names;
+    my $qf = 1 if $translator->quote_field_names;
 
     if ( $translator->parser_type =~ /mysql/i ) {
         $create .= 
@@ -250,6 +234,8 @@
                 show_warnings     => $WARN,
                 no_comments       => $no_comments,
                 delay_constraints => $delay_constraints,
+                quote_table_names => $qt,
+                quote_field_names => $qf,
             }
         );
         push @table_defs, @$table_def;
@@ -265,6 +251,7 @@
             $view,
             {
                 add_drop_view     => $add_drop_table,
+                quote_table_names => $qt,
             }
         );
         push @view_defs, @$view_def;
@@ -274,7 +261,8 @@
         return defined $create ? $create : (), @table_defs, @view_defs, @fk_defs, @trigger_defs, @index_defs, @constraint_defs;
     }
     else {
-        $create .= join ('', map { $_ ? "$_;\n\n" : () } @table_defs, @view_defs, @fk_defs, @index_defs, @constraint_defs);
+        $create .= join (";\n\n", @table_defs, @view_defs, @fk_defs, @index_defs, @constraint_defs);
+        $create .= ";\n\n";
         # If wantarray is not set we have to add "/" in this statement
         # DBI->do() needs them omitted
         # triggers may NOT end with a semicolon
@@ -287,16 +275,17 @@
 
 sub create_table {
     my ($table, $options) = @_;
+    my $qt = $options->{quote_table_names};
+    my $qf = $options->{quote_field_names};
     my $table_name = $table->name;
+    my $table_name_q = quote($table_name,$qt);
 
     my $item = '';
     my $drop;
     my (@create, @field_defs, @constraint_defs, @fk_defs, @trigger_defs);
 
-    my $table_name_ur = unreserve($table_name) or next;
-
-    push @create, "--\n-- Table: $table_name_ur\n--" unless $options->{no_comments};
-    push @create, qq[DROP TABLE $table_name_ur CASCADE CONSTRAINTS] if $options->{add_drop_table};
+    push @create, "--\n-- Table: $table_name\n--" unless $options->{no_comments};
+    push @create, qq[DROP TABLE $table_name_q CASCADE CONSTRAINTS] if $options->{add_drop_table};
 
         my ( %field_name_scope, @field_comments );
         for my $field ( $table->get_fields ) {
@@ -336,31 +325,40 @@
         #
         for my $c ( $table->get_constraints ) {
             my $name    = $c->name || '';
-            my @fields  = map { unreserve( $_, $table_name ) } $c->fields;
-            my @rfields = map { unreserve( $_, $table_name ) } 
-                $c->reference_fields;
+            my @fields  = map { quote($_,$qf) } $c->fields;
+            my @rfields = quote($c->reference_fields,$qf);
             next if !@fields && $c->type ne CHECK_C;
 
             if ( $c->type eq PRIMARY_KEY ) {
                 # create a name if delay_constraints
                 $name ||= mk_name( $table_name, 'pk' )
                   if $options->{delay_constraints};
+                $name = quote($name,$qf);
                 push @constraint_defs, ($name ? "CONSTRAINT $name " : '') .
-                	'PRIMARY KEY (' . join( ', ', @fields ) . ')';
+                  'PRIMARY KEY (' . join( ', ', @fields ) . ')';
             }
             elsif ( $c->type eq UNIQUE ) {
-            	# Don't create UNIQUE constraints identical to the primary key
-            	if ( my $pk = $table->primary_key ) {
-					my $u_fields = join(":", @fields);
-					my $pk_fields = join(":", $pk->fields);
-					next if $u_fields eq $pk_fields;
-            	}
-
-                $name ||= mk_name( $name || $table_name, 'u' );
+              # Don't create UNIQUE constraints identical to the primary key
+              if ( my $pk = $table->primary_key ) {
+                my $u_fields = join(":", @fields);
+                my $pk_fields = join(":", $pk->fields);
+                next if $u_fields eq $pk_fields;
+              }
+
+              if ($name) {
+                # Force prepend of table_name as ORACLE doesn't allow duplicate
+                # CONSTRAINT names even for different tables (ORA-02264)
+                $name = "${table_name}_$name" unless $name =~ /^$table_name/;
+              }
+              else {
+                $name = mk_name( $table_name, 'u' );
+              }
+
+              $name = quote($name, $qf);
 
                 for my $f ( $c->fields ) {
                     my $field_def = $table->get_field( $f ) or next;
-                    my $dtype     = $translate{ $field_def->data_type } or next;
+                    my $dtype     = $translate{ ref $field_def->data_type eq "ARRAY" ? $field_def->data_type->[0] : $field_def->data_type} or next;
                     if ( $WARN && $dtype =~ /clob/i ) {
                         warn "Oracle will not allow UNIQUE constraints on " .
                              "CLOB field '" . $field_def->table->name . '.' .
@@ -373,18 +371,20 @@
             }
             elsif ( $c->type eq CHECK_C ) {
                 $name ||= mk_name( $name || $table_name, 'ck' );
+                $name = quote($name, $qf);
                 my $expression = $c->expression || '';
                 push @constraint_defs, "CONSTRAINT $name CHECK ($expression)";
             }
             elsif ( $c->type eq FOREIGN_KEY ) {
                 $name = mk_name( join('_', $table_name, $c->fields). '_fk' );
+                $name = quote($name, $qf);
                 my $def = "CONSTRAINT $name FOREIGN KEY ";
 
                 if ( @fields ) {
                     $def .= '(' . join( ', ', @fields ) . ')';
                 }
 
-                my $ref_table = unreserve($c->reference_table);
+                my $ref_table = quote($c->reference_table,$qt);
 
                 $def .= " REFERENCES $ref_table";
 
@@ -406,7 +406,7 @@
                 #    $def .= ' ON UPDATE '.join( ' ', $c->on_update );
                 #}
 
-                push @fk_defs, sprintf("ALTER TABLE %s ADD %s", $table_name_ur, $def);
+                push @fk_defs, sprintf("ALTER TABLE %s ADD %s", $table_name_q, $def);
             }
         }
 
@@ -417,8 +417,7 @@
         for my $index ( $table->get_indices ) {
             my $index_name = $index->name || '';
             my $index_type = $index->type || NORMAL;
-            my @fields     = map { unreserve( $_, $table_name ) }
-                             $index->fields;
+            my @fields     = map { quote($_, $qf) } $index->fields;
             next unless @fields;
 
             my @index_options;
@@ -446,22 +445,25 @@
             if ( $index_type eq PRIMARY_KEY ) {
                 $index_name = $index_name ? mk_name( $index_name ) 
                     : mk_name( $table_name, 'pk' );
+                $index_name = quote($index_name, $qf);
                 push @field_defs, 'CONSTRAINT '.$index_name.' PRIMARY KEY '.
                     '(' . join( ', ', @fields ) . ')';
             }
             elsif ( $index_type eq NORMAL ) {
                 $index_name = $index_name ? mk_name( $index_name ) 
                     : mk_name( $table_name, $index_name || 'i' );
+                $index_name = quote($index_name, $qf);
                 push @index_defs, 
-                    "CREATE INDEX $index_name on $table_name_ur (".
+                    "CREATE INDEX $index_name on $table_name_q (".
                         join( ', ', @fields ).  
                     ")$index_options";
             }
             elsif ( $index_type eq UNIQUE ) {
                 $index_name = $index_name ? mk_name( $index_name ) 
                     : mk_name( $table_name, $index_name || 'i' );
+                $index_name = quote($index_name, $qf);
                 push @index_defs, 
-                    "CREATE UNIQUE INDEX $index_name on $table_name_ur (".
+                    "CREATE UNIQUE INDEX $index_name on $table_name_q (".
                         join( ', ', @fields ).  
                     ")$index_options"; 
             }
@@ -475,7 +477,7 @@
             for my $comment ( @table_comments ) {
                 next unless $comment;
                 $comment =~ s/'/''/g;
-                push @field_comments, "COMMENT ON TABLE $table_name_ur is\n '".
+                push @field_comments, "COMMENT ON TABLE $table_name_q is\n '".
                 $comment . "'" unless $options->{no_comments}
                 ;
             }
@@ -483,12 +485,12 @@
 
         my $table_options = @table_options 
             ? "\n".join("\n", @table_options) : '';
-    push @create, "CREATE TABLE $table_name_ur (\n" .
+    push @create, "CREATE TABLE $table_name_q (\n" .
             join( ",\n", map { "  $_" } @field_defs,
             ($options->{delay_constraints} ? () : @constraint_defs) ) .
             "\n)$table_options";
 
-    @constraint_defs = map { 'ALTER TABLE '.$table_name_ur.' ADD '.$_  }
+    @constraint_defs = map { "ALTER TABLE $table_name_q ADD $_"  }
       @constraint_defs;
 
     if ( $WARN ) {
@@ -496,12 +498,6 @@
             warn "Truncated " . keys( %truncated ) . " names:\n";
             warn "\t" . join( "\n\t", sort keys %truncated ) . "\n";
         }
-
-        if ( %unreserve ) {
-            warn "Encounted " . keys( %unreserve ) .
-                " unsafe names in schema (reserved or invalid):\n";
-            warn "\t" . join( "\n\t", sort keys %unreserve ) . "\n";
-        }
     }
 
     return \@create, \@fk_defs, \@trigger_defs, \@index_defs, ($options->{delay_constraints} ? \@constraint_defs : []);
@@ -510,6 +506,7 @@
 sub alter_field {
     my ($from_field, $to_field, $options) = @_;
 
+    my $qt = $options->{quote_table_names};
     my ($field_create, $field_defs, $trigger_defs, $field_comments) =
       create_field($to_field, $options, {});
 
@@ -520,34 +517,35 @@
         @$field_defs = map { s/ NOT NULL//; $_} @$field_defs;
     }
 
-    my $table_name = $to_field->table->name;
-    my $table_name_ur = unreserve( $table_name );
-
-    return 'ALTER TABLE '.$table_name_ur.' MODIFY ( '.join('', @$field_defs).' )';
+    my $table_name = quote($to_field->table->name,$qt);
+
+    return 'ALTER TABLE '.$table_name.' MODIFY ( '.join('', @$field_defs).' )';
 }
 
 sub add_field {
     my ($new_field, $options) = @_;
 
+    my $qt = $options->{quote_table_names};
     my ($field_create, $field_defs, $trigger_defs, $field_comments) =
       create_field($new_field, $options, {});
 
-    my $table_name = $new_field->table->name;
-    my $table_name_ur = unreserve( $table_name );
+    my $table_name = quote($new_field->table->name,$qt);
 
     my $out = sprintf('ALTER TABLE %s ADD ( %s )',
-                      $table_name_ur,
+                      $table_name,
                       join('', @$field_defs));
     return $out;
 }
 
 sub create_field {
     my ($field, $options, $field_name_scope) = @_;
+    my $qf = $options->{quote_field_names};
+    my $qt = $options->{quote_table_names};
 
     my (@create, @field_defs, @trigger_defs, @field_comments);
 
     my $table_name = $field->table->name;
-    my $table_name_ur = unreserve( $table_name );
+    my $table_name_q = quote($table_name, $qt);
 
     #
     # Field name
@@ -555,10 +553,9 @@
     my $field_name    = mk_name(
                                 $field->name, '', $field_name_scope, 1
                                );
-
-    my $field_name_ur = unreserve( $field_name, $table_name );
-    my $field_def     = $field_name_ur;
-    $field->name( $field_name_ur );
+    my $field_name_q = quote($field_name, $qf);
+    my $field_def     = quote($field_name, $qf);
+    $field->name( $field_name );
 
     #
     # Datatype
@@ -572,7 +569,7 @@
     my $commalist = join( ', ', map { qq['$_'] } @$list );
 
     if ( $data_type eq 'enum' ) {
-        $check = "CHECK ($field_name_ur IN ($commalist))";
+        $check = "CHECK ($field_name_q IN ($commalist))";
         $data_type = 'varchar2';
     }
     elsif ( $data_type eq 'set' ) {
@@ -581,12 +578,16 @@
         $data_type = 'varchar2';
     }
     else {
-        $data_type  = defined $translate{ $data_type } ?
-          $translate{ $data_type } :
-            $data_type;
-        $data_type ||= 'varchar2';
-    }
-    
+      if (defined $translate{ $data_type }) {
+        if (ref $translate{ $data_type } eq "ARRAY") {
+          ($data_type,$size[0])  = @{$translate{ $data_type }};
+        } else {
+          $data_type  = $translate{ $data_type };
+        }
+      }
+      $data_type ||= 'varchar2';
+    }
+
     # ensure size is not bigger than max size oracle allows for data type
     if ( defined $max_size{$data_type} ) {
         for ( my $i = 0 ; $i < scalar @size ; $i++ ) {
@@ -683,37 +684,37 @@
     # Auto_increment
     #
     if ( $field->is_auto_increment ) {
-        my $base_name    = $table_name_ur . "_". $field_name;
-        my $seq_name     = mk_name( $base_name, 'sq' );
-        my $trigger_name = mk_name( $base_name, 'ai' );
+        my $base_name    = $table_name . "_". $field_name;
+        my $seq_name     = quote(mk_name( $base_name, 'sq' ),$qt);
+        my $trigger_name = quote(mk_name( $base_name, 'ai' ),$qt);
 
         push @create, qq[DROP SEQUENCE $seq_name] if $options->{add_drop_table};
         push @create, "CREATE SEQUENCE $seq_name";
         my $trigger =
           "CREATE OR REPLACE TRIGGER $trigger_name\n" .
-          "BEFORE INSERT ON $table_name_ur\n" .
+          "BEFORE INSERT ON $table_name_q\n" .
           "FOR EACH ROW WHEN (\n" .
-          " new.$field_name_ur IS NULL".
-          " OR new.$field_name_ur = 0\n".
+          " new.$field_name_q IS NULL".
+          " OR new.$field_name_q = 0\n".
           ")\n".
           "BEGIN\n" .
           " SELECT $seq_name.nextval\n" .
-          " INTO :new." . $field->name."\n" .
+          " INTO :new." . $field_name_q."\n" .
           " FROM dual;\n" .
           "END;\n";
-        
+
         push @trigger_defs, $trigger;
     }
 
     if ( lc $field->data_type eq 'timestamp' ) {
-        my $base_name = $table_name_ur . "_". $field_name_ur;
-        my $trig_name = mk_name( $base_name, 'ts' );
+        my $base_name = $table_name . "_". $field_name;
+        my $trig_name = quote(mk_name( $base_name, 'ts' ), $qt);
         my $trigger = 
           "CREATE OR REPLACE TRIGGER $trig_name\n".
-          "BEFORE INSERT OR UPDATE ON $table_name_ur\n".
-          "FOR EACH ROW WHEN (new.$field_name_ur IS NULL)\n".
+          "BEFORE INSERT OR UPDATE ON $table_name_q\n".
+          "FOR EACH ROW WHEN (new.$field_name_q IS NULL)\n".
           "BEGIN \n".
-          " SELECT sysdate INTO :new.$field_name_ur FROM dual;\n".
+          " SELECT sysdate INTO :new.$field_name_q FROM dual;\n".
           "END;\n";
 
           push @trigger_defs, $trigger;
@@ -724,7 +725,7 @@
     if ( my $comment = $field->comments ) {
         $comment =~ s/'/''/g;
         push @field_comments, 
-          "COMMENT ON COLUMN $table_name_ur.$field_name_ur is\n '" .
+          "COMMENT ON COLUMN $table_name_q.$field_name_q is\n '" .
             $comment . "';" unless $options->{no_comments};
     }
 
@@ -735,7 +736,8 @@
 
 sub create_view {
     my ($view, $options) = @_;
-    my $view_name = $view->name;
+    my $qt = $options->{quote_table_names};
+    my $view_name = quote($view->name,$qt);
     
     my @create;
     push @create, qq[DROP VIEW $view_name]
@@ -787,28 +789,14 @@
     return $name;
 }
 
+1;
+
 # -------------------------------------------------------------------
-sub unreserve {
-    my $name            = shift || '';
-    my $schema_obj_name = shift || '';
-
-    my ( $suffix ) = ( $name =~ s/(\W.*)$// ) ? $1 : '';
-
-    # also trap fields that don't begin with a letter
-    return $name if !$ora_reserved{ uc $name } && $name =~ /^[a-z]/i; 
-
-    if ( $schema_obj_name ) {
-        ++$unreserve{"$schema_obj_name.$name"};
-    }
-    else {
-        ++$unreserve{"$name (table name)"};
-    }
-
-    my $unreserve = sprintf '%s_', $name;
-    return $unreserve.$suffix;
+sub quote {
+  my ($name, $q) = @_;
+  $q && $name ? "$quote_char$name$quote_char" : $name;
 }
 
-1;
 
 # -------------------------------------------------------------------
 # All bad art is the result of good intentions.
@@ -825,7 +813,8 @@
 =head1 AUTHORS
 
 Ken Youens-Clark E<lt>kclark at cpan.orgE<gt>,
-Alexander Hartmaier E<lt>abraxxa at cpan.org<gt>.
+Alexander Hartmaier E<lt>abraxxa at cpan.orgE<gt>,
+Fabien Wernli E<lt>faxmodem at cpan.orgE<gt>.
 
 =head1 SEE ALSO
 

Modified: trunk/sqlfairy/t/02mysql-parser.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/t/02mysql-parser.t?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/t/02mysql-parser.t (original)
+++ trunk/sqlfairy/t/02mysql-parser.t Fri Feb 26 22:39:09 2010
@@ -83,7 +83,7 @@
               date timestamp,
               time_stamp2 timestamp,
               KEY (i1),
-              UNIQUE (date, i1),
+              UNIQUE (date, i1) USING BTREE,
               KEY date_idx (date),
               KEY name_idx (name(10))
             ) TYPE=MyISAM PACK_KEYS=1;
@@ -234,9 +234,9 @@
               tax                       decimal(8,2),
               shipping_charge           decimal(8,2),
               price_paid                decimal(8,2),
-              PRIMARY KEY (order_id),
-              KEY (status),
-              KEY (billing_address_id),
+              PRIMARY KEY (order_id) USING BTREE,
+              KEY (status) USING BTREE,
+              KEY USING BTREE (billing_address_id),
               KEY (shipping_address_id),
               KEY (member_id, store_id),
               FOREIGN KEY (status)              REFERENCES order_status(id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,

Modified: trunk/sqlfairy/t/03mysql-to-oracle.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/t/03mysql-to-oracle.t?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/t/03mysql-to-oracle.t (original)
+++ trunk/sqlfairy/t/03mysql-to-oracle.t Fri Feb 26 22:39:09 2010
@@ -25,7 +25,9 @@
 
 my $tr       = SQL::Translator->new(
     parser   => "MySQL",
-    producer => "Oracle"
+    producer => "Oracle",
+    quote_table_names => 0,
+    quote_field_names => 0,
 );
 
 my $output = $tr->translate(\$create);

Modified: trunk/sqlfairy/t/14postgres-parser.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/t/14postgres-parser.t?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/t/14postgres-parser.t (original)
+++ trunk/sqlfairy/t/14postgres-parser.t Fri Feb 26 22:39:09 2010
@@ -91,6 +91,8 @@
     alter table only t_test1 drop constraint foo cascade;
 
     alter table t_test1 owner to foo;
+
+    commit;
 ];
 
 $| = 1;

Modified: trunk/sqlfairy/t/51-xml-to-oracle.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/t/51-xml-to-oracle.t?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/t/51-xml-to-oracle.t (original)
+++ trunk/sqlfairy/t/51-xml-to-oracle.t Fri Feb 26 22:39:09 2010
@@ -19,6 +19,8 @@
 my $sqlt;
 $sqlt = SQL::Translator->new(
     no_comments => 1,
+    quote_table_names => 0,
+    quote_field_names => 0,
     show_warnings  => 0,
     add_drop_table => 1,
 );
@@ -44,7 +46,7 @@
           'CREATE TABLE Basic (
   id number(10) NOT NULL,
   title varchar2(100) DEFAULT \'hello\' NOT NULL,
-  description clob DEFAULT \'\',
+  description varchar2(4000) DEFAULT \'\',
   email varchar2(500),
   explicitnulldef varchar2,
   explicitemptystring varchar2 DEFAULT \'\',
@@ -52,7 +54,7 @@
   another_id number(10) DEFAULT \'2\',
   timest date,
   PRIMARY KEY (id),
-  CONSTRAINT emailuniqueindex UNIQUE (email)
+  CONSTRAINT Basic_emailuniqueindex UNIQUE (email)
 )',
           'DROP TABLE Another CASCADE CONSTRAINTS',
           'DROP SEQUENCE sq_Another_id',
@@ -108,7 +110,7 @@
 CREATE TABLE Basic (
   id number(10) NOT NULL,
   title varchar2(100) DEFAULT 'hello' NOT NULL,
-  description clob DEFAULT '',
+  description varchar2(4000) DEFAULT '',
   email varchar2(500),
   explicitnulldef varchar2,
   explicitemptystring varchar2 DEFAULT '',
@@ -116,7 +118,7 @@
   another_id number(10) DEFAULT '2',
   timest date,
   PRIMARY KEY (id),
-  CONSTRAINT emailuniqueindex UNIQUE (email)
+  CONSTRAINT Basic_emailuniqueindex UNIQUE (email)
 );
 
 DROP TABLE Another CASCADE CONSTRAINTS;

Modified: trunk/sqlfairy/t/53-oracle-delay-constraints.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/t/53-oracle-delay-constraints.t?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/t/53-oracle-delay-constraints.t (original)
+++ trunk/sqlfairy/t/53-oracle-delay-constraints.t Fri Feb 26 22:39:09 2010
@@ -20,7 +20,9 @@
 $sqlt = SQL::Translator->new(
     show_warnings  => 0,
     add_drop_table => 0,
-    producer_args  => { 'delay_constraints' => 1 }
+    producer_args  => { 'delay_constraints' => 1 },
+    quote_table_names => 0,
+    quote_field_names => 0,
 );
 
 my $sql_string = $sqlt->translate(

Modified: trunk/sqlfairy/t/data/mysql/create.sql
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/t/data/mysql/create.sql?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/t/data/mysql/create.sql (original)
+++ trunk/sqlfairy/t/data/mysql/create.sql Fri Feb 26 22:39:09 2010
@@ -15,7 +15,7 @@
 	employee_id integer,
   job_title varchar(255),
 	CONSTRAINT FK5302D47D93FE702E FOREIGN KEY (employee_id) REFERENCES person (person_id),
-	PRIMARY KEY  (position, employee_id)
+	PRIMARY KEY  (position, employee_id) USING BTREE
 ) ENGINE=InnoDB;
 
 create table deleted (

Modified: trunk/sqlfairy/t/data/roundtrip_autogen.yaml
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/sqlfairy/t/data/roundtrip_autogen.yaml?rev=53366&op=diff
==============================================================================
--- trunk/sqlfairy/t/data/roundtrip_autogen.yaml (original)
+++ trunk/sqlfairy/t/data/roundtrip_autogen.yaml Fri Feb 26 22:39:09 2010
@@ -279,4 +279,4 @@
   producer_type: SQL::Translator::Producer::YAML
   show_warnings: 0
   trace: 0
-  version: 0.11004
+  version: 0.11005




More information about the Pkg-perl-cvs-commits mailing list