From: Peter Rabbitson Date: Thu, 21 Oct 2010 14:51:31 +0000 (+0000) Subject: Fix default value inserts (an op can have an empty arglist) X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=efc991a0345e071e54a205ab938c0baf3f6e3380;p=scpubgit%2FQ-Branch.git Fix default value inserts (an op can have an empty arglist) --- diff --git a/Changes b/Changes index fc2c77c..6ae9ca0 100644 --- a/Changes +++ b/Changes @@ -10,6 +10,7 @@ Revision history for SQL::Abstract - Special handle IS NOT? NULL - Make sure unparse() does not destroy a passed in \@bindargs - Support ops with _'s in them (valid in Oracle) + - Properly parse both types of default value inserts revision 1.68 2010-09-16 ---------------------------- diff --git a/lib/SQL/Abstract/Tree.pm b/lib/SQL/Abstract/Tree.pm index 4760672..02de4d9 100644 --- a/lib/SQL/Abstract/Tree.pm +++ b/lib/SQL/Abstract/Tree.pm @@ -63,7 +63,7 @@ my @expression_start_keywords = ( )', 'ON', 'WHERE', - 'VALUES', + '(?: DEFAULT \s+ )? VALUES', 'EXISTS', 'GROUP \s+ BY', 'HAVING', @@ -318,8 +318,8 @@ sub _recurse_parse { elsif ( $token =~ / ^ $expr_start_re $ /x ) { my $op = uc $token; my $right = $self->_recurse_parse($tokens, PARSE_IN_EXPR); - $left = $left ? [ $left, [$op => [$right] ]] - : [ $op => [$right] ]; + $left = $left ? [ $left, [$op => [$right||()] ]] + : [ $op => [$right||()] ]; } # NOT elsif ( $token =~ /^ NOT $/ix ) { diff --git a/t/14roundtrippin.t b/t/14roundtrippin.t index 58c3a19..ebbca33 100644 --- a/t/14roundtrippin.t +++ b/t/14roundtrippin.t @@ -7,14 +7,16 @@ use SQL::Abstract::Tree; my $sqlat = SQL::Abstract::Tree->new; my @sql = ( - "SELECT a, b, c FROM foo WHERE foo.a =1 and foo.b LIKE 'station'", - "SELECT * FROM (SELECT * FROM foobar) WHERE foo.a =1 and foo.b LIKE 'station'", - "SELECT * FROM lolz WHERE ( foo.a =1 ) and foo.b LIKE 'station'", - "SELECT [screen].[id], [screen].[name], [screen].[section_id], [screen].[xtype] FROM [users_roles] [me] JOIN [roles] [role] ON [role].[id] = [me].[role_id] JOIN [roles_permissions] [role_permissions] ON [role_permissions].[role_id] = [role].[id] JOIN [permissions] [permission] ON [permission].[id] = [role_permissions].[permission_id] JOIN [permissionscreens] [permission_screens] ON [permission_screens].[permission_id] = [permission].[id] JOIN [screens] [screen] ON [screen].[id] = [permission_screens].[screen_id] WHERE ( [me].[user_id] = ? ) GROUP BY [screen].[id], [screen].[name], [screen].[section_id], [screen].[xtype]" + "INSERT INTO artist DEFAULT VALUES", + "INSERT INTO artist VALUES ()", + "SELECT a, b, c FROM foo WHERE foo.a =1 and foo.b LIKE 'station'", + "SELECT * FROM (SELECT * FROM foobar) WHERE foo.a =1 and foo.b LIKE 'station'", + "SELECT * FROM lolz WHERE ( foo.a =1 ) and foo.b LIKE 'station'", + "SELECT [screen].[id], [screen].[name], [screen].[section_id], [screen].[xtype] FROM [users_roles] [me] JOIN [roles] [role] ON [role].[id] = [me].[role_id] JOIN [roles_permissions] [role_permissions] ON [role_permissions].[role_id] = [role].[id] JOIN [permissions] [permission] ON [permission].[id] = [role_permissions].[permission_id] JOIN [permissionscreens] [permission_screens] ON [permission_screens].[permission_id] = [permission].[id] JOIN [screens] [screen] ON [screen].[id] = [permission_screens].[screen_id] WHERE ( [me].[user_id] = ? ) GROUP BY [screen].[id], [screen].[name], [screen].[section_id], [screen].[xtype]", ); for (@sql) { - is_same_sql($_, $sqlat->format($_), 'roundtrip works'); + is_same_sql($_, $sqlat->format($_), 'roundtrip works'); }