our $GRAMMAR = <<'END_OF_GRAMMAR';
-{ my ( %tables, %indices, %constraints, $table_order, @table_comments, %views, $view_order, %procedures, $proc_order ) }
+{ my ( %tables, %indices, %constraints, $table_order, @table_comments, %views, $view_order, %procedures, $proc_order, %triggers, $trigger_order ) }
#
# The "eofile" rule makes the parser fail if any "statement" rule
constraints => \%constraints,
views => \%views,
procedures => \%procedures,
+ triggers => \%triggers,
};
}
| drop
| <error>
+alter: /alter/i TABLE table_name /add/i table_constraint ';'
+ {
+ my $constraint = $item{table_constraint};
+ $constraint->{type} = $constraint->{constraint_type};
+ push @{$tables{$item{table_name}}{constraints}}, $constraint;
+ }
+
alter : /alter/i WORD /[^;]+/ ';'
{ @table_comments = () }
$return = "$item[2]($arg_list)";
}
+create : /create/i /or replace/i /trigger/i table_name not_end m#^/$#im
+ {
+ @table_comments = ();
+ my $trigger_name = $item[4];
+ # Hack to strip owner from trigger name
+ $trigger_name =~ s#.*\.##;
+ my $owner = '';
+ my $action = "$item[1] $item[2] $item[3] $item[4] $item[5]";
+
+ $triggers{ $trigger_name }{'order'} = ++$trigger_order;
+ $triggers{ $trigger_name }{'name'} = $trigger_name;
+ $triggers{ $trigger_name }{'owner'} = $owner;
+ $triggers{ $trigger_name }{'action'} = $action;
+ }
+
create : /create/i /or replace/i /procedure/i table_name not_end m#^/$#im
{
@table_comments = ();
TABLE : /table/i
-DQSTRING : '"' /((?:[^"]|"")+)/ '"'
- { ($return = $item[2]) =~ s/""/"/g; }
+DQSTRING : '"' <skip: ''> /((?:[^"]|"")+)/ '"'
+ { ($return = $item[3]) =~ s/""/"/g; }
-SQSTRING : "'" /((?:[^']|'')*)/ "'"
- { ($return = $item[2]) =~ s/''/'/g }
+SQSTRING : "'" <skip: ''> /((?:[^']|'')*)/ "'"
+ { ($return = $item[3]) =~ s/''/'/g }
VALUE : /[-+]?\d*\.?\d+(?:[eE]\d+)?/
| SQSTRING
);
}
+ my @triggers = sort {
+ $result->{triggers}->{ $a }->{'order'} <=> $result->{triggers}->{ $b }->{'order'}
+ } keys %{ $result->{triggers} };
+ foreach my $trigger_name (@triggers) {
+ $schema->add_trigger(
+ name => $trigger_name,
+ action => $result->{triggers}->{$trigger_name}->{action},
+ );
+ }
+
return 1;
}