Added an 'alter sequence' line to the parser grammer which will simply skip over...
Ash Berlin [Sat, 12 Jan 2008 13:42:42 +0000 (13:42 +0000)]
Added a select section to the parser.  This is to handle function calls that
may affect the tables during creation.

Added the setval function.  Unfortunately, nothing is being done with this
because the parser doesn't seem to handle sequences.

Skipping all COPY commands because they are not needed for schema creation.

Added a line each for revoking and granting permissions for a schema.  This
doesn't actually do anything with that information.

Applied patch submitted by Nathan Gray

Removes periods in an index/constraint name caused by schema.tablename being appended to the name.

Strips a schema from the table name during index/constraint creation because a schema-qualified table name is not allowed.
r12687@metis (orig r1322):  mwz444 | 2007-12-18 16:20:28 +0000
r12747@metis (orig r1323):  mwz444 | 2007-12-20 15:48:09 +0000
r12797@metis (orig r1326):  mwz444 | 2007-12-20 20:07:22 +0000

lib/SQL/Translator/Parser/PostgreSQL.pm
lib/SQL/Translator/Producer/SQLite.pm

index 09a8815..9eafa5e 100644 (file)
@@ -154,6 +154,9 @@ statement : create
   | connect
   | update
   | set
+  | select
+  | copy
+  | readin_symbol
   | <error>
 
 connect : /^\s*\\\connect.*\n/
@@ -172,6 +175,9 @@ revoke : /revoke/i WORD(s /,/) /on/i TABLE(?) table_name /from/i name_with_opt_q
         }
     }
 
+revoke : /revoke/i WORD(s /,/) /on/i SCHEMA(?) schema_name /from/i name_with_opt_quotes(s /,/) ';'
+    { 1 }
+
 grant : /grant/i WORD(s /,/) /on/i TABLE(?) table_name /to/i name_with_opt_quotes(s /,/) ';'
     {
         my $table_info  = $item{'table_name'};
@@ -184,6 +190,9 @@ grant : /grant/i WORD(s /,/) /on/i TABLE(?) table_name /to/i name_with_opt_quote
         }
     }
 
+grant : /grant/i WORD(s /,/) /on/i SCHEMA(?) schema_name /to/i name_with_opt_quotes(s /,/) ';'
+    { 1 }
+
 drop : /drop/i /[^;]*/ ';'
 
 string :
@@ -462,6 +471,8 @@ table_name : schema_qualification(?) name_with_opt_quotes {
 
   schema_qualification : name_with_opt_quotes '.'
 
+schema_name : name_with_opt_quotes
+
 field_name : name_with_opt_quotes
 
 name_with_opt_quotes : double_quote(?) NAME double_quote(?) { $item[2] }
@@ -765,6 +776,9 @@ alter : alter_table table_name DROP /constraint/i NAME restrict_or_cascade ';'
 alter : alter_table table_name /owner/i /to/i NAME ';'
     { 1 }
 
+alter : alter_sequence NAME /owned/i /by/i column_name ';'
+    { 1 }
+
 storage_type : /(plain|external|extended|main)/i
 
 alter_default_val : SET default_val 
@@ -832,6 +846,8 @@ add_column : ADD COLUMN(?)
 
 alter_table : ALTER TABLE ONLY(?)
 
+alter_sequence : ALTER SEQUENCE 
+
 drop_column : DROP COLUMN(?)
 
 alter_column : ALTER COLUMN(?)
@@ -841,6 +857,24 @@ rename_column : /rename/i COLUMN(?)
 restrict_or_cascade : /restrict/i | 
     /cascade/i
 
+# Handle functions that can be called
+select : SELECT select_function ';' 
+    { 1 }
+
+# Read the setval function but don't do anything with it because this parser
+# isn't handling sequences
+select_function : schema_qualification(?) /setval/i '(' VALUE /,/ VALUE /,/ /(true|false)/i ')' 
+    { 1 }
+
+# Skipping all COPY commands
+copy : COPY WORD /[^;]+/ ';' { 1 }
+    { 1 }
+
+# The "\." allows reading in from STDIN but this isn't needed for schema
+# creation, so it is skipped.
+readin_symbol : '\.'
+    {1}
+
 #
 # End basically useless stuff. - ky
 #
@@ -901,8 +935,16 @@ COLUMN : /column/i
 
 TABLE : /table/i
 
+SCHEMA : /schema/i
+
 SEMICOLON : /\s*;\n?/
 
+SEQUENCE : /sequence/i
+
+SELECT : /select/i
+
+COPY : /copy/i
+
 INTEGER : /\d+/
 
 WORD : /\w+/
index 4a870b2..75f1d63 100644 (file)
@@ -90,6 +90,7 @@ sub mk_name {
                         : $max_id_length;
     $basename         = substr( $basename, 0, $max_name ) 
                         if length( $basename ) > $max_name;
+    $basename         =~ s/\./_/g;
     my $name          = $type ? "${type}_$basename" : $basename;
 
     if ( $basename ne $basename_orig and $critical ) {
@@ -283,9 +284,11 @@ sub create_index
 
     # strip any field size qualifiers as SQLite doesn't like these
     my @fields = map { s/\(\d+\)$//; $_ } $index->fields;
+    (my $index_table_name = $index->table->name) =~ s/^.+?\.//; # table name may not specify schema
+    warn "removing schema name from '" . $index->table->name . "' to make '$index_table_name'\n" if $WARN;
     my $index_def =  
-    "CREATE ${type}INDEX $name ON " . $index->table->name .
-        ' (' . join( ', ', @fields ) . ')';
+    "CREATE ${type]INDEX $name on " . $index_table_name .
+        ' (' . join( ', ', @fields ) . ');';
 
     return $index_def;
 }
@@ -297,10 +300,12 @@ sub create_constraint
     my $name   = $c->name;
     $name      = mk_name($c->table->name, $name);
     my @fields = $c->fields;
+    (my $index_table_name = $c->table->name) =~ s/^.+?\.//; # table name may not specify schema
+    warn "removing schema name from '" . $c->table->name . "' to make '$index_table_name'\n" if $WARN;
 
     my $c_def =  
-    "CREATE UNIQUE INDEX $name ON " . $c->table->name .
-        ' (' . join( ', ', @fields ) . ')';
+    "CREATE UNIQUE INDEX $name on " . $index_table_name .
+        ' (' . join( ', ', @fields ) . ');';
 
     return $c_def;
 }