X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FParser%2FOracle.pm;h=ddb6b3f3471cae9a24f3279c8fd08997534b7f0e;hb=f4b8e04b825168484da452b5a8492b0ab4adb853;hp=94e9942f71fcf33924ef3d75ab44faa7db8f07d1;hpb=d4f84dd192edc7a64a0b1a9923f1bafc0bc5ef9d;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Parser/Oracle.pm b/lib/SQL/Translator/Parser/Oracle.pm index 94e9942..ddb6b3f 100644 --- a/lib/SQL/Translator/Parser/Oracle.pm +++ b/lib/SQL/Translator/Parser/Oracle.pm @@ -1,8 +1,6 @@ package SQL::Translator::Parser::Oracle; # ------------------------------------------------------------------- -# $Id: Oracle.pm 1440 2009-01-17 16:31:57Z jawnsy $ -# ------------------------------------------------------------------- # Copyright (C) 2002-2009 SQLFairy Authors # # This program is free software; you can redistribute it and/or @@ -96,7 +94,8 @@ was altered to better handle the syntax created by DDL::Oracle. =cut use strict; -use vars qw[ $DEBUG $GRAMMAR @EXPORT_OK ]; +use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ]; +$VERSION = '1.59'; $DEBUG = 0 unless defined $DEBUG; use Data::Dumper; @@ -273,8 +272,8 @@ table_name : NAME '.' NAME | NAME { $item[1] } -create_definition : field - | table_constraint +create_definition : table_constraint + | field | table_comment : comment @@ -394,8 +393,8 @@ column_constraint : constraint_name(?) column_constraint_type constraint_state(s name => $item{'constraint_name(?)'}[0] || '', type => $type, expression => $type eq 'check' ? $expression : '', - deferrable => $item{'deferrable'}, - deferred => $item{'deferred'}, + deferrable => $desc->{'deferrable'}, + deferred => $desc->{'deferred'}, reference_table => $desc->{'reference_table'}, reference_fields => $desc->{'reference_fields'}, # match_type => $desc->{'match_type'}, @@ -410,8 +409,13 @@ column_constraint_type : /not\s+null/i { $return = { type => 'not_null' } } { $return = { type => 'unique' } } | /primary\s+key/i { $return = { type => 'primary_key' } } - | /check/i '(' /[^)]+/ ')' - { $return = { type => 'check', expression => $item[3] } } + | /check/i check_expression + { + $return = { + type => 'check', + expression => $item[2], + }; + } | /references/i table_name parens_word_list(?) on_delete(?) { $return = { @@ -423,6 +427,18 @@ column_constraint_type : /not\s+null/i { $return = { type => 'not_null' } } } } +LPAREN : '(' + +RPAREN : ')' + +check_condition_text : /.+\s+in\s+\([^)]+\)/i + | /[^)]+/ + +check_expression : LPAREN check_condition_text RPAREN + { $return = join( ' ', map { $_ || () } + $item[1], $item[2], $item[3], $item[4][0] ) + } + constraint_state : deferrable { $return = { type => $item[1] } } | deferred { $return = { type => $item[1] } } | /(no)?rely/i { $return = { type => $item[1] } } @@ -554,11 +570,11 @@ table_constraint_type : /primary key/i '(' NAME(s /,/) ')' } } | - /check/ '(' /(.+)/ ')' + /check/i check_expression /^(en|dis)able/i { $return = { type => 'check', - expression => $item[3], + expression => join(' ', $item[2], $item[3]), } } | @@ -669,11 +685,14 @@ sub parse { name => $cdata->{'name'}, type => $cdata->{'type'}, fields => $cdata->{'fields'}, + expression => $cdata->{'expression'}, reference_table => $cdata->{'reference_table'}, reference_fields => $cdata->{'reference_fields'}, match_type => $cdata->{'match_type'} || '', - on_delete => $cdata->{'on_delete'} || $cdata->{'on_delete_do'}, - on_update => $cdata->{'on_update'} || $cdata->{'on_update_do'}, + on_delete => $cdata->{'on_delete'} + || $cdata->{'on_delete_do'}, + on_update => $cdata->{'on_update'} + || $cdata->{'on_update_do'}, ) or die $table->error; } } @@ -713,7 +732,7 @@ sub parse { =head1 AUTHOR -Ken Y. Clark Ekclark@cpan.orgE. +Ken Youens-Clark Ekclark@cpan.orgE. =head1 SEE ALSO