package SQL::Translator::Parser::MySQL;
# -------------------------------------------------------------------
-# $Id: MySQL.pm,v 1.25 2003-06-11 03:59:49 kycl4rk Exp $
+# $Id: MySQL.pm,v 1.32 2003-08-17 07:44:06 rossta Exp $
# -------------------------------------------------------------------
# Copyright (C) 2003 Ken Y. Clark <kclark@cpan.org>,
# darren chamberlain <darren@cpan.org>,
use strict;
use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ];
-$VERSION = sprintf "%d.%02d", q$Revision: 1.25 $ =~ /(\d+)\.(\d+)/;
+$VERSION = sprintf "%d.%02d", q$Revision: 1.32 $ =~ /(\d+)\.(\d+)/;
$DEBUG = 0 unless defined $DEBUG;
use Data::Dumper;
statement : comment
| use
+ | set
| drop
| create
| <error>
use : /use/i WORD ';'
+set : /set/i /[^;]+/ ';'
+
drop : /drop/i WORD(s) ';'
create : CREATE /database/i WORD ';'
| field
| <error>
-comment : /^\s*(?:#|-{2}).*\n/
+comment : /^\s*(?:#|-{2}).*\n/ {
+ my $comment = $item[1];
+ $comment =~ s/^\s*(#|-{2})\s*//;
+ $comment =~ s/\s*$//;
+ $return = $comment;
+}
blank : /\s*/
-field : field_name data_type field_qualifier(s?) reference_definition(?)
+field : comment(s?) field_name data_type field_qualifier(s?) reference_definition(?) comment(s?)
{
my %qualifiers = map { %$_ } @{ $item{'field_qualifier(s?)'} || [] };
my $null = defined $item{'not_null'} ? $item{'not_null'} : 1;
$qualifiers{ $_ } = 1 for @type_quals;
}
+ my @comments = ( @{ $item[1] }, @{ $item[6] } );
+
$return = {
supertype => 'field',
name => $item{'field_name'},
list => $item{'data_type'}{'list'},
null => $null,
constraints => $item{'reference_definition(?)'},
+ comments => [ @comments ],
%qualifiers,
}
}
}
}
+field_qualifier : /character set/i WORD
+ {
+ $return = {
+ character_set => $item[2],
+ }
+ }
+
reference_definition : /references/i table_name parens_field_list(?) match_type(?) on_delete_do(?) on_update_do(?)
{
$return = {
| fulltext_index
| <error>
-table_name : WORD
+table_name : NAME
-field_name : WORD
+field_name : NAME
index_name : WORD
elsif ( lc $type eq 'bigint' ) {
$size = [20];
}
- elsif ( lc $type =~ /(float|double|decimal|numeric|real)/ ) {
+ elsif ( lc $type =~ /(float|double|decimal|numeric|real|fixed|dec)/ ) {
$size = [8,2];
}
}
opt_constraint : /constraint/i WORD
-primary_key_def : primary_key index_name(?) '(' field_name(s /,/) ')'
+primary_key_def : primary_key index_name(?) '(' name_with_opt_paren(s /,/) ')'
{
$return = {
supertype => 'constraint',
default_value => $fdata->{'default'},
is_auto_increment => $fdata->{'is_auto_inc'},
is_nullable => $fdata->{'null'},
+ comments => $fdata->{'comments'},
) or die $table->error;
$table->primary_key( $field->name ) if $fdata->{'is_primary_key'};
if ( $field->data_type =~ /(set|enum)/i && !$field->size ) {
my %extra = $field->extra;
- my $longest;
+ my $longest = 0;
for my $len ( map { length } @{ $extra{'list'} || [] } ) {
$longest = $len if $len > $longest;
}