#
# Create Index
#
-create : CREATE TEMPORARY(?) UNIQUE(?) INDEX WORD ON table_name parens_field_list conflict_clause(?) SEMICOLON
+create : CREATE TEMPORARY(?) UNIQUE(?) INDEX NAME ON table_name parens_field_list conflict_clause(?) SEMICOLON
{
my $db_name = $item[7]->{'db_name'} || '';
my $table_name = $item[7]->{'name'};
definition : constraint_def | column_def
-column_def: comment(s?) NAME type(?) column_constraint(s?)
+column_def: comment(s?) NAME type(?) column_constraint_def(s?)
{
my $column = {
supertype => 'column',
elsif ( $c->{'type'} eq 'default' ) {
$column->{'default'} = $c->{'value'};
}
+ elsif ( $c->{'type'} eq 'autoincrement' ) {
+ $column->{'is_auto_inc'} = 1;
+ }
}
$column;
}
}
+column_constraint_def : CONSTRAINT constraint_name column_constraint
+ {
+ $return = {
+ name => $item[2],
+ %{ $item[3] },
+ }
+ }
+ |
+ column_constraint
+
column_constraint : NOT_NULL conflict_clause(?)
{
$return = {
reference_fields => $item[2]{'reference_fields'},
}
}
+ |
+ AUTOINCREMENT
+ {
+ $return = {
+ type => 'autoincrement',
+ }
+ }
-constraint_def : PRIMARY_KEY parens_field_list conflict_clause(?)
+constraint_def : comment(s?) CONSTRAINT constraint_name table_constraint
+ {
+ $return = {
+ comments => $item[1],
+ name => $item[3],
+ %{ $item[4] },
+ }
+ }
+ |
+ comment(s?) table_constraint
+ {
+ $return = {
+ comments => $item[1],
+ %{ $item[2] },
+ }
+ }
+
+table_constraint : PRIMARY_KEY parens_field_list conflict_clause(?)
{
$return = {
supertype => 'constraint',
field_name : NAME
+constraint_name : NAME
+
conflict_clause : /on conflict/i conflict_algorigthm
conflict_algorigthm : /(rollback|abort|fail|ignore|replace)/i
REFERENCES : /references/i
+CONSTRAINT : /constraint/i
+
+AUTOINCREMENT : /autoincrement/i
+
UNIQUE : /unique/i { 1 }
SEMICOLON : ';'
-NAME : /'?(\w+)'?/ { $return = $1 }
+NAME : /["']?(\w+)["']?/ { $return = $1 }
VALUE : /[-+]?\.?\d+(?:[eE]\d+)?/
{ $item[1] }
for my $idata ( @{ $tdata->{'indices'} || [] } ) {
my $index = $table->add_index(
name => $idata->{'name'},
- type => uc $idata->{'type'},
+ type => uc ($idata->{'type'}||''),
fields => $idata->{'fields'},
) or die $table->error;
}