SQL-Translator
view release on metacpan or search on metacpan
lib/SQL/Translator/Parser/SQLite.pm view on Meta::CPAN
type : WORD parens_value_list(?)
{
$return = {
type => $item[1],
size => $item[2][0],
}
}
column_constraint_def : CONSTRAINT constraint_name column_constraint
{
$return = {
name => $item[2],
%{ $item[3] },
}
}
|
column_constraint
column_constraint : NOT_NULL conflict_clause(?)
{
$return = {
type => 'not_null',
}
}
|
PRIMARY_KEY sort_order(?) conflict_clause(?)
{
$return = {
type => 'primary_key',
sort_order => $item[2][0],
on_conflict => $item[2][0],
}
}
|
UNIQUE conflict_clause(?)
{
$return = {
type => 'unique',
on_conflict => $item[2][0],
}
}
|
CHECK_C '(' expr ')' conflict_clause(?)
{
$return = {
type => 'check',
expression => $item[3],
on_conflict => $item[5][0],
}
}
|
DEFAULT VALUE
{
$return = {
type => 'default',
value => $item[2],
}
}
|
REFERENCES ref_def cascade_def(?)
{
$return = {
type => 'foreign_key',
reference_table => $item[2]{'reference_table'},
reference_fields => $item[2]{'reference_fields'},
on_delete => $item[3][0]{'on_delete'},
on_update => $item[3][0]{'on_update'},
}
}
|
AUTOINCREMENT
{
$return = {
type => 'autoincrement',
}
}
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',
type => 'primary_key',
fields => $item[2],
on_conflict => $item[3][0],
}
}
|
UNIQUE parens_field_list conflict_clause(?)
{
$return = {
supertype => 'constraint',
type => 'unique',
fields => $item[2],
on_conflict => $item[3][0],
}
}
|
CHECK_C '(' expr ')' conflict_clause(?)
{
$return = {
supertype => 'constraint',
type => 'check',
expression => $item[3],
on_conflict => $item[5][0],
}
}
|
FOREIGN_KEY parens_field_list REFERENCES ref_def cascade_def(?)
{
$return = {
supertype => 'constraint',
type => 'foreign_key',
fields => $item[2],
reference_table => $item[4]{'reference_table'},
reference_fields => $item[4]{'reference_fields'},
on_delete => $item[5][0]{'on_delete'},
on_update => $item[5][0]{'on_update'},
}
}
ref_def : table_name parens_field_list
{ $return = { reference_table => $item[1]{name}, reference_fields => $item[2] } }
cascade_def : cascade_update_def cascade_delete_def(?)
{ $return = { on_update => $item[1], on_delete => $item[2][0] } }
|
cascade_delete_def cascade_update_def(?)
{ $return = { on_delete => $item[1], on_update => $item[2][0] } }
cascade_delete_def : /on\s+delete\s+(set null|set default|cascade|restrict|no action)/i
{ $return = $1}
cascade_update_def : /on\s+update\s+(set null|set default|cascade|restrict|no action)/i
{ $return = $1}
table_name : qualified_name
qualified_name : NAME
{ $return = { name => $item[1] } }
qualified_name : /(\w+)\.(\w+)/
{ $return = { db_name => $1, name => $2 } }
field_name : NAME
constraint_name : NAME
conflict_clause : /on conflict/i conflict_algorigthm
conflict_algorigthm : /(rollback|abort|fail|ignore|replace)/i
parens_field_list : '(' column_list ')'
{ $item[2] }
column_list : field_name(s /,/)
parens_value_list : '(' VALUE(s /,/) ')'
{ $item[2] }
expr : /[^)]* \( [^)]+ \) [^)]*/x # parens, balanced one deep
| /[^)]+/
sort_order : /(ASC|DESC)/i
#
# Create Trigger
create : CREATE TEMPORARY(?) TRIGGER NAME before_or_after(?) database_event ON table_name trigger_action SEMICOLON
{
my $table_name = $item[8]->{'name'};
push @triggers, {
name => $item[4],
is_temporary => $item[2][0] ? 1 : 0,
when => $item[5][0],
instead_of => 0,
db_events => [ $item[6] ],
action => $item[9],
on_table => $table_name,
}
}
create : CREATE TEMPORARY(?) TRIGGER NAME instead_of database_event ON view_name trigger_action
{
my $table_name = $item[8]->{'name'};
push @triggers, {
name => $item[4],
is_temporary => $item[2][0] ? 1 : 0,
when => undef,
instead_of => 1,
db_events => [ $item[6] ],
action => $item[9],
on_table => $table_name,
}
( run in 2.121 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )