X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FMySQL.pm;h=a877a9b79ccadf299dbe6349ee39493aabd9407f;hb=09fa21a61ddab6f0fd8f7cdcdd7cbda74e44566c;hp=32e2dd9f9b9f1193604704a2e2246b51232373e1;hpb=7898fb7045258aacfe9a925462d97450f01a118c;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Parser/MySQL.pm b/lib/SQL/Translator/Parser/MySQL.pm index 32e2dd9..a877a9b 100644 --- a/lib/SQL/Translator/Parser/MySQL.pm +++ b/lib/SQL/Translator/Parser/MySQL.pm @@ -1,7 +1,7 @@ package SQL::Translator::Parser::MySQL; # ------------------------------------------------------------------- -# $Id: MySQL.pm,v 1.37 2003-08-21 02:38:34 kycl4rk Exp $ +# $Id: MySQL.pm,v 1.42 2004-01-25 18:09:51 kycl4rk Exp $ # ------------------------------------------------------------------- # Copyright (C) 2003 Ken Y. Clark , # darren chamberlain , @@ -123,7 +123,7 @@ Here's the word from the MySQL site use strict; use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ]; -$VERSION = sprintf "%d.%02d", q$Revision: 1.37 $ =~ /(\d+)\.(\d+)/; +$VERSION = sprintf "%d.%02d", q$Revision: 1.42 $ =~ /(\d+)\.(\d+)/; $DEBUG = 0 unless defined $DEBUG; use Data::Dumper; @@ -167,7 +167,7 @@ use : /use/i WORD ';' set : /set/i /[^;]+/ ';' { @table_comments = () } -drop : /drop/i TABLE ';' +drop : /drop/i TABLE /[^;]+/ ';' drop : /drop/i WORD(s) ';' { @table_comments = () } @@ -211,10 +211,8 @@ create : CREATE TEMPORARY(?) TABLE opt_if_not_exists(?) table_name '(' create_de } } - for my $opt ( @{ $item{'table_option(s?)'} } ) { - if ( my ( $key, $val ) = each %$opt ) { - $tables{ $table_name }{'table_options'}{ $key } = $val; - } + if ( my @options = @{ $item{'table_option(s?)'} } ) { + $tables{ $table_name }{'table_options'} = \@options; } 1; @@ -237,6 +235,7 @@ create : CREATE UNIQUE(?) /(index|key)/i index_name /on/i table_name '(' field_n create_definition : constraint | index | field + | comment | comment : /^\s*(?:#|-{2}).*\n/ @@ -339,9 +338,9 @@ reference_definition : /references/i table_name parens_field_list(?) match_type( } } -match_type : /match full/i { 'match_full' } +match_type : /match full/i { 'full' } | - /match partial/i { 'match_partial' } + /match partial/i { 'partial' } on_delete_do : /on delete/i reference_option { $item[2] } @@ -364,7 +363,7 @@ table_name : NAME field_name : NAME -index_name : WORD +index_name : NAME data_type : WORD parens_value_list(s?) type_qualifier(s?) { @@ -443,9 +442,15 @@ not_null : /not/i /null/i { $return = 0 } unsigned : /unsigned/i { $return = 0 } -default_val : /default/i /(?:')?[\w\d:.-]*(?:')?/ - { - $item[2] =~ s/'//g; +#default_val : /default/i /(?:')?[\s\w\d:.-]*(?:')?/ +# { +# $item[2] =~ s/'//g; +# $return = $item[2]; +# } + +default_val : /default/i /'(?:.*?\\')*.*?'|(?:')?[\w\d:.-]*(?:')?/ + { + $item[2] =~ s/^\s*'|'\s*$//g; $return = $item[2]; } @@ -458,18 +463,25 @@ constraint : primary_key_def | foreign_key_def | -foreign_key_def : opt_constraint(?) /foreign key/i WORD(?) parens_field_list reference_definition +foreign_key_def : foreign_key_def_begin parens_field_list reference_definition { $return = { supertype => 'constraint', type => 'foreign_key', - name => $item[3][0], - fields => $item[4], + name => $item[1], + fields => $item[2], %{ $item{'reference_definition'} }, } } -opt_constraint : /constraint/i WORD +foreign_key_def_begin : /constraint/i /foreign key/i + { $return = '' } + | + /constraint/i WORD /foreign key/i + { $return = $item[2] } + | + /foreign key/i + { $return = '' } primary_key_def : primary_key index_name(?) '(' name_with_opt_paren(s /,/) ')' { @@ -518,9 +530,9 @@ UNIQUE : /unique/i { 1 } KEY : /key/i | /index/i -table_option : /[^\s;]*/ +table_option : WORD /\s*=\s*/ WORD { - $return = { split /=/, $item[1] } + $return = { $item[1] => $item[3] }; } CREATE : /create/i @@ -635,6 +647,10 @@ sub parse { ) or die $table->error; } + if ( my @options = @{ $tdata->{'table_options'} || [] } ) { + $table->options( \@options ) or die $table->error; + } + for my $cdata ( @{ $tdata->{'constraints'} || [] } ) { my $constraint = $table->add_constraint( name => $cdata->{'name'},