From: Mike Bayer Date: Mon, 15 Nov 2010 14:55:43 +0000 (-0500) Subject: - Fixed indexing of Query objects by -1. It was erroneously X-Git-Tag: rel_0_7b1~267 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4efb07477bc3978650e81912f1766136e388863f;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Fixed indexing of Query objects by -1. It was erroneously transformed to the empty slice -1:0 that resulted in IndexError. [ticket:1968] --- diff --git a/CHANGES b/CHANGES index 7f15effc16..a6fd7009ec 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,10 @@ CHANGES strategy would fail if the entity was an aliased() construct. [ticket:1964] + - Fixed indexing of Query objects by -1. It was erroneously + transformed to the empty slice -1:0 that resulted in + IndexError. [ticket:1968] + - sql - The 'info' attribute of Column is copied during Column.copy(), i.e. as occurs when using columns diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 468bcc19d6..2bccb8f73f 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -1527,7 +1527,10 @@ class Query(object): else: return list(res) else: - return list(self[item:item+1])[0] + if item == -1: + return list(self)[-1] + else: + return list(self[item:item+1])[0] @_generative(_no_statement_condition) def slice(self, start, stop): diff --git a/test/orm/test_generative.py b/test/orm/test_generative.py index 141fde9fc6..31b7be8cc0 100644 --- a/test/orm/test_generative.py +++ b/test/orm/test_generative.py @@ -48,6 +48,9 @@ class GenerativeQueryTest(_base.MappedTest): orig = query.all() assert query[1] == orig[1] + assert query[-4] == orig[-4] + assert query[-1] == orig[-1] + assert list(query[10:20]) == orig[10:20] assert list(query[10:]) == orig[10:] assert list(query[:10]) == orig[:10] @@ -77,12 +80,12 @@ class GenerativeQueryTest(_base.MappedTest): assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29 assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29 # end Py2K - + + @testing.fails_if(lambda:testing.against('mysql+mysqldb') and + testing.db.dialect.dbapi.version_info[:4] == (1, 2, 1, 'gamma'), + "unknown incompatibility") @testing.resolve_artifact_names def test_aggregate_1(self): - if (testing.against('mysql+mysqldb') and - testing.db.dialect.dbapi.version_info[:4] == (1, 2, 1, 'gamma')): - return query = create_session().query(func.sum(foo.c.bar)) assert query.filter(foo.c.bar<30).one() == (435,)