From: Mike Bayer Date: Tue, 10 May 2011 19:45:37 +0000 (-0400) Subject: - query.count() emits "count(*)" instead of X-Git-Tag: rel_0_7_0~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=94ee7170b5e0ace72faca7e787e08f1da142bb3f;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - query.count() emits "count(*)" instead of "count(1)". [ticket:2162] - another test that should be excluded from "low-connections" --- diff --git a/CHANGES b/CHANGES index daffcfd131..621a366ec2 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,9 @@ CHANGES fixed up some of the error messages tailored in [ticket:2069] + - query.count() emits "count(*)" instead of + "count(1)". [ticket:2162] + - Fine tuning of Query clause adaptation when from_self(), union(), or other "select from myself" operation, such that plain SQL expression diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index b586dfb778..45fe5c4bf5 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -2119,7 +2119,7 @@ class Query(object): session.query(func.count(distinct(User.name))) """ - col = sql.func.count(sql.literal_column('1')) + col = sql.func.count(sql.literal_column('*')) return self.from_self(col).scalar() def delete(self, synchronize_session='evaluate'): diff --git a/test/engine/test_transaction.py b/test/engine/test_transaction.py index f626a0ae08..e4046f4d36 100644 --- a/test/engine/test_transaction.py +++ b/test/engine/test_transaction.py @@ -965,6 +965,7 @@ counters = None class ForUpdateTest(fixtures.TestBase): + __requires__ = 'ad_hoc_engines', @classmethod def setup_class(cls): diff --git a/test/lib/assertsql.py b/test/lib/assertsql.py index 4954a0bfed..897f4b3b1d 100644 --- a/test/lib/assertsql.py +++ b/test/lib/assertsql.py @@ -182,6 +182,8 @@ class CompiledSQL(SQLMatchRule): equivalent = False else: params = {} + all_params = {} + all_received = [] self._result = equivalent if not self._result: print 'Testing for compiled statement %r partial params '\ diff --git a/test/orm/test_query.py b/test/orm/test_query.py index e55b0bc1ea..441f092cc9 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -6,7 +6,7 @@ from sqlalchemy.sql import compiler, table, column from sqlalchemy.engine import default from sqlalchemy.orm import * from sqlalchemy.orm import attributes - +from test.lib.assertsql import CompiledSQL from test.lib.testing import eq_ import sqlalchemy as sa @@ -1387,6 +1387,24 @@ class CountTest(QueryTest): eq_(s.query(User).filter(users.c.name.endswith('ed')).count(), 2) + def test_count_char(self): + User = self.classes.User + s = create_session() + # '*' is favored here as the most common character, + # it is reported that Informix doesn't like count(1), + # rumors about Oracle preferring count(1) don't appear + # to be well founded. + self.assert_sql_execution( + testing.db, + s.query(User).count, + CompiledSQL( + "SELECT count(*) AS count_1 FROM " + "(SELECT users.id AS users_id, users.name " + "AS users_name FROM users) AS anon_1", + {} + ) + ) + def test_multiple_entity(self): User, Address = self.classes.User, self.classes.Address