fixed parsing of Pg COMMENT ON ... syntax
Chris Mungall [Sat, 23 Oct 2004 19:58:32 +0000 (19:58 +0000)]
previously only recognised comments on TABLE and COLUMN
also would not recognise comment_phrases split over multiple lines

now accept all comment types; however, it does not add information
to the datamodel except for TABLE and COLUMN

accepts comments split over multiple lines

will barf if comment includes escaped singlequote ''

test 08 extended to deal with parsing comments gracefully
(does not check contents of datamodel however)

lib/SQL/Translator/Parser/PostgreSQL.pm
t/08postgres-to-mysql.t

index 1076934..58e4642 100644 (file)
@@ -1,7 +1,7 @@
 package SQL::Translator::Parser::PostgreSQL;
 
 # -------------------------------------------------------------------
-# $Id: PostgreSQL.pm,v 1.41 2004-09-17 21:53:35 kycl4rk Exp $
+# $Id: PostgreSQL.pm,v 1.42 2004-10-23 19:58:19 cmungall Exp $
 # -------------------------------------------------------------------
 # Copyright (C) 2002-4 SQLFairy Authors
 #
@@ -108,7 +108,7 @@ View table:
 
 use strict;
 use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ];
-$VERSION = sprintf "%d.%02d", q$Revision: 1.41 $ =~ /(\d+)\.(\d+)/;
+$VERSION = sprintf "%d.%02d", q$Revision: 1.42 $ =~ /(\d+)\.(\d+)/;
 $DEBUG   = 0 unless defined $DEBUG;
 
 use Data::Dumper;
@@ -139,10 +139,12 @@ $GRAMMAR = q!
 startrule : statement(s) eofile { \%tables }
 
 eofile : /^\Z/
+   
 
 statement : create
   | comment_on_table
   | comment_on_column
+  | comment_on_other
   | comment
   | alter
   | grant
@@ -277,10 +279,46 @@ comment_on_column : /comment/i /on/i /column/i column_name /is/i comment_phrase
             $item{'comment_phrase'};
     }
 
+comment_on_other : /comment/i /on/i /\w+/ /\w+/ /is/i comment_phrase ';'
+    {
+        push(@table_comments, $item{'comment_phrase'});
+    }
+
+# [added by cjm 20041019]
+# [TODO: other comment-on types]
+# for now we just have a general mechanism for handling other
+# kinds of comments than table/column; I'm not sure of the best
+# way to incorporate these into the datamodel
+#
+# this is the exhaustive list of types of comment:
+#COMMENT ON DATABASE my_database IS 'Development Database';
+#COMMENT ON INDEX my_index IS 'Enforces uniqueness on employee id';
+#COMMENT ON RULE my_rule IS 'Logs UPDATES of employee records';
+#COMMENT ON SEQUENCE my_sequence IS 'Used to generate primary keys';
+#COMMENT ON TABLE my_table IS 'Employee Information';
+#COMMENT ON TYPE my_type IS 'Complex Number support';
+#COMMENT ON VIEW my_view IS 'View of departmental costs';
+#COMMENT ON COLUMN my_table.my_field IS 'Employee ID number';
+#COMMENT ON TRIGGER my_trigger ON my_table IS 'Used for R.I.';
+#
+# this is tested by test 08
+
 column_name : NAME '.' NAME
     { $return = { table => $item[1], field => $item[3] } }
 
-comment_phrase : /'.*?'|NULL/ 
+comment_phrase : /null/i
+    { $return = 'NULL' }
+
+comment_phrase : /'/ comment_phrase_unquoted(s) /'/
+    { my $phrase = join(' ', @{ $item[2] });
+      $return = $phrase}
+
+# [cjm TODO: double-single quotes in a comment_phrase]
+comment_phrase_unquoted : /[^\']*/
+    { $return = $item[1] }
+
+
+xxxcomment_phrase : /'.*?'|NULL/ 
     { 
         my $val = $item[1] || '';
         $val =~ s/^'|'$//g;
index c087a0e..fc4a498 100644 (file)
@@ -52,6 +52,21 @@ create index cvterm_idx1 on cvterm (cv_id);
 -- unique within a given cv
 
 
+COMMENT ON TABLE cvterm IS
+ 'A term, class or concept within an ontology
+  or controlled vocabulary';
+COMMENT ON COLUMN cvterm.cv_id IS
+ 'The cv/ontology/namespace to which this cvterm belongs';
+COMMENT ON COLUMN cvterm.name IS
+ 'A concise human-readable name describing the meaning of the cvterm';
+COMMENT ON COLUMN cvterm.definition IS
+ 'A human-readable text definition';
+COMMENT ON COLUMN cvterm.dbxref_id IS
+ 'A human-readable text definition';
+COMMENT ON INDEX cvterm_c1 IS 
+ 'the OBO identifier is globally unique';
+
+
 -- ================================================
 -- TABLE: cvrelationship
 -- ================================================