AlignDB-SQL
view release on metacpan or search on metacpan
$stmt = ns();
$stmt->from( ['foo'] );
$stmt->group( [ { column => 'baz' }, { column => 'quux' }, ] );
is strip( $stmt->as_sql ), "FROM foo GROUP BY baz, quux", 'multiple group by';
$stmt = ns();
$stmt->from( ['foo'] );
$stmt->group(
[ { column => 'baz', desc => 'DESC' },
{ column => 'quux', desc => 'DESC' },
]
);
is strip( $stmt->as_sql ),
"FROM foo GROUP BY baz DESC, quux DESC",
'multiple group by with desc';
## Testing ORDER BY
$stmt = ns();
$stmt->from( ['foo'] );
$stmt->order( { column => 'baz', desc => 'DESC' } );
is strip( $stmt->as_sql ), "FROM foo ORDER BY baz DESC", 'single order by';
$stmt = ns();
$stmt->from( ['foo'] );
$stmt->order(
[ { column => 'baz', desc => 'DESC' },
{ column => 'quux', desc => 'ASC' },
]
);
is strip( $stmt->as_sql ),
"FROM foo ORDER BY baz DESC, quux ASC",
'multiple order by';
## Testing GROUP BY plus ORDER BY
$stmt = ns();
$stmt->from( ['foo'] );
$stmt->group( { column => 'quux' } );
$stmt->order( { column => 'baz', desc => 'DESC' } );
is strip( $stmt->as_sql ),
"FROM foo GROUP BY quux ORDER BY baz DESC",
'group by with order by';
## Testing LIMIT and OFFSET
$stmt = ns();
$stmt->from( ['foo'] );
$stmt->limit(5);
is strip( $stmt->as_sql ), "FROM foo LIMIT 5";
$stmt->offset(10);
is strip( $stmt->as_sql ), "FROM foo LIMIT 5 OFFSET 10";
{ ## Non-numerics should cause an error
my $sql = eval { $stmt->limit(" 15g"); strip( $stmt->as_sql ) };
like $@, qr/Int/, "bogus limit causes as_sql assertion";
}
## Testing WHERE
$stmt = ns();
$stmt->add_where( foo => 'bar' );
is( strip( $stmt->as_sql_where ), "WHERE (foo = ?)" );
is( scalar @{ $stmt->bind }, 1 );
is( $stmt->bind->[0], 'bar' );
$stmt = ns();
$stmt->add_where( foo => [ 'bar', 'baz' ] );
is( strip( $stmt->as_sql_where ), "WHERE (foo IN (?,?))" );
is( scalar @{ $stmt->bind }, 2 );
is( $stmt->bind->[0], 'bar' );
is( $stmt->bind->[1], 'baz' );
$stmt = ns();
$stmt->add_where( foo => { op => '!=', value => 'bar' } );
is( strip( $stmt->as_sql_where ), "WHERE (foo != ?)" );
is( scalar @{ $stmt->bind }, 1 );
is( $stmt->bind->[0], 'bar' );
$stmt = ns();
$stmt->add_where( foo => { column => 'bar', op => '!=', value => 'bar' } );
is( strip( $stmt->as_sql_where ), "WHERE (bar != ?)" );
is( scalar @{ $stmt->bind }, 1 );
is( $stmt->bind->[0], 'bar' );
$stmt = ns();
$stmt->add_where( foo => \'IS NOT NULL' );
is( strip( $stmt->as_sql_where ), "WHERE (foo IS NOT NULL)" );
is( scalar @{ $stmt->bind }, 0 );
$stmt = ns();
$stmt->add_where( foo => 'bar' );
$stmt->add_where( baz => 'quux' );
is( strip( $stmt->as_sql_where ), "WHERE (foo = ?) AND (baz = ?)" );
is( scalar @{ $stmt->bind }, 2 );
is( $stmt->bind->[0], 'bar' );
is( $stmt->bind->[1], 'quux' );
$stmt = ns();
$stmt->add_where(
foo => [ { op => '>', value => 'bar' }, { op => '<', value => 'baz' } ] );
is( strip( $stmt->as_sql_where ), "WHERE ((foo > ?) OR (foo < ?))" );
is( scalar @{ $stmt->bind }, 2 );
is( $stmt->bind->[0], 'bar' );
is( $stmt->bind->[1], 'baz' );
$stmt = ns();
$stmt->add_where(
foo => [
-and => { op => '>', value => 'bar' },
{ op => '<', value => 'baz' }
]
);
is( strip( $stmt->as_sql_where ), "WHERE ((foo > ?) AND (foo < ?))" );
is( scalar @{ $stmt->bind }, 2 );
is( $stmt->bind->[0], 'bar' );
is( $stmt->bind->[1], 'baz' );
$stmt = ns();
$stmt->add_where( foo => [ -and => 'foo', 'bar', 'baz' ] );
is( strip( $stmt->as_sql_where ),
"WHERE ((foo = ?) AND (foo = ?) AND (foo = ?))" );
is( scalar @{ $stmt->bind }, 3 );
is( $stmt->bind->[0], 'foo' );
is( $stmt->bind->[1], 'bar' );
is( $stmt->bind->[2], 'baz' );
## regression bug. modified parameters
my %terms = ( foo => [ -and => 'foo', 'bar', 'baz' ] );
$stmt = ns();
$stmt->add_where(%terms);
is( strip( $stmt->as_sql_where ),
"WHERE ((foo = ?) AND (foo = ?) AND (foo = ?))" );
$stmt->add_where(%terms);
is( strip( $stmt->as_sql_where ),
"WHERE ((foo = ?) AND (foo = ?) AND (foo = ?)) AND ((foo = ?) AND (foo = ?) AND (foo = ?))"
);
$stmt = ns();
$stmt->add_select( foo => 'foo' );
$stmt->add_select('bar');
$stmt->from( [qw( baz )] );
is( strip( $stmt->as_sql ), "SELECT foo, bar FROM baz" );
$stmt = ns();
$stmt->add_select( 'f.foo' => 'foo' );
$stmt->add_select( 'COUNT(*)' => 'count' );
$stmt->from( [qw( baz )] );
is( strip( $stmt->as_sql ), "SELECT f.foo, COUNT(*) count FROM baz" );
my $map = $stmt->select_map;
is( scalar( keys %$map ), 2 );
is( $map->{'f.foo'}, 'foo' );
is( $map->{'COUNT(*)'}, 'count' );
# HAVING
$stmt = ns();
$stmt->add_select( foo => 'foo' );
$stmt->add_select( 'COUNT(*)' => 'count' );
$stmt->from( [qw(baz)] );
$stmt->add_where( foo => 1 );
$stmt->group( { column => 'baz' } );
$stmt->order( { column => 'foo', desc => 'DESC' } );
$stmt->limit(2);
$stmt->add_having( count => 2 );
is( strip( $stmt->as_sql ),
"SELECT foo, COUNT(*) count FROM baz WHERE (foo = ?) GROUP BY baz HAVING (COUNT(*) = ?) ORDER BY foo DESC LIMIT 2"
);
( run in 0.673 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )