From 72197b1bd0e31f6fe9b321074c7f497a901da565 Mon Sep 17 00:00:00 2001 From: Keita Jamadam Sugama Date: Tue, 7 Oct 2025 12:15:38 +0900 Subject: [PATCH 1/2] prefix AS only for column aliases --- lib/Data/ObjectDriver/SQL.pm | 11 ++++++----- t/11-sql-with-models.t | 14 +++++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/Data/ObjectDriver/SQL.pm b/lib/Data/ObjectDriver/SQL.pm index 06f3a9f..868b6ca 100644 --- a/lib/Data/ObjectDriver/SQL.pm +++ b/lib/Data/ObjectDriver/SQL.pm @@ -79,7 +79,7 @@ sub as_sql { if (blessed($col) && $col->isa('Data::ObjectDriver::SQL')) { push @bind_for_select, @{ $col->{bind} }; @{ $col->{bind} } = (); - $col->as_subquery($alias); + $col->as_subquery(1, $alias); } else { if ($alias) { /(?:^|\.)\Q$alias\E$/ ? $col : "$col $alias"; @@ -120,7 +120,7 @@ sub as_sql { if (blessed($from) && $from->isa('Data::ObjectDriver::SQL')) { push @bind_for_from, @{$from->{bind}}; @{$from->{bind}} = (); - $from->as_subquery; + $from->as_subquery(0); } else { $stmt->_add_index_hint($from); } @@ -146,11 +146,12 @@ sub as_sql { } sub as_subquery { - my ($stmt, $alias) = @_; + my ($stmt, $use_as, $alias) = @_; my $subquery = '(' . $stmt->as_sql . ')'; $alias ||= $stmt->as; if ($alias) { - $subquery .= ' AS ' . $alias; + $subquery .= ' AS' if $use_as; + $subquery .= ' '. $alias; } $subquery; } @@ -335,7 +336,7 @@ sub _mk_term { $term = "$c $val->{op} " . $$value; } elsif (blessed($value) && $value->isa('Data::ObjectDriver::SQL')) { local $value->{as} = undef; - $term = "$c $val->{op} ". $value->as_subquery; + $term = "$c $val->{op} ". $value->as_subquery(0); push @bind, @{$value->{bind}}; } else { $term = "$c $val->{op} ?"; diff --git a/t/11-sql-with-models.t b/t/11-sql-with-models.t index 4c95276..dc05bd6 100644 --- a/t/11-sql-with-models.t +++ b/t/11-sql-with-models.t @@ -39,15 +39,19 @@ $entry22->save; subtest 'as_subquery' => sub { my $stmt = Blog->driver->prepare_statement('Blog', { name => 'foo' }, { fetchonly => ['id'] }); - is(sql_normalize($stmt->as_subquery), sql_normalize(<<'EOF'), 'right sql'); + is(sql_normalize($stmt->as_subquery(1)), sql_normalize(<<'EOF'), 'right sql'); (SELECT blog.id FROM blog WHERE (blog.name = ?)) EOF is_deeply($stmt->{bind}, ['foo'], 'right bind values'); $stmt->as('mysubquery'); - is(sql_normalize($stmt->as_subquery), sql_normalize(<<'EOF'), 'right sql'); + is(sql_normalize($stmt->as_subquery(1)), sql_normalize(<<'EOF'), 'right sql'); (SELECT blog.id FROM blog WHERE (blog.name = ?)) AS mysubquery +EOF + + is(sql_normalize($stmt->as_subquery(0)), sql_normalize(<<'EOF'), 'right sql'); +(SELECT blog.id FROM blog WHERE (blog.name = ?)) mysubquery EOF }; @@ -186,7 +190,7 @@ FROM blog, SELECT entry.id, entry.blog_id, entry.text FROM entry WHERE (entry.text = ?) - ) AS sub + ) sub WHERE ((blog.id = sub.blog_id)) AND ((blog.id IN (?,?))) EOF @@ -224,7 +228,7 @@ FROM blog, SELECT entry.id, entry.blog_id FROM entry WHERE (entry.text = ?) - ) AS sub + ) sub WHERE ((blog.id = sub.blog_id)) AND ((blog.id IN (?,?))) EOF @@ -353,7 +357,7 @@ SELECT (SELECT max(id) FROM entry WHERE (entry.blog_id = blog.id) AND (entry.id < ?)) AS sub1 FROM blog, - (SELECT entry.id FROM entry WHERE (entry.text = ?)) AS sub2 + (SELECT entry.id FROM entry WHERE (entry.text = ?)) sub2 WHERE (blog.id IN (SELECT entry.blog_id FROM entry WHERE (entry.text = ?))) ORDER BY blog.id ASC, sub1 ASC From 8dd074d02acf583fb2fa62c8f64c38646d868244 Mon Sep 17 00:00:00 2001 From: Keita Jamadam Sugama Date: Thu, 9 Oct 2025 03:57:22 +0900 Subject: [PATCH 2/2] ommit AS prefix for subquery in FROM clause --- lib/Data/ObjectDriver/SQL.pm | 9 ++++----- t/11-sql-with-models.t | 16 ++++++---------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/lib/Data/ObjectDriver/SQL.pm b/lib/Data/ObjectDriver/SQL.pm index 868b6ca..d5d8622 100644 --- a/lib/Data/ObjectDriver/SQL.pm +++ b/lib/Data/ObjectDriver/SQL.pm @@ -79,7 +79,7 @@ sub as_sql { if (blessed($col) && $col->isa('Data::ObjectDriver::SQL')) { push @bind_for_select, @{ $col->{bind} }; @{ $col->{bind} } = (); - $col->as_subquery(1, $alias); + $col->as_subquery($alias); } else { if ($alias) { /(?:^|\.)\Q$alias\E$/ ? $col : "$col $alias"; @@ -120,7 +120,7 @@ sub as_sql { if (blessed($from) && $from->isa('Data::ObjectDriver::SQL')) { push @bind_for_from, @{$from->{bind}}; @{$from->{bind}} = (); - $from->as_subquery(0); + $from->as_subquery; } else { $stmt->_add_index_hint($from); } @@ -146,11 +146,10 @@ sub as_sql { } sub as_subquery { - my ($stmt, $use_as, $alias) = @_; + my ($stmt, $alias) = @_; my $subquery = '(' . $stmt->as_sql . ')'; $alias ||= $stmt->as; if ($alias) { - $subquery .= ' AS' if $use_as; $subquery .= ' '. $alias; } $subquery; @@ -336,7 +335,7 @@ sub _mk_term { $term = "$c $val->{op} " . $$value; } elsif (blessed($value) && $value->isa('Data::ObjectDriver::SQL')) { local $value->{as} = undef; - $term = "$c $val->{op} ". $value->as_subquery(0); + $term = "$c $val->{op} ". $value->as_subquery; push @bind, @{$value->{bind}}; } else { $term = "$c $val->{op} ?"; diff --git a/t/11-sql-with-models.t b/t/11-sql-with-models.t index dc05bd6..9b7c828 100644 --- a/t/11-sql-with-models.t +++ b/t/11-sql-with-models.t @@ -39,18 +39,14 @@ $entry22->save; subtest 'as_subquery' => sub { my $stmt = Blog->driver->prepare_statement('Blog', { name => 'foo' }, { fetchonly => ['id'] }); - is(sql_normalize($stmt->as_subquery(1)), sql_normalize(<<'EOF'), 'right sql'); + is(sql_normalize($stmt->as_subquery), sql_normalize(<<'EOF'), 'right sql'); (SELECT blog.id FROM blog WHERE (blog.name = ?)) EOF is_deeply($stmt->{bind}, ['foo'], 'right bind values'); $stmt->as('mysubquery'); - is(sql_normalize($stmt->as_subquery(1)), sql_normalize(<<'EOF'), 'right sql'); -(SELECT blog.id FROM blog WHERE (blog.name = ?)) AS mysubquery -EOF - - is(sql_normalize($stmt->as_subquery(0)), sql_normalize(<<'EOF'), 'right sql'); + is(sql_normalize($stmt->as_subquery), sql_normalize(<<'EOF'), 'right sql'); (SELECT blog.id FROM blog WHERE (blog.name = ?)) mysubquery EOF }; @@ -91,7 +87,7 @@ SELECT FROM entry WHERE (entry.blog_id = blog.id) AND (entry.text = ?) LIMIT 1 - ) AS sub_alias + ) sub_alias FROM blog WHERE (blog.name = ?) EOF @@ -123,7 +119,7 @@ SELECT FROM entry WHERE (entry.blog_id = blog.id) AND (entry.text = ?) LIMIT 1 - ) AS sub_alias + ) sub_alias FROM blog WHERE (blog.name = ?) EOF @@ -157,7 +153,7 @@ EOF is sql_normalize($stmt->as_sql), sql_normalize(<<'EOF'); SELECT entry.id, entry.blog_id, entry.title, entry.text, count(*) count, - (SELECT blog.id, blog.parent_id, blog.name FROM blog) AS sub + (SELECT blog.id, blog.parent_id, blog.name FROM blog) sub FROM entry GROUP BY blog_id HAVING (count(*) = ?) AND (sub = ?) @@ -354,7 +350,7 @@ SELECT blog.id, blog.parent_id, blog.name, - (SELECT max(id) FROM entry WHERE (entry.blog_id = blog.id) AND (entry.id < ?)) AS sub1 + (SELECT max(id) FROM entry WHERE (entry.blog_id = blog.id) AND (entry.id < ?)) sub1 FROM blog, (SELECT entry.id FROM entry WHERE (entry.text = ?)) sub2