nonstring : /[^;\'"]+/
-statement_body : (string | nonstring)(s?)
+statement_body : string | nonstring
-insert : /insert/i statement_body "$delimiter"
+insert : /insert/i statement_body(s?) "$delimiter"
delimiter : /delimiter/i /[\S]+/
{ $delimiter = $item[2] }
PROCEDURE : /procedure/i
| /function/i
-create : CREATE algorithm(?) /view/i NAME not_delimiter "$delimiter"
+create : CREATE replace(?) algorithm(?) /view/i NAME not_delimiter "$delimiter"
{
@table_comments = ();
- my $view_name = $item[4];
- my $sql;
- if (scalar(@{$item[2]}) == 1) {
- $sql = "$item[1] $item[2][0] $item[3] $item[4] $item[5]";
- } else {
- $sql = "$item[1] $item[3] $item[4] $item[5]";
- }
+ my $view_name = $item[5];
+ my $sql = join(q{ }, grep { defined and length } $item[1], $item[2]->[0], $item[3]->[0])
+ . " $item[4] $item[5] $item[6]";
# Hack to strip database from function calls in SQL
$sql =~ s#`\w+`\.(`\w+`\()##g;
$views{ $view_name }{'sql'} = $sql;
}
+replace : /or replace/i
+
algorithm : /algorithm/i /=/ WORD
{
$return = "$item[1]=$item[3]";
unsigned : /unsigned/i { $return = 0 }
-#default_val : /default/i /(?:')?[\s\w\d:.-]*(?:')?/
-# {
-# $item[2] =~ s/'//g;
-# $return = $item[2];
-# }
-
default_val :
/default/i 'CURRENT_TIMESTAMP'
{
$return = \$item[2];
}
|
- /default/i /'(?:.*?\\')*.*?'|(?:')?[\w\d:.-]*(?:')?/
+ /default/i /'(?:.*?(?:\\'|''))*.*?'|(?:')?[\w\d:.-]*(?:')?/
{
$item[2] =~ s/^\s*'|'\s*$//g;
$return = $item[2];
/foreign key/i
{ $return = '' }
-primary_key_def : primary_key index_name(?) '(' name_with_opt_paren(s /,/) ')'
+primary_key_def : primary_key index_name_not_using(?) index_type(?) '(' name_with_opt_paren(s /,/) ')' index_type(?)
{
$return = {
supertype => 'constraint',
- name => $item{'index_name(?)'}[0],
+ name => $item[2][0],
type => 'primary_key',
- fields => $item[4],
+ fields => $item[5],
+ options => $item[3][0] || $item[7][0],
};
}
-unique_key_def : UNIQUE KEY(?) index_name(?) '(' name_with_opt_paren(s /,/) ')'
+unique_key_def : UNIQUE KEY(?) index_name_not_using(?) index_type(?) '(' name_with_opt_paren(s /,/) ')' index_type(?)
{
$return = {
supertype => 'constraint',
- name => $item{'index_name(?)'}[0],
+ name => $item[3][0],
type => 'unique',
- fields => $item[5],
+ fields => $item[6],
+ options => $item[4][0] || $item[8][0],
}
}
-normal_index : KEY index_name(?) '(' name_with_opt_paren(s /,/) ')'
+normal_index : KEY index_name_not_using(?) index_type(?) '(' name_with_opt_paren(s /,/) ')' index_type(?)
{
$return = {
supertype => 'index',
type => 'normal',
- name => $item{'index_name(?)'}[0],
- fields => $item[4],
- }
+ name => $item[2][0],
+ fields => $item[5],
+ options => $item[3][0] || $item[7][0],
+ }
}
+index_name_not_using : QUOTED_NAME
+ | /(\b(?!using)\w+\b)/ { $return = ($1 =~ /^using/i) ? undef : $1 }
+
+index_type : /using (btree|hash|rtree)/i { $return = uc $1 }
+
fulltext_index : /fulltext/i KEY(?) index_name(?) '(' name_with_opt_paren(s /,/) ')'
{
$return = {
DOUBLE_QUOTE: '"'
-NAME : BACKTICK /[^`]+/ BACKTICK
+QUOTED_NAME : BACKTICK /[^`]+/ BACKTICK
{ $item[2] }
| DOUBLE_QUOTE /[^"]+/ DOUBLE_QUOTE
{ $item[2] }
- | /\w+/
- { $item[1] }
-VALUE : /[-+]?\.?\d+(?:[eE]\d+)?/
+NAME: QUOTED_NAME
+ | /\w+/
+
+VALUE : /[-+]?\.?\d+(?:[eE]\d+)?/
{ $item[1] }
| /'.*?'/
{
sql => $result->{procedures}->{$proc_name}->{sql},
);
}
-
my @views = sort {
$result->{views}->{ $a }->{'order'}
<=>
$result->{views}->{ $b }->{'order'}
} keys %{ $result->{views} };
- for my $view_name ( keys %{ $result->{'views'} } ) {
+ for my $view_name ( @views ) {
$schema->add_view(
name => $view_name,
sql => $result->{'views'}->{$view_name}->{sql},