table_options:
TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }
+ or ENGINE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }
or AUTO_INCREMENT = #
or AVG_ROW_LENGTH = #
+ or [ DEFAULT ] CHARACTER SET charset_name
or CHECKSUM = {0 | 1}
+ or COLLATE collation_name
or COMMENT = "string"
or MAX_ROWS = #
or MIN_ROWS = #
or DATA DIRECTORY="absolute path to directory"
or INDEX DIRECTORY="absolute path to directory"
+
A subset of the ALTER TABLE syntax that allows addition of foreign keys:
ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification] ...
use base qw(Exporter);
our %type_mapping = (
- int => SQL_INTEGER,
- integer => SQL_INTEGER,
-
- tinyint => SQL_TINYINT,
- smallint => SQL_SMALLINT,
- mediumint,
- bigint,
-
- float => SQL_FLOAT, # Precision 0..23
- double => SQL_DOUBLE, # Precision 24..53
- "double precision" => SQL_DOUBLE,
- real => SQL_DOUBLE,
-
- # all these are the same.
- decimal => SQL_DECIMAL,
- numeric => SQL_NUMERIC,
- dec => SQL_DECIMAL,
- # fixed: does this exist
-
- bit => SQL_BIT
-
- date => SQL_DATE,
- datetime => SQL_DATETIME,
- timestamp => SQL_TIMESTAMP,
- time => SQL_TIME,
- year
-
-
- char => SQL_CHAR,
- varchar => SQL_VARCHAR,
- binary => SQL_BINARY,
- varbinary => SQL_VARBINARY,
- tinyblob => SQL_BLOB,
- tinytext =>
- blob => SQL_BLOB,
- text => SQL_LONGVARCHAR
- mediumblob => SQL_BLOB,
- mediumtext => SQL_LONGVARCHAR
- longblob => SQL_BLOB
- longtext => SQL_LONGVARCHAR
-
- enum
- set
);
@EXPORT_OK = qw(parse);
push @{ $tables{ $item{'table_name'} }{'indices'} },
{
name => $item[4],
- type => $item[2] ? 'unique' : 'normal',
+ type => $item[2][0] ? 'unique' : 'normal',
fields => $item[8],
}
;
name_with_opt_paren : NAME parens_value_list(s?)
{ $item[2][0] ? "$item[1]($item[2][0][0])" : $item[1] }
-UNIQUE : /unique/i { 1 }
+UNIQUE : /unique/i
KEY : /key/i | /index/i
$comment =~ s/'$//;
$return = { comment => $comment };
}
- | /(default )?(charset|character set)/i /\s*=\s*/ WORD
+ | /(default )?(charset|character set)/i /\s*=?\s*/ WORD
{
$return = { 'CHARACTER SET' => $item[3] };
}
+ | /collate/i WORD
+ {
+ $return = { 'COLLATE' => $item[2] }
+ }
| WORD /\s*=\s*/ WORD
{
$return = { $item[1] => $item[3] };
COMMA : ','
-NAME : "`" /\w+/ "`"
+BACKTICK : '`'
+
+NAME : BACKTICK /\w+/ BACKTICK
{ $item[2] }
| /\w+/
{ $item[1] }
) or die $table->error;
}
- if ( $field->data_type =~ /(set|enum)/i && !$field->size ) {
- my %extra = $field->extra;
- my $longest = 0;
- for my $len ( map { length } @{ $extra{'list'} || [] } ) {
- $longest = $len if $len > $longest;
- }
- $field->size( $longest ) if $longest;
- }
-
for my $cdata ( @{ $fdata->{'constraints'} } ) {
next unless $cdata->{'type'} eq 'foreign_key';
$cdata->{'fields'} ||= [ $field->name ];
}
elsif ( lc $type =~ /(float|double|decimal|numeric|real|fixed|dec)/ ) {
my $old_size = (ref $size || '') eq 'ARRAY' ? $size : [];
- $changed = @$old_size != 2 && $old_size->[0] != 8 && $old_size->[1] != 2;
+ $changed = @$old_size != 2 || $old_size->[0] != 8 || $old_size->[1] != 2;
$size = [8,2];
}
}
$changed = $size != 4_294_967_295;
$size = 4_294_967_295;
}
- $DB::single = 1 if $field->name eq 'employee_id';
+ if ( $field->data_type =~ /(set|enum)/i && !$field->size ) {
+ my %extra = $field->extra;
+ my $longest = 0;
+ for my $len ( map { length } @{ $extra{'list'} || [] } ) {
+ $longest = $len if $len > $longest;
+ }
+ $changed = 1;
+ $size = $longest if $longest;
+ }
+
+
if ($changed) {
# We only want to clone the field, not *everything*
{ local $field->{table} = undef;
}
$field->size($size);
$field->data_type($type);
- $field->sql_data_type( $type_mapping{lc $type} || SQL_UNKNOWN_TYPE );
+ $field->sql_data_type( $type_mapping{lc $type} ) if exists $type_mapping{lc $type};
$field->extra->{list} = $list if @$list;
}
}