X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract%2FTree.pm;h=1c3a82f6821765fc4a881c4487ddde869e0e5934;hb=b912ee1e3ff72a0194e4d41b886627c4b8219cbd;hp=02de4d9ae53ef1d2a0e17d36a153ea6d07659f36;hpb=efc991a0345e071e54a205ab938c0baf3f6e3380;p=dbsrgits%2FSQL-Abstract.git
diff --git a/lib/SQL/Abstract/Tree.pm b/lib/SQL/Abstract/Tree.pm
index 02de4d9..1c3a82f 100644
--- a/lib/SQL/Abstract/Tree.pm
+++ b/lib/SQL/Abstract/Tree.pm
@@ -68,12 +68,20 @@ my @expression_start_keywords = (
'GROUP \s+ BY',
'HAVING',
'ORDER \s+ BY',
+ 'SKIP',
+ 'FIRST',
'LIMIT',
'OFFSET',
'FOR',
'UNION',
'INTERSECT',
'EXCEPT',
+ 'BEGIN \s+ WORK',
+ 'COMMIT',
+ 'ROLLBACK \s+ TO \s+ SAVEPOINT',
+ 'ROLLBACK',
+ 'SAVEPOINT',
+ 'RELEASE \s+ SAVEPOINT',
'RETURNING',
'ROW_NUMBER \s* \( \s* \) \s+ OVER',
);
@@ -146,11 +154,16 @@ my %indents = (
join => 1,
'left join' => 1,
on => 2,
+ having => 0,
'group by' => 0,
'order by' => 0,
set => 1,
into => 1,
values => 1,
+ limit => 1,
+ offset => 1,
+ skip => 1,
+ first => 1,
);
my %profiles = (
@@ -161,31 +174,52 @@ my %profiles = (
indent_amount => 2,
newline => "\n",
colormap => {},
- indentmap => { %indents },
+ indentmap => \%indents,
eval { require Term::ANSIColor }
? do {
my $c = \&Term::ANSIColor::color;
+
+ my $red = [$c->('red') , $c->('reset')];
+ my $cyan = [$c->('cyan') , $c->('reset')];
+ my $green = [$c->('green') , $c->('reset')];
+ my $yellow = [$c->('yellow') , $c->('reset')];
+ my $blue = [$c->('blue') , $c->('reset')];
+ my $magenta = [$c->('magenta'), $c->('reset')];
+ my $b_o_w = [$c->('black on_white'), $c->('reset')];
(
- placeholder_surround => [$c->('black on_cyan'), $c->('reset')],
+ placeholder_surround => [q(') . $c->('black on_magenta'), $c->('reset') . q(')],
colormap => {
- select => [$c->('red'), $c->('reset')],
- 'insert into' => [$c->('red'), $c->('reset')],
- update => [$c->('red'), $c->('reset')],
- 'delete from' => [$c->('red'), $c->('reset')],
-
- set => [$c->('cyan'), $c->('reset')],
- from => [$c->('cyan'), $c->('reset')],
-
- where => [$c->('green'), $c->('reset')],
- values => [$c->('yellow'), $c->('reset')],
-
- join => [$c->('magenta'), $c->('reset')],
- 'left join' => [$c->('magenta'), $c->('reset')],
- on => [$c->('blue'), $c->('reset')],
-
- 'group by' => [$c->('yellow'), $c->('reset')],
- 'order by' => [$c->('yellow'), $c->('reset')],
+ 'begin work' => $b_o_w,
+ commit => $b_o_w,
+ rollback => $b_o_w,
+ savepoint => $b_o_w,
+ 'rollback to savepoint' => $b_o_w,
+ 'release savepoint' => $b_o_w,
+
+ select => $red,
+ 'insert into' => $red,
+ update => $red,
+ 'delete from' => $red,
+
+ set => $cyan,
+ from => $cyan,
+
+ where => $green,
+ values => $yellow,
+
+ join => $magenta,
+ 'left join' => $magenta,
+ on => $blue,
+
+ 'group by' => $yellow,
+ having => $yellow,
+ 'order by' => $yellow,
+
+ skip => $green,
+ first => $green,
+ limit => $green,
+ offset => $green,
}
);
} : (),
@@ -197,7 +231,7 @@ my %profiles = (
indent_amount => 2,
newline => "\n",
colormap => {},
- indentmap => { %indents },
+ indentmap => \%indents,
},
html => {
fill_in_placeholders => 1,
@@ -210,17 +244,34 @@ my %profiles = (
'insert into' => ['' , ''],
update => ['' , ''],
'delete from' => ['' , ''],
- where => ['' , ''],
+
+ set => ['', ''],
from => ['' , ''],
+
+ where => ['' , ''],
+ values => ['', ''],
+
join => ['' , ''],
+ 'left join' => ['',''],
on => ['' , ''],
+
'group by' => ['', ''],
+ having => ['', ''],
'order by' => ['', ''],
- set => ['', ''],
- into => ['', ''],
- values => ['', ''],
+
+ skip => ['', ''],
+ first => ['', ''],
+ limit => ['', ''],
+ offset => ['', ''],
+
+ 'begin work' => ['', ''],
+ commit => ['', ''],
+ rollback => ['', ''],
+ savepoint => ['', ''],
+ 'rollback to savepoint' => ['', ''],
+ 'release savepoint' => ['', ''],
},
- indentmap => { %indents },
+ indentmap => \%indents,
},
none => {
colormap => {},
@@ -233,6 +284,9 @@ sub new {
my $args = shift || {};
my $profile = delete $args->{profile} || 'none';
+
+ die "No such profile '$profile'!" unless exists $profiles{$profile};
+
my $data = $merger->merge( $profiles{$profile}, $args );
bless $data, $class
@@ -248,7 +302,7 @@ sub parse {
defined $token
and
length $token
- and
+ and
$token =~ /\S/
);
}
@@ -461,6 +515,10 @@ sub format { my $self = shift; $self->unparse($self->parse($_[0]), $_[1]) }
=pod
+=head1 NAME
+
+SQL::Abstract::Tree - Represent SQL as an AST
+
=head1 SYNOPSIS
my $sqla_tree = SQL::Abstract::Tree->new({ profile => 'console' });