xref: /sqlalchemy/CHANGES (revision 8e8e6a88)
14a6afd46SMike Bayer-*- coding: utf-8; fill-column: 68 -*-
24a6afd46SMike Bayer
3c86c9be7SJason Kirtland=======
4c86c9be7SJason KirtlandCHANGES
5c86c9be7SJason Kirtland=======
68e8e6a88SMike Bayer0.7.6
78e8e6a88SMike Bayer=====
88e8e6a88SMike Bayer- orm
98e8e6a88SMike Bayer  - [bug] Improved the "declarative reflection" 
108e8e6a88SMike Bayer    example to support single-table inheritance,
118e8e6a88SMike Bayer    multiple calls to prepare(), tables that
128e8e6a88SMike Bayer    are present in alternate schemas,
138e8e6a88SMike Bayer    establishing only a subset of classes
148e8e6a88SMike Bayer    as reflected.
158e8e6a88SMike Bayer
16667249f7SMike Bayer0.7.5 (January 28, 2012)
17c4506b8cSMike Bayer=====
18c4506b8cSMike Bayer- orm
19f9c2f85aSMike Bayer  - [bug] Fixed issue where modified session state
20f9c2f85aSMike Bayer    established after a failed flush would be committed
21f9c2f85aSMike Bayer    as part of the subsequent transaction that 
22f9c2f85aSMike Bayer    begins automatically after manual call 
23f9c2f85aSMike Bayer    to rollback().   The state of the session is
24f9c2f85aSMike Bayer    checked within rollback(), and if new state
25f9c2f85aSMike Bayer    is present, a warning is emitted and 
26f9c2f85aSMike Bayer    restore_snapshot() is called a second time,
27f9c2f85aSMike Bayer    discarding those changes. [ticket:2389]
28f9c2f85aSMike Bayer
29378e8612SMike Bayer  - [bug] Fixed regression from 0.7.4 whereby
30378e8612SMike Bayer    using an already instrumented column from a
31378e8612SMike Bayer    superclass as "polymorphic_on" failed to resolve
32378e8612SMike Bayer    the underlying Column.  [ticket:2345]
33378e8612SMike Bayer
344480eea6SMike Bayer  - [bug] Raise an exception if xyzload_all() is
354480eea6SMike Bayer    used inappropriately with two non-connected
364480eea6SMike Bayer    relationships.  [ticket:2370]
374480eea6SMike Bayer
3882b90175SMike Bayer  - [feature] Added "class_registry" argument to
3982b90175SMike Bayer    declarative_base().  Allows two or more declarative
4082b90175SMike Bayer    bases to share the same registry of class names.
4182b90175SMike Bayer
4282b90175SMike Bayer  - [feature] query.filter() accepts multiple 
4382b90175SMike Bayer    criteria which will join via AND, i.e.
4482b90175SMike Bayer    query.filter(x==y, z>q, ...)
4582b90175SMike Bayer
4682b90175SMike Bayer  - [feature] Added new capability to relationship
4782b90175SMike Bayer    loader options to allow "default" loader strategies.
4882b90175SMike Bayer    Pass '*' to any of joinedload(), lazyload(),
4982b90175SMike Bayer    subqueryload(), or noload() and that becomes the
5082b90175SMike Bayer    loader strategy used for all relationships,
5182b90175SMike Bayer    except for those explicitly stated in the
5282b90175SMike Bayer    Query.  Thanks to up-and-coming contributor
5382b90175SMike Bayer    Kent Bower for an exhaustive and well 
5482b90175SMike Bayer    written test suite !  [ticket:2351]
5582b90175SMike Bayer
56350a468aSMike Bayer  - [bug] Fixed bug whereby event.listen(SomeClass)
57350a468aSMike Bayer    forced an entirely unnecessary compile of the 
58350a468aSMike Bayer    mapper, making events very hard to set up
59350a468aSMike Bayer    at module import time (nobody noticed this ??)  
60350a468aSMike Bayer    [ticket:2367]
61350a468aSMike Bayer
62c4506b8cSMike Bayer  - [bug] Fixed bug whereby hybrid_property didn't 
63c4506b8cSMike Bayer    work as a kw arg in any(), has().
64c4506b8cSMike Bayer
65f2568b9bSMike Bayer  - Fixed regression from 0.6 whereby if 
66f2568b9bSMike Bayer    "load_on_pending" relationship() flag were used
67f2568b9bSMike Bayer    where a non-"get()" lazy clause needed to be 
68f2568b9bSMike Bayer    emitted on a pending object, it would fail 
69f2568b9bSMike Bayer    to load.
70f2568b9bSMike Bayer
718e6c3306SMike Bayer  - [bug] ensure pickleability of all ORM exceptions
728e6c3306SMike Bayer    for multiprocessing compatibility. [ticket:2371]
738e6c3306SMike Bayer
74d706a661SMike Bayer  - [bug] implemented standard "can't set attribute" / 
75d706a661SMike Bayer    "can't delete attribute" AttributeError when 
76d706a661SMike Bayer    setattr/delattr used on a hybrid that doesn't 
77d706a661SMike Bayer    define fset or fdel. [ticket:2353]
78d706a661SMike Bayer
79029ae72bSMike Bayer  - [bug] Fixed bug where unpickled object didn't 
80029ae72bSMike Bayer    have enough of its state set up to work
81029ae72bSMike Bayer    correctly within the unpickle() event established
82029ae72bSMike Bayer    by the mutable object extension, if the object
83029ae72bSMike Bayer    needed ORM attribute access within 
84029ae72bSMike Bayer    __eq__() or similar. [ticket:2362]
85029ae72bSMike Bayer
8645e68757SMike Bayer  - [bug] Fixed bug where "merge" cascade could
8745e68757SMike Bayer    mis-interpret an unloaded attribute, if the
8845e68757SMike Bayer    load_on_pending flag were used with 
8945e68757SMike Bayer    relationship().  Thanks to Kent Bower
9045e68757SMike Bayer    for tests.  [ticket:2374]
9145e68757SMike Bayer
927e30b0ebSMike Bayer  - [feature] New declarative reflection example
937e30b0ebSMike Bayer    added, illustrates how best to mix table reflection
947e30b0ebSMike Bayer    with declarative as well as uses some new features
957e30b0ebSMike Bayer    from [ticket:2356].
967e30b0ebSMike Bayer
978c05a3bfSMike Bayer- sql
9896dce768SMike Bayer  - [feature] New reflection feature "autoload_replace";
9996dce768SMike Bayer    when set to False on Table, the Table can be autoloaded
10096dce768SMike Bayer    without existing columns being replaced.  Allows
10196dce768SMike Bayer    more flexible chains of Table construction/reflection
10296dce768SMike Bayer    to be constructed, including that it helps with 
10396dce768SMike Bayer    combining Declarative with table reflection.
10496dce768SMike Bayer    See the new example on the wiki.  [ticket:2356]
10596dce768SMike Bayer
10696dce768SMike Bayer  - [bug] Improved the API for add_column() such that
10796dce768SMike Bayer    if the same column is added to its own table, 
10896dce768SMike Bayer    an error is not raised and the constraints
10996dce768SMike Bayer    don't get doubled up.  Also helps with some
11096dce768SMike Bayer    reflection/declarative patterns. [ticket:2356]
11196dce768SMike Bayer
1128c05a3bfSMike Bayer  - [feature] Added "false()" and "true()" expression
1138c05a3bfSMike Bayer    constructs to sqlalchemy.sql namespace, though
1148c05a3bfSMike Bayer    not part of __all__ as of yet.
1158c05a3bfSMike Bayer
11609553dc9SMike Bayer  - [feature] Dialect-specific compilers now raise
11709553dc9SMike Bayer    CompileException for all type/statement compilation 
11809553dc9SMike Bayer    issues, instead of InvalidRequestError or ArgumentError. 
11909553dc9SMike Bayer    The DDL for CREATE TABLE will re-raise 
12009553dc9SMike Bayer    CompileExceptions to include table/column information
12109553dc9SMike Bayer    for the problematic column.  [ticket:2361]
12209553dc9SMike Bayer
123c6e07f6aSMike Bayer  - [bug] Fixed issue where the "required" exception
124c6e07f6aSMike Bayer    would not be raised for bindparam() with required=True,
125c6e07f6aSMike Bayer    if the statement were given no parameters at all.
126c6e07f6aSMike Bayer    [ticket:2381]
127c6e07f6aSMike Bayer
128d78d2d60SMike Bayer- engine
129d78d2d60SMike Bayer  - [bug] Added __reduce__ to StatementError, 
1308e6c3306SMike Bayer    DBAPIError, column errors so that exceptions 
1318e6c3306SMike Bayer    are pickleable, as when using multiprocessing.  
1328e6c3306SMike Bayer    However, not 
133d78d2d60SMike Bayer    all DBAPIs support this yet, such as 
134d78d2d60SMike Bayer    psycopg2. [ticket:2371]
135d78d2d60SMike Bayer
136959d7cbeSMike Bayer  - [bug] Improved error messages when a non-string
137959d7cbeSMike Bayer    or invalid string is passed to any of the
138959d7cbeSMike Bayer    date/time processors used by SQLite, including
139959d7cbeSMike Bayer    C and Python versions.  [ticket:2382]
140959d7cbeSMike Bayer
14109a503e4SMike Bayer  - [bug] Fixed bug whereby a table-bound Column 
14209a503e4SMike Bayer    object named "<a>_<b>" which matched a column 
14309a503e4SMike Bayer    labeled as "<tablename>_<colname>" could match 
14409a503e4SMike Bayer    inappropriately when targeting in a result
14509a503e4SMike Bayer    set row.  [ticket:2377]
14609a503e4SMike Bayer
147780cd9dcSMike Bayer  - [bug] Fixed bug in "mock" strategy whereby
148780cd9dcSMike Bayer    correct DDL visit method wasn't called, resulting
149780cd9dcSMike Bayer    in "CREATE/DROP SEQUENCE" statements being 
150780cd9dcSMike Bayer    duplicated [ticket:2384]
151780cd9dcSMike Bayer
152a4a81f7bSMike Bayer- sqlite
153a4a81f7bSMike Bayer  - [bug] the "name" of an FK constraint in SQLite
154fd136760SMike Bayer    is reflected as "None", not "0" or other 
155fd136760SMike Bayer    integer value [ticket:2364].
156a4a81f7bSMike Bayer    SQLite does not appear to support constraint
157fd136760SMike Bayer    naming in any case.
158a4a81f7bSMike Bayer
1598c05a3bfSMike Bayer  - [bug] sql.false() and sql.true() compile to
1608c05a3bfSMike Bayer    0 and 1, respectively in sqlite [ticket:2368]
1618c05a3bfSMike Bayer
162feadcfe8SMike Bayer  - [bug] removed an erroneous "raise" in the 
163feadcfe8SMike Bayer    SQLite dialect when getting table names
164feadcfe8SMike Bayer    and view names, where logic is in place
165feadcfe8SMike Bayer    to fall back to an older version of 
166feadcfe8SMike Bayer    SQLite that doesn't have the 
167feadcfe8SMike Bayer    "sqlite_temp_master" table.
168feadcfe8SMike Bayer
169cd6e5d6dSMike Bayer- mysql
170cd6e5d6dSMike Bayer  - [bug] fixed regexp that filters out warnings
171cd6e5d6dSMike Bayer    for non-reflected "PARTITION" directives,
172cd6e5d6dSMike Bayer    thanks to George Reilly [ticket:2376]
173cd6e5d6dSMike Bayer
17421870c75SMike Bayer- mssql
17521870c75SMike Bayer  - [bug] Adjusted the regexp used in the
17621870c75SMike Bayer    mssql.TIME type to ensure only six digits
17721870c75SMike Bayer    are received for the "microseconds" portion
17821870c75SMike Bayer    of the value, which is expected by 
17921870c75SMike Bayer    Python's datetime.time().  Note that
18021870c75SMike Bayer    support for sending microseconds doesn't
18121870c75SMike Bayer    seem to be possible yet with pyodbc
18221870c75SMike Bayer    at least.  [ticket:2340]
18321870c75SMike Bayer
184ebaebfb2SMike Bayer  - [bug] Dropped the "30 char" limit on pymssql,
185ebaebfb2SMike Bayer    based on reports that it's doing things
186ebaebfb2SMike Bayer    better these days.  pymssql hasn't been
187ebaebfb2SMike Bayer    well tested and as the DBAPI is in flux
188ebaebfb2SMike Bayer    it's still not clear what the status
189ebaebfb2SMike Bayer    is on this driver and how SQLAlchemy's
190ebaebfb2SMike Bayer    implementation should adapt.  [ticket:2347]
191ebaebfb2SMike Bayer
192dfb0b6aaSMike Bayer- oracle
193dfb0b6aaSMike Bayer  - [bug] Added ORA-03135 to the never ending
194dfb0b6aaSMike Bayer    list of oracle "connection lost" errors
195dfb0b6aaSMike Bayer    [ticket:2388]
196dfb0b6aaSMike Bayer
19707130c7aSMike Bayer- core
19807130c7aSMike Bayer  - [bug] Changed LRUCache, used by the mapper
19907130c7aSMike Bayer    to cache INSERT/UPDATE/DELETE statements,
20007130c7aSMike Bayer    to use an incrementing counter instead
20107130c7aSMike Bayer    of a timestamp to track entries, for greater
20207130c7aSMike Bayer    reliability versus using time.time(), which
20307130c7aSMike Bayer    can cause test failures on some platforms.
20407130c7aSMike Bayer    [ticket:2379]
20507130c7aSMike Bayer
2065221f492SMike Bayer  - [bug] Added a boolean check for the "finalize"
2075221f492SMike Bayer    function within the pool connection proxy's
2085221f492SMike Bayer    weakref callback before calling it, so that a 
2095221f492SMike Bayer    warning isn't emitted that this function is None 
2105221f492SMike Bayer    when the application is exiting and gc has
2115221f492SMike Bayer    removed the function from the module before the 
2125221f492SMike Bayer    weakref callback was invoked.  [ticket:2383]
2135221f492SMike Bayer
2145c86d391SMike Bayer- Py3K
2155c86d391SMike Bayer  - [bug] Fixed inappropriate usage of util.py3k
2165c86d391SMike Bayer    flag and renamed it to util.py3k_warning, since 
2175c86d391SMike Bayer    this flag is intended to detect the -3 flag
2185c86d391SMike Bayer    series of import restrictions only.
2195c86d391SMike Bayer    [ticket:2348]
2205c86d391SMike Bayer
22182e4bc2fSMike Bayer- examples
22282e4bc2fSMike Bayer  - [feature] Simplified the versioning example
22382e4bc2fSMike Bayer    a bit to use a declarative mixin as well 
22482e4bc2fSMike Bayer    as an event listener, instead of a metaclass +
22582e4bc2fSMike Bayer    SessionExtension.  [ticket:2313]
22682e4bc2fSMike Bayer
227b4da470dSMike Bayer  - [bug] Fixed large_collection.py to close the
228b4da470dSMike Bayer    session before dropping tables. [ticket:2346]
229b4da470dSMike Bayer
230667249f7SMike Bayer0.7.4 (December 9, 2011)
231438e63dbSMike Bayer=====
232eeafd0f5SMike Bayer- orm
233d1cc7e75SMike Bayer  - [bug] Fixed backref behavior when "popping" the 
234d1cc7e75SMike Bayer    value off of a many-to-one in response to 
235d1cc7e75SMike Bayer    a removal from a stale one-to-many - the operation
236d1cc7e75SMike Bayer    is skipped, since the many-to-one has since
237d1cc7e75SMike Bayer    been updated.  [ticket:2315]
238d1cc7e75SMike Bayer
239d1cc7e75SMike Bayer  - [bug] After some years of not doing this, added
240d1cc7e75SMike Bayer    more granularity to the "is X a parent of Y" 
241d1cc7e75SMike Bayer    functionality, which is used when determining
242d1cc7e75SMike Bayer    if the FK on "Y" needs to be "nulled out" as well
243d1cc7e75SMike Bayer    as if "Y" should be deleted with delete-orphan
244d1cc7e75SMike Bayer    cascade.   The test now takes into account the
245d1cc7e75SMike Bayer    Python identity of the parent as well its identity 
246d1cc7e75SMike Bayer    key, to see if the last known parent of Y is
247d1cc7e75SMike Bayer    definitely X.   If a decision
248d1cc7e75SMike Bayer    can't be made, a StaleDataError is raised.  The
249d1cc7e75SMike Bayer    conditions where this error is raised are fairly
250d1cc7e75SMike Bayer    rare, requiring that the previous parent was
251d1cc7e75SMike Bayer    garbage collected, and previously
252d1cc7e75SMike Bayer    could very well inappropriately update/delete
253d1cc7e75SMike Bayer    a record that's since moved onto a new parent,
254d1cc7e75SMike Bayer    though there may be some cases where 
255d1cc7e75SMike Bayer    "silent success" occurred previously that will now 
256d1cc7e75SMike Bayer    raise in the face of ambiguity.
257d1cc7e75SMike Bayer    Expiring "Y" resets the "parent" tracker, meaning
258d1cc7e75SMike Bayer    X.remove(Y) could then end up deleting Y even 
259d1cc7e75SMike Bayer    if X is stale, but this is the same behavior
260d1cc7e75SMike Bayer    as before; it's advised to expire X also in that 
261d1cc7e75SMike Bayer    case.  [ticket:2264]
262d1cc7e75SMike Bayer
263d1cc7e75SMike Bayer  - [bug] fixed inappropriate evaluation of user-mapped
264d1cc7e75SMike Bayer    object in a boolean context within query.get()
265d1cc7e75SMike Bayer    [ticket:2310].  Also in 0.6.9.
266d1cc7e75SMike Bayer
267d1cc7e75SMike Bayer  - [bug] Added missing comma to PASSIVE_RETURN_NEVER_SET
268d1cc7e75SMike Bayer    symbol [ticket:2304]
269d1cc7e75SMike Bayer
270d1cc7e75SMike Bayer  - [bug] Cls.column.collate("some collation") now
271d1cc7e75SMike Bayer    works.  [ticket:1776]  Also in 0.6.9
272d1cc7e75SMike Bayer
273d1cc7e75SMike Bayer  - [bug] the value of a composite attribute is now
274d1cc7e75SMike Bayer    expired after an insert or update operation, instead
275d1cc7e75SMike Bayer    of regenerated in place.  This ensures that a 
276d1cc7e75SMike Bayer    column value which is expired within a flush
277d1cc7e75SMike Bayer    will be loaded first, before the composite
278d1cc7e75SMike Bayer    is regenerated using that value.  [ticket:2309]
279d1cc7e75SMike Bayer
280d1cc7e75SMike Bayer  - [bug] The fix in [ticket:2309] also emits the
281d1cc7e75SMike Bayer    "refresh" event when the composite value is
282d1cc7e75SMike Bayer    loaded on access, even if all column
283d1cc7e75SMike Bayer    values were already present, as is appropriate.
284d1cc7e75SMike Bayer    This fixes the "mutable" extension which relies
285d1cc7e75SMike Bayer    upon the "load" event to ensure the _parents 
286d1cc7e75SMike Bayer    dictionary is up to date, fixes [ticket:2308].
287d1cc7e75SMike Bayer    Thanks to Scott Torborg for the test case here.
288d1cc7e75SMike Bayer
289d1cc7e75SMike Bayer  - [bug] Fixed bug whereby a subclass of a subclass
290d1cc7e75SMike Bayer    using concrete inheritance in conjunction with
291d1cc7e75SMike Bayer    the new ConcreteBase or AbstractConcreteBase
292d1cc7e75SMike Bayer    would fail to apply the subclasses deeper than
293d1cc7e75SMike Bayer    one level to the "polymorphic loader" of each
294d1cc7e75SMike Bayer    base  [ticket:2312]
295d1cc7e75SMike Bayer
296d1cc7e75SMike Bayer  - [bug] Fixed bug whereby a subclass of a subclass
297d1cc7e75SMike Bayer    using the new AbstractConcreteBase would fail
298d1cc7e75SMike Bayer    to acquire the correct "base_mapper" attribute
299d1cc7e75SMike Bayer    when the "base" mapper was generated, thereby
300d1cc7e75SMike Bayer    causing failures later on.  [ticket:2312]
301d1cc7e75SMike Bayer
302d1cc7e75SMike Bayer  - [bug] Fixed bug whereby column_property() created
303d1cc7e75SMike Bayer    against ORM-level column could be treated as
304d1cc7e75SMike Bayer    a distinct entity when producing certain
305d1cc7e75SMike Bayer    kinds of joined-inh joins.  [ticket:2316]
306d1cc7e75SMike Bayer
307d1cc7e75SMike Bayer  - [bug] Fixed the error formatting raised when 
308d1cc7e75SMike Bayer    a tuple is inadvertently passed to session.query()
309d1cc7e75SMike Bayer    [ticket:2297].  Also in 0.6.9.
310d1cc7e75SMike Bayer
311d1cc7e75SMike Bayer  - [bug] Calls to query.join() to a single-table
312d1cc7e75SMike Bayer    inheritance subclass are now tracked, and
313d1cc7e75SMike Bayer    are used to eliminate the additional WHERE..
314d1cc7e75SMike Bayer    IN criterion normally tacked on with single
315d1cc7e75SMike Bayer    table inheritance, since the join should
316d1cc7e75SMike Bayer    accommodate it.  This allows OUTER JOIN
317d1cc7e75SMike Bayer    to a single table subclass to produce
318d1cc7e75SMike Bayer    the correct results, and overall will produce
319d1cc7e75SMike Bayer    fewer WHERE criterion when dealing with 
320d1cc7e75SMike Bayer    single table inheritance joins.
321d1cc7e75SMike Bayer    [ticket:2328]
322252acd50SMike Bayer
3237f68a3a5SMike Bayer  - [bug] __table_args__ can now be passed as 
3247f68a3a5SMike Bayer    an empty tuple as well as an empty dict.
3257f68a3a5SMike Bayer    [ticket:2339].  Thanks to Fayaz Yusuf Khan
3267f68a3a5SMike Bayer    for the patch.
3277f68a3a5SMike Bayer
328b3fa5d03SMike Bayer  - [bug] Updated warning message when setting
329b3fa5d03SMike Bayer    delete-orphan without delete to no longer
330b3fa5d03SMike Bayer    refer to 0.6, as we never got around to 
331b3fa5d03SMike Bayer    upgrading this to an exception.  Ideally
332b3fa5d03SMike Bayer    this might be better as an exception but
333b3fa5d03SMike Bayer    it's not critical either way.  [ticket:2325]
334b3fa5d03SMike Bayer
335d1cc7e75SMike Bayer  - [feature] polymorphic_on now accepts many
336d1cc7e75SMike Bayer    new kinds of values:
337d1cc7e75SMike Bayer
338d1cc7e75SMike Bayer      - standalone expressions that aren't
339d1cc7e75SMike Bayer        otherwise mapped
340d1cc7e75SMike Bayer      - column_property() objects
341d1cc7e75SMike Bayer      - string names of any column_property()
342d1cc7e75SMike Bayer        or attribute name of a mapped Column
343d1cc7e75SMike Bayer
344d1cc7e75SMike Bayer    The docs include an example using 
345d1cc7e75SMike Bayer    the case() construct, which is likely to be
346d1cc7e75SMike Bayer    a common constructed used here.
347d1cc7e75SMike Bayer    [ticket:2345] and part of [ticket:2238]
348d1cc7e75SMike Bayer
34933ddb48dSMike Bayer    Standalone expressions in polymorphic_on
35033ddb48dSMike Bayer    propagate to single-table inheritance
35133ddb48dSMike Bayer    subclasses so that they are used in the
35233ddb48dSMike Bayer    WHERE /JOIN clause to limit rows to that
35333ddb48dSMike Bayer    subclass as is the usual behavior.
35433ddb48dSMike Bayer
355a8dc787fSMike Bayer  - [feature] IdentitySet supports the - operator
356a8dc787fSMike Bayer    as the same as difference(), handy when dealing 
357a8dc787fSMike Bayer    with Session.dirty etc. [ticket:2301]
358a8dc787fSMike Bayer
3597ebcd26fSMike Bayer  - [feature] Added new value for Column autoincrement
3607ebcd26fSMike Bayer    called "ignore_fk", can be used to force autoincrement
3617ebcd26fSMike Bayer    on a column that's still part of a ForeignKeyConstraint.
3627ebcd26fSMike Bayer    New example in the relationship docs illustrates
3637ebcd26fSMike Bayer    its use.
3647ebcd26fSMike Bayer
365f79c9a22SMike Bayer  - [bug] Fixed bug in get_history() when referring
366f79c9a22SMike Bayer    to a composite attribute that has no value;
367f79c9a22SMike Bayer    added coverage for get_history() regarding 
368f79c9a22SMike Bayer    composites which is otherwise just a userland
369f79c9a22SMike Bayer    function.
370f79c9a22SMike Bayer
371a708d0fbSMike Bayer- sql
37269914608SMike Bayer   - [bug] related to [ticket:2316], made some 
37369914608SMike Bayer     adjustments to the change from [ticket:2261]
37469914608SMike Bayer     regarding the "from" list on a select(). The
37569914608SMike Bayer     _froms collection is no longer memoized, as this
37669914608SMike Bayer     simplifies various use cases and removes the 
37769914608SMike Bayer     need for a "warning" if a column is attached
37869914608SMike Bayer     to a table after it was already used in an 
37969914608SMike Bayer     expression - the select() construct will now
380d1cc7e75SMike Bayer     always produce the correct expression.
38169914608SMike Bayer     There's probably no real-world
38269914608SMike Bayer     performance hit here; select() objects are 
38369914608SMike Bayer     almost always made ad-hoc, and systems that 
38469914608SMike Bayer     wish to optimize the re-use of a select()
38569914608SMike Bayer     would be using the "compiled_cache" feature.
38669914608SMike Bayer     A hit which would occur when calling select.bind
38769914608SMike Bayer     has been reduced, but the vast majority
38869914608SMike Bayer     of users shouldn't be using "bound metadata"
38969914608SMike Bayer     anyway :).
39069914608SMike Bayer
391e7b612a6SMike Bayer   - [feature] The update() construct can now accommodate
392e7b612a6SMike Bayer     multiple tables in the WHERE clause, which will
393e7b612a6SMike Bayer     render an "UPDATE..FROM" construct, recognized by 
394e7b612a6SMike Bayer     Postgresql and MSSQL.  When compiled on MySQL,
395e7b612a6SMike Bayer     will instead generate "UPDATE t1, t2, ..".  MySQL
396e7b612a6SMike Bayer     additionally can render against multiple tables in the
397e7b612a6SMike Bayer     SET clause, if Column objects are used as keys
398e7b612a6SMike Bayer     in the "values" parameter or generative method.
399e7b612a6SMike Bayer     [ticket:2166] [ticket:1944]
400e7b612a6SMike Bayer
40183016514SMike Bayer   - [feature] Added accessor to types called "python_type",
402a708d0fbSMike Bayer     returns the rudimentary Python type object
403a708d0fbSMike Bayer     for a particular TypeEngine instance, if known,
404a708d0fbSMike Bayer     else raises NotImplementedError.  [ticket:77]
405a708d0fbSMike Bayer
406c0c42af4SMike Bayer   - [bug] further tweak to the fix from [ticket:2261],
407c0c42af4SMike Bayer     so that generative methods work a bit better
408c0c42af4SMike Bayer     off of cloned (this is almost a non-use case though).
409c0c42af4SMike Bayer     In particular this allows with_only_columns()
410c0c42af4SMike Bayer     to behave more consistently.   Added additional
411c0c42af4SMike Bayer     documentation to with_only_columns() to clarify
412c0c42af4SMike Bayer     expected behavior, which changed as a result
413c0c42af4SMike Bayer     of [ticket:2261].  [ticket:2319]
414c0c42af4SMike Bayer
415632043bcSMike Bayer- engine
416632043bcSMike Bayer  - [bug] Fixed bug whereby transaction.rollback()
417632043bcSMike Bayer    would throw an error on an invalidated 
418632043bcSMike Bayer    connection if the transaction were a 
419632043bcSMike Bayer    two-phase or savepoint transaction.
420632043bcSMike Bayer    For plain transactions, rollback() is a no-op
421632043bcSMike Bayer    if the connection is invalidated, so while
422632043bcSMike Bayer    it wasn't 100% clear if it should be a no-op,
423632043bcSMike Bayer    at least now the interface is consistent.
424632043bcSMike Bayer    [ticket:2317]
425632043bcSMike Bayer
42683016514SMike Bayer- schema
42783016514SMike Bayer  - [feature] Added new support for remote "schemas":
42883016514SMike Bayer    - MetaData() accepts "schema" and "quote_schema"
42983016514SMike Bayer      arguments, which will be applied to the same-named
43083016514SMike Bayer      arguments of a Table
43183016514SMike Bayer      or Sequence which leaves these at their default
43283016514SMike Bayer      of ``None``.
43383016514SMike Bayer    - Sequence accepts "quote_schema" argument
43483016514SMike Bayer    - tometadata() for Table will use the "schema"
43583016514SMike Bayer      of the incoming MetaData for the new Table
43683016514SMike Bayer      if the schema argument is explicitly "None"
43783016514SMike Bayer    - Added CreateSchema and DropSchema DDL
43883016514SMike Bayer      constructs - these accept just the string
43983016514SMike Bayer      name of a schema and a "quote" flag.
44083016514SMike Bayer    - When using default "schema" with MetaData,
44183016514SMike Bayer      ForeignKey will also assume the "default" schema
44283016514SMike Bayer      when locating remote table.  This allows the "schema"
44383016514SMike Bayer      argument on MetaData to be applied to any 
44483016514SMike Bayer      set of Table objects that otherwise don't have 
44583016514SMike Bayer      a "schema".
44683016514SMike Bayer    - a "has_schema" method has been implemented
44783016514SMike Bayer      on dialect, but only works on Postgresql so far.
44883016514SMike Bayer    Courtesy Manlio Perillo, [ticket:1679]
44983016514SMike Bayer
45081945d7aSMike Bayer  - [feature] The "extend_existing" flag on Table
45181945d7aSMike Bayer    now allows for the reflection process to take
45281945d7aSMike Bayer    effect for a Table object that's already been 
45381945d7aSMike Bayer    defined; when autoload=True and extend_existing=True
45481945d7aSMike Bayer    are both set, the full set of columns will be
45581945d7aSMike Bayer    reflected from the Table which will then 
45681945d7aSMike Bayer    *overwrite* those columns already present,
45781945d7aSMike Bayer    rather than no activity occurring.  Columns that
45881945d7aSMike Bayer    are present directly in the autoload run
45981945d7aSMike Bayer    will be used as always, however.
46081945d7aSMike Bayer    [ticket:1410]
46181945d7aSMike Bayer
462beef2b5aSMike Bayer  - [bug] Fixed bug whereby TypeDecorator would
463beef2b5aSMike Bayer    return a stale value for _type_affinity, when
464beef2b5aSMike Bayer    using a TypeDecorator that "switches" types,
465beef2b5aSMike Bayer    like the CHAR/UUID type.
466beef2b5aSMike Bayer
467896bc4c5SMike Bayer  - [bug] Fixed bug whereby "order_by='foreign_key'"
468896bc4c5SMike Bayer    option to Inspector.get_table_names 
469896bc4c5SMike Bayer    wasn't implementing the sort properly, replaced
470896bc4c5SMike Bayer    with the existing sort algorithm
471896bc4c5SMike Bayer
472133a0b24SMike Bayer  - [bug] the "name" of a column-level CHECK constraint,
473133a0b24SMike Bayer    if present, is now rendered in the CREATE TABLE 
474133a0b24SMike Bayer    statement using "CONSTRAINT <name> CHECK <expression>". 
475133a0b24SMike Bayer    [ticket:2305]
476133a0b24SMike Bayer
4773867ea9dSMike Bayer- pyodbc
4783867ea9dSMike Bayer   - [bug] pyodbc-based dialects now parse the 
4793867ea9dSMike Bayer     pyodbc accurately as far as observed
4803867ea9dSMike Bayer     pyodbc strings, including such gems
4813867ea9dSMike Bayer     as "py3-3.0.1-beta4" [ticket:2318]
4823867ea9dSMike Bayer
483e6a5ea8fSMike Bayer- postgresql
484e6a5ea8fSMike Bayer   - [bug] Postgresql dialect memoizes that an ENUM of a 
485e6a5ea8fSMike Bayer     particular name was processed
486e6a5ea8fSMike Bayer     during a create/drop sequence.  This allows
487e6a5ea8fSMike Bayer     a create/drop sequence to work without any
488e6a5ea8fSMike Bayer     calls to "checkfirst", and also means with
489e6a5ea8fSMike Bayer     "checkfirst" turned on it only needs to 
490e6a5ea8fSMike Bayer     check for the ENUM once.  [ticket:2311]
491e6a5ea8fSMike Bayer
492b854074cSMike Bayer   - [feature] Added create_type constructor argument 
493b854074cSMike Bayer     to pg.ENUM.  When False, no CREATE/DROP or 
494b854074cSMike Bayer     checking for the type will be performed as part
495b854074cSMike Bayer     of a table create/drop event; only the 
496b854074cSMike Bayer     create()/drop)() methods called directly
497b854074cSMike Bayer     will do this.  Helps with Alembic "offline"
498b854074cSMike Bayer     scripts.
499b854074cSMike Bayer
5002fca3c8eSMike Bayer- mssql
50158e692d7SMike Bayer  - [feature] lifted the restriction on SAVEPOINT
50258e692d7SMike Bayer    for SQL Server.  All tests pass using it,
50358e692d7SMike Bayer    it's not known if there are deeper issues
50458e692d7SMike Bayer    however.   [ticket:822]
50558e692d7SMike Bayer
5062fca3c8eSMike Bayer  - [bug] repaired the with_hint() feature which
5072fca3c8eSMike Bayer    wasn't implemented correctly on MSSQL - 
5082fca3c8eSMike Bayer    usually used for the "WITH (NOLOCK)" hint
5092fca3c8eSMike Bayer    (which you shouldn't be using anyway ! 
5102fca3c8eSMike Bayer    use snapshot isolation instead :) )
5112fca3c8eSMike Bayer    [ticket:2336]
5122fca3c8eSMike Bayer
5133867ea9dSMike Bayer  - [bug] use new pyodbc version detection for
5143867ea9dSMike Bayer    _need_decimal_fix option, [ticket:2318]
5153867ea9dSMike Bayer
5160e256c28SMike Bayer  - [bug] don't cast "table name" as NVARCHAR
5170e256c28SMike Bayer    on SQL Server 2000.  Still mostly in the dark
5180e256c28SMike Bayer    what incantations are needed to make PyODBC
5190e256c28SMike Bayer    work fully with FreeTDS 0.91 here, however.
5200e256c28SMike Bayer    [ticket:2343]
5210e256c28SMike Bayer
5228ad65d0eSMike Bayer  - [bug] Decode incoming values when retrieving
5238ad65d0eSMike Bayer    list of index names and the names of columns
5248ad65d0eSMike Bayer    within those indexes.  [ticket:2269]
5258ad65d0eSMike Bayer
526b746921eSMike Bayer- mysql
527b746921eSMike Bayer  - [bug] Unicode adjustments allow latest pymysql 
528b746921eSMike Bayer    (post 0.4) to pass 100% on Python 2.
529e6a5ea8fSMike Bayer
53054a72583SMike Bayer- ext
53154a72583SMike Bayer   - [feature] Added an example to the hybrid docs
53254a72583SMike Bayer     of a "transformer" - a hybrid that returns a
53354a72583SMike Bayer     query-transforming callable in combination
53454a72583SMike Bayer     with a custom comparator.   Uses a new method
53554a72583SMike Bayer     on Query called with_transformation().  The use
53654a72583SMike Bayer     case here is fairly experimental, but only
53754a72583SMike Bayer     adds one line of code to Query.
53854a72583SMike Bayer
5395c9d53fbSMike Bayer   - [bug] the @compiles decorator raises an
5405c9d53fbSMike Bayer     informative error message when no "default"
5415c9d53fbSMike Bayer     compilation handler is present, rather
5425c9d53fbSMike Bayer     than KeyError.
5435c9d53fbSMike Bayer
544e7b612a6SMike Bayer- examples
545e7b612a6SMike Bayer   - [bug] Fixed bug in history_meta.py example where
546e7b612a6SMike Bayer     the "unique" flag was not removed from a 
547e7b612a6SMike Bayer     single-table-inheritance subclass which 
548e7b612a6SMike Bayer     generates columns to put up onto the base.
549e7b612a6SMike Bayer
550195a26e2SMike Bayer0.7.3
551195a26e2SMike Bayer=====
5522aa80d40SMike Bayer- general
5532aa80d40SMike Bayer   - Adjusted the "importlater" mechanism, which is
5542aa80d40SMike Bayer     used internally to resolve import cycles,
5552aa80d40SMike Bayer     such that the usage of __import__ is completed
5562aa80d40SMike Bayer     when the import of sqlalchemy or sqlalchemy.orm
5572aa80d40SMike Bayer     is done, thereby avoiding any usage of __import__
5582aa80d40SMike Bayer     after the application starts new threads,
5592aa80d40SMike Bayer     fixes [ticket:2279].  Also in 0.6.9.
5602aa80d40SMike Bayer
561195a26e2SMike Bayer- orm
562df02cc08SMike Bayer   - Improved query.join() such that the "left" side
563df02cc08SMike Bayer     can more flexibly be a non-ORM selectable, 
564df02cc08SMike Bayer     such as a subquery.   A selectable placed
565df02cc08SMike Bayer     in select_from() will now be used as the left
566df02cc08SMike Bayer     side, favored over implicit usage
567df02cc08SMike Bayer     of a mapped entity.
568df02cc08SMike Bayer     If the join still fails based on lack of
569df02cc08SMike Bayer     foreign keys, the error message includes 
570df02cc08SMike Bayer     this detail.  Thanks to brianrhude
571df02cc08SMike Bayer     on IRC for the test case.  [ticket:2298]
572df02cc08SMike Bayer
573195a26e2SMike Bayer   - Added after_soft_rollback() Session event.  This
574195a26e2SMike Bayer     event fires unconditionally whenever rollback()
575195a26e2SMike Bayer     is called, regardless of if an actual DBAPI
576195a26e2SMike Bayer     level rollback occurred.  This event
577195a26e2SMike Bayer     is specifically designed to allow operations
578195a26e2SMike Bayer     with the Session to proceed after a rollback
579195a26e2SMike Bayer     when the Session.is_active is True.
580195a26e2SMike Bayer     [ticket:2241]
58100a2f0efSMike Bayer 
58200a2f0efSMike Bayer  - added "adapt_on_names" boolean flag to orm.aliased()
58300a2f0efSMike Bayer    construct.  Allows an aliased() construct
58400a2f0efSMike Bayer    to link the ORM entity to a selectable that contains
58500a2f0efSMike Bayer    aggregates or other derived forms of a particular
58600a2f0efSMike Bayer    attribute, provided the name is the same as that
58700a2f0efSMike Bayer    of the entity mapped column.
588195a26e2SMike Bayer
589f07ffb47SMike Bayer  - Added new flag expire_on_flush=False to column_property(),
590f07ffb47SMike Bayer    marks those properties that would otherwise be considered
591f07ffb47SMike Bayer    to be "readonly", i.e. derived from SQL expressions,
592f07ffb47SMike Bayer    to retain their value after a flush has occurred, including
593f07ffb47SMike Bayer    if the parent object itself was involved in an update.
594f07ffb47SMike Bayer
5954f1321c3SMike Bayer  - Enhanced the instrumentation in the ORM to support
5964f1321c3SMike Bayer    Py3K's new argument style of "required kw arguments",
5974f1321c3SMike Bayer    i.e. fn(a, b, *, c, d), fn(a, b, *args, c, d).
5984f1321c3SMike Bayer    Argument signatures of mapped object's __init__
5994f1321c3SMike Bayer    method will be preserved, including required kw rules.
6004f1321c3SMike Bayer    [ticket:2237]
6014f1321c3SMike Bayer
602127c4825SMike Bayer  - Fixed bug in unit of work whereby detection of 
603127c4825SMike Bayer    "cycles" among classes in highly interlinked patterns
604127c4825SMike Bayer    would not produce a deterministic
605127c4825SMike Bayer    result; thereby sometimes missing some nodes that
606127c4825SMike Bayer    should be considered cycles and causing further
607127c4825SMike Bayer    issues down the road.  Note this bug is in 0.6 
608127c4825SMike Bayer    also; not backported at the moment.
609127c4825SMike Bayer    [ticket:2282]
610127c4825SMike Bayer
6119fae11e3SMike Bayer  - Fixed a variety of synonym()-related regressions
6129fae11e3SMike Bayer    from 0.6:
6139fae11e3SMike Bayer        - making a synonym against a synonym now works.
6149fae11e3SMike Bayer        - synonyms made against a relationship() can
6159fae11e3SMike Bayer          be passed to query.join(), options sent
6169fae11e3SMike Bayer          to query.options(), passed by name
6179fae11e3SMike Bayer          to query.with_parent().
61840ffa5a8SMike Bayer
61998a79154SMike Bayer  - Fixed bug whereby mapper.order_by attribute would
62098a79154SMike Bayer    be ignored in the "inner" query within a 
62198a79154SMike Bayer    subquery eager load.  [ticket:2287].
62298a79154SMike Bayer    Also in 0.6.9.
62398a79154SMike Bayer
624d2bd1395SMike Bayer  - Identity map .discard() uses dict.pop(,None) 
625d2bd1395SMike Bayer    internally instead of "del" to avoid KeyError/warning 
626d2bd1395SMike Bayer    during a non-determinate gc teardown [ticket:2267]
627d2bd1395SMike Bayer
628b412615bSMike Bayer  - Fixed regression in new composite rewrite where
629b412615bSMike Bayer    deferred=True option failed due to missing
630b412615bSMike Bayer    import [ticket:2253]
631b412615bSMike Bayer
63280c68c0eSMike Bayer  - Reinstated "comparator_factory" argument to 
633d1cc7e75SMike Bayer    composite(), removed when 0.7 was released.
63480c68c0eSMike Bayer    [ticket:2248]
63580c68c0eSMike Bayer
636b9a4eacfSMike Bayer  - Fixed bug in query.join() which would occur
637b9a4eacfSMike Bayer    in a complex multiple-overlapping path scenario,
638b9a4eacfSMike Bayer    where the same table could be joined to
639b9a4eacfSMike Bayer    twice.  Thanks *much* to Dave Vitek 
640b9a4eacfSMike Bayer    for the excellent fix here.  [ticket:2247]
641b9a4eacfSMike Bayer
6425751eb17SMike Bayer  - Query will convert an OFFSET of zero when
6435751eb17SMike Bayer    slicing into None, so that needless OFFSET
6445751eb17SMike Bayer    clauses are not invoked.
6455751eb17SMike Bayer
646e548b7f8SMike Bayer  - Repaired edge case where mapper would fail
647e548b7f8SMike Bayer    to fully update internal state when a relationship
648e548b7f8SMike Bayer    on a new mapper would establish a backref on the
649e548b7f8SMike Bayer    first mapper.
650e548b7f8SMike Bayer
6511492cc63SMike Bayer  - Fixed bug whereby if __eq__() was
6521492cc63SMike Bayer    redefined, a relationship many-to-one lazyload
6531492cc63SMike Bayer    would hit the __eq__() and fail.  [ticket:2260]
6541492cc63SMike Bayer    Does not apply to 0.6.9.
6551492cc63SMike Bayer
656bb978f2eSMike Bayer  - Calling class_mapper() and passing in an object
657bb978f2eSMike Bayer    that is not a "type" (i.e. a class that could 
658bb978f2eSMike Bayer    potentially be mapped) now raises an informative
659bb978f2eSMike Bayer    ArgumentError, rather than UnmappedClassError.
660bb978f2eSMike Bayer    [ticket:2196]
661bb978f2eSMike Bayer
662d1cc7e75SMike Bayer  - New event hook, MapperEvents.after_configured().
663bb62d802SMike Bayer    Called after a configure() step has completed and
664bb62d802SMike Bayer    mappers were in fact affected.   Theoretically this
665bb62d802SMike Bayer    event is called once per application, unless new mappings
666bb62d802SMike Bayer    are constructed after existing ones have been used
667bb62d802SMike Bayer    already.
668bb62d802SMike Bayer
669212583b0SMike Bayer  - When an open Session is garbage collected, the objects
670212583b0SMike Bayer    within it which remain are considered detached again
671212583b0SMike Bayer    when they are add()-ed to a new Session.
672212583b0SMike Bayer    This is accomplished by an extra check that the previous
673212583b0SMike Bayer    "session_key" doesn't actually exist among the pool
674212583b0SMike Bayer    of Sessions.  [ticket:2281]
675212583b0SMike Bayer
676bb62d802SMike Bayer  - New declarative features:
677bb62d802SMike Bayer        - __declare_last__() method, establishes an event
678bb62d802SMike Bayer        listener for the class method that will be called
679bb62d802SMike Bayer        when mappers are completed with the final "configure"
680bb62d802SMike Bayer        step.
681bb62d802SMike Bayer        - __abstract__ flag.   The class will not be mapped
682bb62d802SMike Bayer        at all when this flag is present on the class.
683bb62d802SMike Bayer        - New helper classes ConcreteBase, AbstractConcreteBase.
684bb62d802SMike Bayer        Allow concrete mappings using declarative which automatically
685bb62d802SMike Bayer        set up the "polymorphic_union" when the "configure"
686bb62d802SMike Bayer        mapper step is invoked.
687bb62d802SMike Bayer        - The mapper itself has semi-private methods that allow
688bb62d802SMike Bayer        the "with_polymorphic" selectable to be assigned
689bb62d802SMike Bayer        to the mapper after it has already been configured.
690bb62d802SMike Bayer        [ticket:2239]
691bb62d802SMike Bayer
69253cb6080SMike Bayer   - Declarative will warn when a subclass' base uses 
69353cb6080SMike Bayer     @declared_attr for a regular column - this attribute
69453cb6080SMike Bayer     does not propagate to subclasses. [ticket:2283]
69553cb6080SMike Bayer
696f11d14caSMike Bayer   - The integer "id" used to link a mapped instance with
697f11d14caSMike Bayer     its owning Session is now generated by a sequence
698f11d14caSMike Bayer     generation function rather than id(Session), to
699f11d14caSMike Bayer     eliminate the possibility of recycled id() values 
700f11d14caSMike Bayer     causing an incorrect result, no need to check that 
701f11d14caSMike Bayer     object actually in the session.  [ticket:2280]
702f11d14caSMike Bayer
7038c0e8223SMike Bayer-sql
704840aab3bSMike Bayer  - Behavioral improvement: empty
705840aab3bSMike Bayer    conjunctions such as and_() and or_() will be
706840aab3bSMike Bayer    flattened in the context of an enclosing conjunction,
707840aab3bSMike Bayer    i.e. and_(x, or_()) will produce 'X' and not 'X AND
708840aab3bSMike Bayer    ()'. [ticket:2257].
709840aab3bSMike Bayer
7108c0e8223SMike Bayer  - Fixed bug regarding calculation of "from" list 
7118c0e8223SMike Bayer    for a select() element.  The "from" calc is now
7128c0e8223SMike Bayer    delayed, so that if the construct uses a Column
7138c0e8223SMike Bayer    object that is not yet attached to a Table,
7148c0e8223SMike Bayer    but is later associated with a Table, it generates
7158c0e8223SMike Bayer    SQL using the table as a FROM.   This change
7168c0e8223SMike Bayer    impacted fairly deeply the mechanics of how 
7178c0e8223SMike Bayer    the FROM list as well as the "correlates" collection
7188c0e8223SMike Bayer    is calculated, as some "clause adaption" schemes
7198c0e8223SMike Bayer    (these are used very heavily in the ORM)
7208c0e8223SMike Bayer    were relying upon the fact that the "froms" 
7218c0e8223SMike Bayer    collection would typically be cached before the 
7228c0e8223SMike Bayer    adaption completed.   The rework allows it
7238c0e8223SMike Bayer    such that the "froms" collection can be cleared
7248c0e8223SMike Bayer    and re-generated at any time.  [ticket:2261]
7258c0e8223SMike Bayer
7269d775a4cSMike Bayer  - Fixed bug whereby with_only_columns() method of
7279d775a4cSMike Bayer    Select would fail if a selectable were passed.
7289d775a4cSMike Bayer    [ticket:2270].  Also in 0.6.9.
7299d775a4cSMike Bayer
73076a9219aSMike Bayer- schema
731e4c04590SMike Bayer  - Modified Column.copy() to use _constructor(), 
732e4c04590SMike Bayer    which defaults to self.__class__, in order to 
733e4c04590SMike Bayer    create the new object.  This allows easier support
734e4c04590SMike Bayer    of subclassing Column.  [ticket:2284]
735e4c04590SMike Bayer
73676a9219aSMike Bayer  - Added a slightly nicer __repr__() to SchemaItem
73776a9219aSMike Bayer    classes.  Note the repr here can't fully support
73876a9219aSMike Bayer    the "repr is the constructor" idea since schema
73976a9219aSMike Bayer    items can be very deeply nested/cyclical, have
74076a9219aSMike Bayer    late initialization of some things, etc.
74176a9219aSMike Bayer    [ticket:2223]
74276a9219aSMike Bayer
7439a2edbf3SMike Bayer- engine
7449a2edbf3SMike Bayer  - The recreate() method in all pool classes uses
7459a2edbf3SMike Bayer    self.__class__ to get at the type of pool
7469a2edbf3SMike Bayer    to produce, in the case of subclassing.  Note 
7479a2edbf3SMike Bayer    there's no usual need to subclass pools.
7489a2edbf3SMike Bayer    [ticket:2254]
7499a2edbf3SMike Bayer
750d3c1f245SMike Bayer  - Improvement to multi-param statement logging,
751d3c1f245SMike Bayer    long lists of bound parameter sets will be 
752d3c1f245SMike Bayer    compressed with an informative indicator
753d3c1f245SMike Bayer    of the compression taking place.  Exception
754d1cc7e75SMike Bayer    messages use the same improved formatting.
755d3c1f245SMike Bayer    [ticket:2243]
756d3c1f245SMike Bayer
75776006091SMike Bayer  - Added optional "sa_pool_key" argument to 
75876006091SMike Bayer    pool.manage(dbapi).connect() so that serialization
75976006091SMike Bayer    of args is not necessary.
76076006091SMike Bayer
761e80b725aSMike Bayer  - The entry point resolution supported by 
762e80b725aSMike Bayer    create_engine() now supports resolution of
763e80b725aSMike Bayer    individual DBAPI drivers on top of a built-in
764e80b725aSMike Bayer    or entry point-resolved dialect, using the 
765e80b725aSMike Bayer    standard '+' notation - it's converted to
766e80b725aSMike Bayer    a '.' before being resolved as an entry
767e80b725aSMike Bayer    point.  [ticket:2286]
768e80b725aSMike Bayer
769f1eea634SMike Bayer  - Added an exception catch + warning for the
770f1eea634SMike Bayer    "return unicode detection" step within connect,
771f1eea634SMike Bayer    allows databases that crash on NVARCHAR to
772f1eea634SMike Bayer    continue initializing, assuming no NVARCHAR
773f1eea634SMike Bayer    type implemented.  [ticket:2299]
774f1eea634SMike Bayer
775f7426427SMike Bayer- types
776f7426427SMike Bayer  - Extra keyword arguments to the base Float 
777f7426427SMike Bayer    type beyond "precision" and "asdecimal" are ignored;
778f7426427SMike Bayer    added a deprecation warning here and additional
779f7426427SMike Bayer    docs, related to [ticket:2258]
780f7426427SMike Bayer
781757400f8SMike Bayer- sqlite
782757400f8SMike Bayer  - Ensured that the same ValueError is raised for
783757400f8SMike Bayer    illegal date/time/datetime string parsed from
784757400f8SMike Bayer    the database regardless of whether C 
785757400f8SMike Bayer    extensions are in use or not.
786757400f8SMike Bayer
787c13dee04SMike Bayer- postgresql
788bf2f3595SMike Bayer  - Added "postgresql_using" argument to Index(), produces
789bf2f3595SMike Bayer    USING clause to specify index implementation for
790bf2f3595SMike Bayer    PG.  [ticket:2290].  Thanks to Ryan P. Kelly for
791bf2f3595SMike Bayer    the patch.
792bf2f3595SMike Bayer
7935397d953SMike Bayer  - Added client_encoding parameter to create_engine()
7945397d953SMike Bayer    when the postgresql+psycopg2 dialect is used;
7955397d953SMike Bayer    calls the psycopg2 set_client_encoding() method
7965397d953SMike Bayer    with the value upon connect.  [ticket:1839]
7975397d953SMike Bayer
798879c9320SMike Bayer  - Fixed bug related to [ticket:2141] whereby the 
799879c9320SMike Bayer    same modified index behavior in PG 9 affected
800879c9320SMike Bayer    primary key reflection on a renamed column.
801879c9320SMike Bayer    [ticket:2291].  Also in 0.6.9.
802879c9320SMike Bayer
80384384774SMike Bayer  - Reflection functions for Table, Sequence no longer
80484384774SMike Bayer    case insensitive.  Names can be differ only in case
80584384774SMike Bayer    and will be correctly distinguished.  [ticket:2256]
80684384774SMike Bayer
807c13dee04SMike Bayer  - Use an atomic counter as the "random number" 
808c13dee04SMike Bayer    source for server side cursor names; 
809c13dee04SMike Bayer    conflicts have been reported in rare cases.
810c13dee04SMike Bayer
8118b505e7cSMike Bayer  - Narrowed the assumption made when reflecting
8128b505e7cSMike Bayer    a foreign-key referenced table with schema in
8138b505e7cSMike Bayer    the current search path; an explicit schema will
8148b505e7cSMike Bayer    be applied to the referenced table only if 
8158b505e7cSMike Bayer    it actually matches that of the referencing table,
8168b505e7cSMike Bayer    which also has an explicit schema.   Previously
8178b505e7cSMike Bayer    it was assumed that "current" schema was synonymous
8188b505e7cSMike Bayer    with the full search_path.  [ticket:2249]
8198b505e7cSMike Bayer
820a9ebba3eSMike Bayer- mysql
821a9ebba3eSMike Bayer  - a CREATE TABLE will put the COLLATE option 
822a9ebba3eSMike Bayer    after CHARSET, which appears to be part of 
823a9ebba3eSMike Bayer    MySQL's arbitrary rules regarding if it will actually
824539c7a1cSMike Bayer    work or not.  [ticket:2225]  Also in 0.6.9.
825a9ebba3eSMike Bayer
826a0cc36c2SMike Bayer  - Added mysql_length parameter to Index construct,
827a0cc36c2SMike Bayer    specifies "length" for indexes.  [ticket:2293]
828a0cc36c2SMike Bayer
8295751eb17SMike Bayer- mssql
83057ae8672SMike Bayer  - Changes to attempt support of FreeTDS 0.91 with 
83157ae8672SMike Bayer    Pyodbc.  This includes that string binds are sent as 
83257ae8672SMike Bayer    Python unicode objects when FreeTDS 0.91 is detected,
83357ae8672SMike Bayer    and a CAST(? AS NVARCHAR) is used when we detect 
83457ae8672SMike Bayer    for a table.   However, I'd continue
83557ae8672SMike Bayer    to characterize Pyodbc + FreeTDS 0.91 behavior as 
83657ae8672SMike Bayer    pretty crappy, there are still many queries such 
83757ae8672SMike Bayer    as used in reflection which cause a core dump on 
83857ae8672SMike Bayer    Linux, and it is not really usable at all
83957ae8672SMike Bayer    on OSX, MemoryErrors abound and just plain broken 
84057ae8672SMike Bayer    unicode support.   [ticket:2273]
84157ae8672SMike Bayer
842c52e31b1SMike Bayer  - The behavior of =/!= when comparing a scalar select
843c52e31b1SMike Bayer    to a value will no longer produce IN/NOT IN as of 0.8;
844c52e31b1SMike Bayer    this behavior is a little too heavy handed (use in_() if
845d1cc7e75SMike Bayer    you want to emit IN) and now emits a deprecation warning.
846c52e31b1SMike Bayer    To get the 0.8 behavior immediately and remove the warning, 
847c52e31b1SMike Bayer    a compiler recipe is given at 
848c52e31b1SMike Bayer    http://www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons
849c52e31b1SMike Bayer    to override the behavior of visit_binary().
850c52e31b1SMike Bayer    [ticket:2277]
851c52e31b1SMike Bayer
8525751eb17SMike Bayer  - "0" is accepted as an argument for limit() which
8535751eb17SMike Bayer    will produce "TOP 0". [ticket:2222]
8545751eb17SMike Bayer
855cefa4e9aSMike Bayer- oracle
856cefa4e9aSMike Bayer  - Fixed ReturningResultProxy for zxjdbc dialect.
8571144f1acSMike Bayer    [ticket:2272].  Regression from 0.6.
858cefa4e9aSMike Bayer
8593f347eddSMike Bayer  - The String type now generates VARCHAR2 on Oracle
8603f347eddSMike Bayer    which is recommended as the default VARCHAR.
8613f347eddSMike Bayer    Added an explicit VARCHAR2 and NVARCHAR2 to the Oracle
8623f347eddSMike Bayer    dialect as well.   Using NVARCHAR still generates
8633f347eddSMike Bayer    "NVARCHAR2" - there is no "NVARCHAR" on Oracle -
8643f347eddSMike Bayer    this remains a slight breakage of the "uppercase types
8653f347eddSMike Bayer    always give exactly that" policy.  VARCHAR still 
8663f347eddSMike Bayer    generates "VARCHAR", keeping with the policy.   If
8673f347eddSMike Bayer    Oracle were to ever define "VARCHAR" as something 
8683f347eddSMike Bayer    different as they claim (IMHO this will never happen), 
8693f347eddSMike Bayer    the type would be available.  [ticket:2252]
8703f347eddSMike Bayer
871669d0c47SMike Bayer- ext
872d2792309SMike Bayer  - SQLSoup will not be included in version 0.8
873d2792309SMike Bayer    of SQLAlchemy; while useful, we would like to
874d2792309SMike Bayer    keep SQLAlchemy itself focused on one ORM
875d2792309SMike Bayer    usage paradigm.  SQLSoup will hopefully
876d2792309SMike Bayer    soon be superseded by a third party 
877d2792309SMike Bayer    project.  [ticket:2262]
878d2792309SMike Bayer
879669d0c47SMike Bayer  - Added local_attr, remote_attr, attr accessors
880669d0c47SMike Bayer    to AssociationProxy, providing quick access
881669d0c47SMike Bayer    to the proxied attributes at the class
882669d0c47SMike Bayer    level. [ticket:2236]
883669d0c47SMike Bayer
8841cf80dc5SMike Bayer  - Changed the update() method on association proxy
8851cf80dc5SMike Bayer    dictionary to use a duck typing approach, i.e.
8861cf80dc5SMike Bayer    checks for "keys", to discern between update({}) 
8871cf80dc5SMike Bayer    and update((a, b)).   Previously, passing a 
8881cf80dc5SMike Bayer    dictionary that had tuples as keys would be misinterpreted
8891cf80dc5SMike Bayer    as a sequence. [ticket:2275]
8901cf80dc5SMike Bayer
8911e6a2096SMike Bayer- examples
8921e6a2096SMike Bayer  - Adjusted dictlike-polymorphic.py example
8931e6a2096SMike Bayer    to apply the CAST such that it works on 
8941e6a2096SMike Bayer    PG, other databases.  [ticket:2266]
8951e6a2096SMike Bayer    Also in 0.6.9.
8961e6a2096SMike Bayer
8979a34d9a8SMike Bayer0.7.2
8989a34d9a8SMike Bayer=====
899ac9a007cSMike Bayer- orm
90015cd4235SMike Bayer  - Feature enhancement: joined and subquery
90115cd4235SMike Bayer    loading will now traverse already-present related
90215cd4235SMike Bayer    objects and collections in search of unpopulated
90315cd4235SMike Bayer    attributes throughout the scope of the eager load
90415cd4235SMike Bayer    being defined, so that the eager loading that is
90515cd4235SMike Bayer    specified via mappings or query options
90615cd4235SMike Bayer    unconditionally takes place for the full depth,
90715cd4235SMike Bayer    populating whatever is not already populated.
90815cd4235SMike Bayer    Previously, this traversal would stop if a related
90915cd4235SMike Bayer    object or collection were already present leading
91015cd4235SMike Bayer    to inconsistent behavior (though would save on
91115cd4235SMike Bayer    loads/cycles for an already-loaded graph). For a
91215cd4235SMike Bayer    subqueryload, this means that the additional
91315cd4235SMike Bayer    SELECT statements emitted by subqueryload will
91415cd4235SMike Bayer    invoke unconditionally, no matter how much of the
91515cd4235SMike Bayer    existing graph is already present (hence the
91615cd4235SMike Bayer    controversy). The previous behavior of "stopping"
91715cd4235SMike Bayer    is still in effect when a query is the result of
91815cd4235SMike Bayer    an attribute-initiated lazyload, as otherwise an
91915cd4235SMike Bayer    "N+1" style of collection iteration can become
92015cd4235SMike Bayer    needlessly expensive when the same related object
92115cd4235SMike Bayer    is encountered repeatedly. There's also an 
92215cd4235SMike Bayer    as-yet-not-public generative Query method 
92315cd4235SMike Bayer    _with_invoke_all_eagers()
92415cd4235SMike Bayer    which selects old/new behavior [ticket:2213]
92515cd4235SMike Bayer
9268a483dbfSMike Bayer  - A rework of "replacement traversal" within
9278a483dbfSMike Bayer    the ORM as it alters selectables to be against
9288a483dbfSMike Bayer    aliases of things (i.e. clause adaption) includes 
9298a483dbfSMike Bayer    a fix for multiply-nested any()/has() constructs 
9308a483dbfSMike Bayer    against a joined table structure.  [ticket:2195]
9318a483dbfSMike Bayer
932de0e2724SMike Bayer  - Fixed bug where query.join() + aliased=True
933de0e2724SMike Bayer    from a joined-inh structure to itself on 
934de0e2724SMike Bayer    relationship() with join condition on the child
935de0e2724SMike Bayer    table would convert the lead entity into the 
936de0e2724SMike Bayer    joined one inappropriately.  [ticket:2234]
937de0e2724SMike Bayer    Also in 0.6.9.
938de0e2724SMike Bayer
9390cc357c6SMike Bayer  - Fixed regression from 0.6 where Session.add()
9400cc357c6SMike Bayer    against an object which contained None in a
9410cc357c6SMike Bayer    collection would raise an internal exception.
9420cc357c6SMike Bayer    Reverted this to 0.6's behavior which is to 
9430cc357c6SMike Bayer    accept the None but obviously nothing is
9440cc357c6SMike Bayer    persisted.  Ideally, collections with None 
9450cc357c6SMike Bayer    present or on append() should at least emit a 
9460cc357c6SMike Bayer    warning, which is being considered for 0.8.
9470cc357c6SMike Bayer    [ticket:2205]
9480cc357c6SMike Bayer
9491a0c8aceSMike Bayer  - Load of a deferred() attribute on an object
9501a0c8aceSMike Bayer    where row can't be located raises 
9511a0c8aceSMike Bayer    ObjectDeletedError instead of failing later
9521a0c8aceSMike Bayer    on; improved the message in ObjectDeletedError
9531a0c8aceSMike Bayer    to include other conditions besides a simple
9541a0c8aceSMike Bayer    "delete". [ticket:2191]
9551a0c8aceSMike Bayer
956f288c065SMike Bayer  - Fixed regression from 0.6 where a get history
957f288c065SMike Bayer    operation on some relationship() based attributes
958f288c065SMike Bayer    would fail when a lazyload would emit; this could 
959f288c065SMike Bayer    trigger within a flush() under certain conditions.
960f288c065SMike Bayer    [ticket:2224]  Thanks to the user who submitted
961f288c065SMike Bayer    the great test for this.
962f288c065SMike Bayer
9635abc4112SMike Bayer  - Fixed bug apparent only in Python 3 whereby
9645abc4112SMike Bayer    sorting of persistent + pending objects during
9655abc4112SMike Bayer    flush would produce an illegal comparison,
9665abc4112SMike Bayer    if the persistent object primary key 
9675abc4112SMike Bayer    is not a single integer.  [ticket:2228]
9685abc4112SMike Bayer    Also in 0.6.9
9695abc4112SMike Bayer
970cdf727aeSMike Bayer  - Fixed bug whereby the source clause
971cdf727aeSMike Bayer    used by query.join() would be inconsistent
972cdf727aeSMike Bayer    if against a column expression that combined
973cdf727aeSMike Bayer    multiple entities together.  [ticket:2197]
974cdf727aeSMike Bayer    Also in 0.6.9
975cdf727aeSMike Bayer
976660e82ecSMike Bayer  - Fixed bug whereby if a mapped class
977660e82ecSMike Bayer    redefined __hash__() or __eq__() to something
978660e82ecSMike Bayer    non-standard, which is a supported use case
979660e82ecSMike Bayer    as SQLA should never consult these,
980660e82ecSMike Bayer    the methods would be consulted if the class
981660e82ecSMike Bayer    was part of a "composite" (i.e. non-single-entity)
982660e82ecSMike Bayer    result set.  [ticket:2215]
983660e82ecSMike Bayer    Also in 0.6.9.
984660e82ecSMike Bayer
985a45da117SMike Bayer  - Added public attribute ".validators" to 
986a45da117SMike Bayer    Mapper, an immutable dictionary view of 
987a45da117SMike Bayer    all attributes that have been decorated
988a45da117SMike Bayer    with the @validates decorator.
989a45da117SMike Bayer    [ticket:2240] courtesy Stefano Fontanelli
990a45da117SMike Bayer
991668991a7SMike Bayer  - Fixed subtle bug that caused SQL to blow
992668991a7SMike Bayer    up if: column_property() against subquery +
993668991a7SMike Bayer    joinedload + LIMIT + order by the column
994668991a7SMike Bayer    property() occurred.  [ticket:2188].
995668991a7SMike Bayer    Also in 0.6.9
996668991a7SMike Bayer
9975b8738b7SMike Bayer  - The join condition produced by with_parent
9985b8738b7SMike Bayer    as well as when using a "dynamic" relationship
9995b8738b7SMike Bayer    against a parent will generate unique
10005b8738b7SMike Bayer    bindparams, rather than incorrectly repeating 
10015b8738b7SMike Bayer    the same bindparam.  [ticket:2207].
10025b8738b7SMike Bayer    Also in 0.6.9.
10035b8738b7SMike Bayer
1004ac9a007cSMike Bayer  - Added the same "columns-only" check to 
10055b8738b7SMike Bayer    mapper.polymorphic_on as used when
1006d1cc7e75SMike Bayer    receiving user arguments to
1007ac9a007cSMike Bayer    relationship.order_by, foreign_keys,
1008ac9a007cSMike Bayer    remote_side, etc.
1009ac9a007cSMike Bayer
1010eaa7aa42SMike Bayer  - Fixed bug whereby comparison of column
1011eaa7aa42SMike Bayer    expression to a Query() would not call
1012eaa7aa42SMike Bayer    as_scalar() on the underlying SELECT 
1013eaa7aa42SMike Bayer    statement to produce a scalar subquery,
1014eaa7aa42SMike Bayer    in the way that occurs if you called
1015eaa7aa42SMike Bayer    it on Query().subquery(). [ticket:2190]
1016eaa7aa42SMike Bayer
101723a14f29SMike Bayer  - Fixed declarative bug where a class inheriting
101823a14f29SMike Bayer    from a superclass of the same name would fail
101923a14f29SMike Bayer    due to an unnecessary lookup of the name
102023a14f29SMike Bayer    in the _decl_class_registry. [ticket:2194]
102123a14f29SMike Bayer
1022cf7453e0SMike Bayer  - Repaired the "no statement condition" 
1023cf7453e0SMike Bayer    assertion in Query which would attempt
1024cf7453e0SMike Bayer    to raise if a generative method were called
1025cf7453e0SMike Bayer    after from_statement() were called.
1026cf7453e0SMike Bayer    [ticket:2199].  Also in 0.6.9.
1027cf7453e0SMike Bayer
102863dbed1fSMike Bayer- sql
1029668991a7SMike Bayer  - Fixed two subtle bugs involving column 
1030668991a7SMike Bayer    correspondence in a selectable,
1031668991a7SMike Bayer    one with the same labeled subquery repeated, the other
1032668991a7SMike Bayer    when the label has been "grouped" and 
1033668991a7SMike Bayer    loses itself.  Affects [ticket:2188].
103463dbed1fSMike Bayer
1035fc4f7de0SMike Bayer- schema
103653cbbaa8SMike Bayer  - New feature: with_variant() method on 
103753cbbaa8SMike Bayer    all types.  Produces an instance of Variant(),
103853cbbaa8SMike Bayer    a special TypeDecorator which will select
103953cbbaa8SMike Bayer    the usage of a different type based on the
104053cbbaa8SMike Bayer    dialect in use. [ticket:2187]
104153cbbaa8SMike Bayer
1042c1295ce5SMike Bayer  - Added an informative error message when 
1043c1295ce5SMike Bayer    ForeignKeyConstraint refers to a column name in 
1044c1295ce5SMike Bayer    the parent that is not found.  Also in 0.6.9.
1045c1295ce5SMike Bayer
1046fc4f7de0SMike Bayer  - Fixed bug whereby adaptation of old append_ddl_listener()
1047fc4f7de0SMike Bayer    function was passing unexpected **kw through 
1048fc4f7de0SMike Bayer    to the Table event.   Table gets no kws, the MetaData
1049fc4f7de0SMike Bayer    event in 0.6 would get "tables=somecollection",
1050fc4f7de0SMike Bayer    this behavior is preserved.  [ticket:2206]
1051fc4f7de0SMike Bayer
10529ae8de1fSMike Bayer  - Fixed bug where "autoincrement" detection on 
10539ae8de1fSMike Bayer    Table would fail if the type had no "affinity"
10549ae8de1fSMike Bayer    value, in particular this would occur when using 
10559ae8de1fSMike Bayer    the UUID example on the site that uses TypeEngine
10569ae8de1fSMike Bayer    as the "impl".
10579ae8de1fSMike Bayer
10583daae3e5SMike Bayer  - Added an improved repr() to TypeEngine objects
10593daae3e5SMike Bayer    that will only display constructor args which
10603daae3e5SMike Bayer    are positional or kwargs that deviate
10613daae3e5SMike Bayer    from the default.  [ticket:2209]
10623daae3e5SMike Bayer
10637173d11bSMike Bayer- engine
10647bb2adffSMike Bayer  - Context manager provided by Connection.begin()
10657bb2adffSMike Bayer    will issue rollback() if the commit() fails,
10667bb2adffSMike Bayer    not just if an exception occurs.
10677bb2adffSMike Bayer
10687173d11bSMike Bayer  - Use urllib.parse_qsl() in Python 2.6 and above,
10697173d11bSMike Bayer    no deprecation warning about cgi.parse_qsl()
10707173d11bSMike Bayer    [ticket:1682]
10717173d11bSMike Bayer
1072e821573aSMike Bayer  - Added mixin class sqlalchemy.ext.DontWrapMixin.
1073e821573aSMike Bayer    User-defined exceptions of this type are never
1074e821573aSMike Bayer    wrapped in StatementException when they 
1075e821573aSMike Bayer    occur in the context of a statement 
1076e821573aSMike Bayer    execution.
1077e821573aSMike Bayer
1078e936a7b3SMike Bayer  - StatementException wrapping will display the
1079d1cc7e75SMike Bayer    original exception class in the message.
1080e936a7b3SMike Bayer
1081e936a7b3SMike Bayer  - Failures on connect which raise dbapi.Error
1082e936a7b3SMike Bayer    will forward the error to dialect.is_disconnect()
1083e936a7b3SMike Bayer    and set the "connection_invalidated" flag if 
1084e936a7b3SMike Bayer    the dialect knows this to be a potentially
1085e936a7b3SMike Bayer    "retryable" condition.  Only Oracle ORA-01033
1086e936a7b3SMike Bayer    implemented for now.  [ticket:2201]
1087e821573aSMike Bayer
1088086ae956SMike Bayer- sqlite
1089086ae956SMike Bayer  - SQLite dialect no longer strips quotes
1090086ae956SMike Bayer    off of reflected default value, allowing
1091d1cc7e75SMike Bayer    a round trip CREATE TABLE to work.
1092086ae956SMike Bayer    This is consistent with other dialects
1093086ae956SMike Bayer    that also maintain the exact form of
1094086ae956SMike Bayer    the default.  [ticket:2189]
1095086ae956SMike Bayer
1096b2d50f28SMike Bayer- postgresql
1097b2d50f28SMike Bayer  - Added new "postgresql_ops" argument to 
1098b2d50f28SMike Bayer    Index, allows specification of PostgreSQL
1099b2d50f28SMike Bayer    operator classes for indexed columns.
1100b2d50f28SMike Bayer    [ticket:2198]  Courtesy Filip Zyzniewski.
1101b2d50f28SMike Bayer
1102e1f9f963SMike Bayer- mysql
1103e1f9f963SMike Bayer  - Fixed OurSQL dialect to use ansi-neutral 
1104e1f9f963SMike Bayer    quote symbol "'" for XA commands instead
1105e1f9f963SMike Bayer    of '"'.  [ticket:2186].  Also in 0.6.9.
1106e1f9f963SMike Bayer
11079a34d9a8SMike Bayer- mssql
11089a34d9a8SMike Bayer  - Adjusted the pyodbc dialect such that bound
11099a34d9a8SMike Bayer    values are passed as bytes and not unicode
11109a34d9a8SMike Bayer    if the "Easysoft" unix drivers are detected. 
11119a34d9a8SMike Bayer    This is the same behavior as occurs with
11129a34d9a8SMike Bayer    FreeTDS.  Easysoft appears to segfault
11139a34d9a8SMike Bayer    if Python unicodes are passed under
11149a34d9a8SMike Bayer    certain circumstances.
11159a34d9a8SMike Bayer
11166040af5dSMike Bayer- oracle
11176040af5dSMike Bayer  - Added ORA-00028 to disconnect codes, use 
11186040af5dSMike Bayer    cx_oracle _Error.code to get at the code,
11196040af5dSMike Bayer    [ticket:2200].  Also in 0.6.9.
11206040af5dSMike Bayer
1121e936a7b3SMike Bayer  - Added ORA-01033 to disconnect codes, which
1122e936a7b3SMike Bayer    can be caught during a connection 
1123e936a7b3SMike Bayer    event.  [ticket:2201]
1124e936a7b3SMike Bayer
1125bd45f22eSMike Bayer  - repaired the oracle.RAW type which did not
1126bd45f22eSMike Bayer    generate the correct DDL.  [ticket:2220]
1127bd45f22eSMike Bayer    Also in 0.6.9.
1128bd45f22eSMike Bayer
112905cbb6b2SMike Bayer  - added CURRENT to reserved word list.
113005cbb6b2SMike Bayer    [ticket:2212] Also in 0.6.9.
113105cbb6b2SMike Bayer
1132287e9d6aSMike Bayer-ext
1133287e9d6aSMike Bayer  - Fixed bug in the mutable extension whereby
1134287e9d6aSMike Bayer    if the same type were used twice in one
1135287e9d6aSMike Bayer    mapping, the attributes beyond the first
1136287e9d6aSMike Bayer    would not get instrumented.
1137287e9d6aSMike Bayer
1138409a95adSMike Bayer  - Fixed bug in the mutable extension whereby
1139409a95adSMike Bayer    if None or a non-corresponding type were set, 
1140409a95adSMike Bayer    an error would be raised.  None is now accepted
1141409a95adSMike Bayer    which assigns None to all attributes,
1142409a95adSMike Bayer    illegal values raise ValueError.
1143409a95adSMike Bayer
1144e30d02c6SMike Bayer- examples
1145e30d02c6SMike Bayer  - Repaired the examples/versioning test runner
1146e30d02c6SMike Bayer    to not rely upon SQLAlchemy test libs,
1147e30d02c6SMike Bayer    nosetests must be run from within
1148e30d02c6SMike Bayer    examples/versioning to get around setup.cfg
1149e30d02c6SMike Bayer    breaking it.
1150e30d02c6SMike Bayer
1151e30d02c6SMike Bayer  - Tweak to examples/versioning to pick the
1152e30d02c6SMike Bayer    correct foreign key in a multi-level
1153e30d02c6SMike Bayer    inheritance situation.
1154e30d02c6SMike Bayer
1155e4d9679cSMike Bayer  - Fixed the attribute shard example to check
1156e4d9679cSMike Bayer    for bind param callable correctly in 0.7 
1157e4d9679cSMike Bayer    style.
1158e4d9679cSMike Bayer
1159736481e5SMike Bayer0.7.1
1160736481e5SMike Bayer=====
1161dc75e0c6SMike Bayer- general
1162dc75e0c6SMike Bayer  - Added a workaround for Python bug 7511 where
1163dc75e0c6SMike Bayer    failure of C extension build does not 
1164dc75e0c6SMike Bayer    raise an appropriate exception on Windows 64
1165dc75e0c6SMike Bayer    bit + VC express [ticket:2184]
1166dc75e0c6SMike Bayer
1167c25412d9SMike Bayer- orm
1168c25412d9SMike Bayer  - "delete-orphan" cascade is now allowed on
1169c25412d9SMike Bayer    self-referential relationships - this since
1170c25412d9SMike Bayer    SQLA 0.7 no longer enforces "parent with no 
1171c25412d9SMike Bayer    child" at the ORM level; this check is left
1172e30d02c6SMike Bayer    up to foreign key nullability.
1173c25412d9SMike Bayer    Related to [ticket:1912]
1174736481e5SMike Bayer
11755cac2468SMike Bayer  - Repaired new "mutable" extension to propagate
11765cac2468SMike Bayer    events to subclasses correctly; don't 
11775cac2468SMike Bayer    create multiple event listeners for 
11785cac2468SMike Bayer    subclasses either.  [ticket:2180]
11795cac2468SMike Bayer
1180d9a2c64aSMike Bayer  - Modify the text of the message which occurs
1181d9a2c64aSMike Bayer    when the "identity" key isn't detected on 
1182d9a2c64aSMike Bayer    flush, to include the common cause that
1183d9a2c64aSMike Bayer    the Column isn't set up to detect
1184d9a2c64aSMike Bayer    auto-increment correctly; [ticket:2170].
1185d9a2c64aSMike Bayer    Also in 0.6.8.
1186d9a2c64aSMike Bayer
118708f493dcSMike Bayer  - Fixed bug where transaction-level "deleted"
118808f493dcSMike Bayer    collection wouldn't be cleared of expunged
118908f493dcSMike Bayer    states, raising an error if they later
119008f493dcSMike Bayer    became transient [ticket:2182]. 
119108f493dcSMike Bayer    Also in 0.6.8.
119208f493dcSMike Bayer
1193736481e5SMike Bayer- sql
1194fae54b27SMike Bayer  - Fixed bug whereby metadata.reflect(bind)
1195fae54b27SMike Bayer    would close a Connection passed as a
1196fae54b27SMike Bayer    bind argument.  Regression from 0.6.
1197fae54b27SMike Bayer
1198736481e5SMike Bayer  - Streamlined the process by which a Select
1199736481e5SMike Bayer    determines what's in it's '.c' collection.
1200736481e5SMike Bayer    Behaves identically, except that a 
1201736481e5SMike Bayer    raw ClauseList() passed to select([]) 
1202736481e5SMike Bayer    (which is not a documented case anyway) will
1203736481e5SMike Bayer    now be expanded into its individual column
1204736481e5SMike Bayer    elements instead of being ignored.
1205736481e5SMike Bayer
1206df21626eSMike Bayer- engine
1207df21626eSMike Bayer  - Deprecate schema/SQL-oriented methods on 
1208df21626eSMike Bayer    Connection/Engine that were never well known
1209df21626eSMike Bayer    and are redundant:  reflecttable(), create(), 
1210df21626eSMike Bayer    drop(), text(), engine.func
1211df21626eSMike Bayer
121209080baaSMike Bayer  - Adjusted the __contains__() method of 
121309080baaSMike Bayer    a RowProxy result row such that no exception
1214e30d02c6SMike Bayer    throw is generated internally;
121509080baaSMike Bayer    NoSuchColumnError() also will generate its 
121609080baaSMike Bayer    message regardless of whether or not the column 
1217e30d02c6SMike Bayer    construct can be coerced to a string.
121809080baaSMike Bayer    [ticket:2178].  Also in 0.6.8.
121909080baaSMike Bayer
12208c09969dSMike Bayer- sqlite
12218c09969dSMike Bayer  - Accept None from cursor.fetchone() when
12228c09969dSMike Bayer    "PRAGMA read_uncommitted" is called to determine
12238c09969dSMike Bayer    current isolation mode at connect time and
12248c09969dSMike Bayer    default to SERIALIZABLE; this to support SQLite 
12258c09969dSMike Bayer    versions pre-3.3.0 that did not have this 
12268c09969dSMike Bayer    feature.  [ticket:2173]
12278c09969dSMike Bayer
1228c0f92211SMike Bayer- postgresql
1229c0f92211SMike Bayer  - Some unit test fixes regarding numeric arrays, 
1230c0f92211SMike Bayer    MATCH operator.   A potential floating-point
1231c0f92211SMike Bayer    inaccuracy issue was fixed, and certain tests 
1232c0f92211SMike Bayer    of the MATCH operator only execute within an 
1233e30d02c6SMike Bayer    EN-oriented locale for now.  [ticket:2175].
1234c0f92211SMike Bayer    Also in 0.6.8.
1235c0f92211SMike Bayer
12369211ecb6SMike Bayer- mysql
12379211ecb6SMike Bayer  - Unit tests pass 100% on MySQL installed
12389211ecb6SMike Bayer    on windows.
12399211ecb6SMike Bayer
12409211ecb6SMike Bayer  - Removed the "adjust casing" step that would
12419211ecb6SMike Bayer    fail when reflecting a table on MySQL
12429211ecb6SMike Bayer    on windows with a mixed case name.  After some
12439211ecb6SMike Bayer    experimenting with a windows MySQL server, it's
12449211ecb6SMike Bayer    been determined that this step wasn't really 
12459211ecb6SMike Bayer    helping the situation much; MySQL does not return
12469211ecb6SMike Bayer    FK names with proper casing on non-windows 
12479211ecb6SMike Bayer    platforms either, and removing the step at
12489211ecb6SMike Bayer    least allows the reflection to act more like
12499211ecb6SMike Bayer    it does on other OSes.   A warning here
12509211ecb6SMike Bayer    has been considered but its difficult to 
12519211ecb6SMike Bayer    determine under what conditions such a warning
12529211ecb6SMike Bayer    can be raised, so punted on that for now - 
12539211ecb6SMike Bayer    added some docs instead. [ticket:2181]
12549211ecb6SMike Bayer
12559211ecb6SMike Bayer  - supports_sane_rowcount will be set to False
12569211ecb6SMike Bayer    if using MySQLdb and the DBAPI doesn't provide 
12579211ecb6SMike Bayer    the constants.CLIENT module.
12589211ecb6SMike Bayer
12592e5e325aSMike Bayer0.7.0
1260b02193bdSMike Bayer=======
12612e5e325aSMike Bayer- This section documents those changes from 0.7b4
12622e5e325aSMike Bayer  to 0.7.0.  For an overview of what's new in 
12632e5e325aSMike Bayer  SQLAlchemy 0.7, see 
12642e5e325aSMike Bayer  http://www.sqlalchemy.org/trac/wiki/07Migration
12652e5e325aSMike Bayer
1266b02193bdSMike Bayer- orm
1267b02193bdSMike Bayer  - Fixed regression introduced in 0.7b4 (!) whereby
1268b02193bdSMike Bayer    query.options(someoption("nonexistent name")) would
1269b02193bdSMike Bayer    fail to raise an error.  Also added additional
1270b02193bdSMike Bayer    error catching for cases where the option would
1271b02193bdSMike Bayer    try to build off a column-based element, further
1272b02193bdSMike Bayer    fixed up some of the error messages tailored
1273b02193bdSMike Bayer    in [ticket:2069]
1274b02193bdSMike Bayer
127594ee7170SMike Bayer  - query.count() emits "count(*)" instead of 
127694ee7170SMike Bayer    "count(1)".  [ticket:2162]
127794ee7170SMike Bayer
1278ebb80339SMike Bayer  - Fine tuning of Query clause adaptation when
1279ebb80339SMike Bayer    from_self(), union(), or other "select from
1280ebb80339SMike Bayer    myself" operation, such that plain SQL expression
1281ebb80339SMike Bayer    elements added to filter(), order_by() etc.
1282ebb80339SMike Bayer    which are present in the nested "from myself" 
1283ebb80339SMike Bayer    query *will* be adapted in the same way an ORM
1284ebb80339SMike Bayer    expression element will, since these
1285ebb80339SMike Bayer    elements are otherwise not easily accessible.
1286ebb80339SMike Bayer    [ticket:2155]
1287ebb80339SMike Bayer
12884292c562SMike Bayer  - Fixed bug where determination of "self referential"
12894292c562SMike Bayer    relationship would fail with no workaround
12904292c562SMike Bayer    for joined-inh subclass related to itself,
12914292c562SMike Bayer    or joined-inh subclass related to a subclass
12924292c562SMike Bayer    of that with no cols in the sub-sub class 
12934292c562SMike Bayer    in the join condition.  [ticket:2149]
12944292c562SMike Bayer    Also in 0.6.8.
12954292c562SMike Bayer
12967adcb1c7SMike Bayer  - mapper() will ignore non-configured foreign keys
12977adcb1c7SMike Bayer    to unrelated tables when determining inherit
12984bc2402cSMike Bayer    condition between parent and child class,
12994bc2402cSMike Bayer    but will raise as usual for unresolved
13004bc2402cSMike Bayer    columns and table names regarding the inherited
13014bc2402cSMike Bayer    table.  This is an enhanced generalization of 
13024bc2402cSMike Bayer    behavior that was already applied to declarative
13034bc2402cSMike Bayer    previously.  [ticket:2153]   0.6.8 has a more
13044bc2402cSMike Bayer    conservative version of this which doesn't
13054bc2402cSMike Bayer    fundamentally alter how join conditions
13064bc2402cSMike Bayer    are determined.
13077adcb1c7SMike Bayer
1308eb569b67SMike Bayer  - It is an error to call query.get() when the
1309eb569b67SMike Bayer    given entity is not a single, full class 
1310eb569b67SMike Bayer    entity or mapper (i.e. a column).  This is
1311e30d02c6SMike Bayer    a deprecation warning in 0.6.8.
1312eb569b67SMike Bayer    [ticket:2144]
1313eb569b67SMike Bayer
131481a025fcSMike Bayer  - Fixed a potential KeyError which under some
131581a025fcSMike Bayer    circumstances could occur with the identity 
131681a025fcSMike Bayer    map, part of [ticket:2148]
131781a025fcSMike Bayer
131802fa8bacSMike Bayer  - added Query.with_session() method, switches 
131902fa8bacSMike Bayer    Query to use a different session.
132002fa8bacSMike Bayer
1321815e4ef4SMike Bayer  - horizontal shard query should use execution
1322815e4ef4SMike Bayer    options per connection as per [ticket:2131]
1323815e4ef4SMike Bayer
13247df21e5aSMike Bayer  - a non_primary mapper will inherit the _identity_class
13257df21e5aSMike Bayer    of the primary mapper.  This so that a non_primary
13267df21e5aSMike Bayer    established against a class that's normally in an
13277df21e5aSMike Bayer    inheritance mapping will produce results that are 
13287df21e5aSMike Bayer    identity-map compatible with that of the primary
13297df21e5aSMike Bayer    mapper [ticket:2151] (also in 0.6.8)
13307df21e5aSMike Bayer
1331de9c030fSMike Bayer  - Fixed the error message emitted for "can't
1332de9c030fSMike Bayer    execute syncrule for destination column 'q';
1333de9c030fSMike Bayer    mapper 'X' does not map this column" to 
1334de9c030fSMike Bayer    reference the correct mapper.  [ticket:2163].
1335de9c030fSMike Bayer    Also in 0.6.8.
1336de9c030fSMike Bayer
13379826ba73SMike Bayer  - polymorphic_union() gets a "cast_nulls" option,
13389826ba73SMike Bayer    disables the usage of CAST when it renders
13399826ba73SMike Bayer    the labeled NULL columns.  [ticket:1502]
13409826ba73SMike Bayer
13419826ba73SMike Bayer  - polymorphic_union() renders the columns in their
13429826ba73SMike Bayer    original table order, as according to the first
13439826ba73SMike Bayer    table/selectable in the list of polymorphic
13449826ba73SMike Bayer    unions in which they appear.  (which is itself 
13459826ba73SMike Bayer    an unordered mapping unless you pass an OrderedDict).
13469826ba73SMike Bayer
1347a1a588faSMike Bayer  - Fixed bug whereby mapper mapped to an anonymous
1348a1a588faSMike Bayer    alias would fail if logging were used, due to 
1349a1a588faSMike Bayer    unescaped % sign in the alias name.  [ticket:2171]
1350a1a588faSMike Bayer    Also in 0.6.8.
1351a1a588faSMike Bayer
13520c560edeSMike Bayer- sql
135300380cf3SMike Bayer  - Fixed bug whereby nesting a label of a select()
135400380cf3SMike Bayer    with another label in it would produce incorrect
135500380cf3SMike Bayer    exported columns.   Among other things this would
135600380cf3SMike Bayer    break an ORM column_property() mapping against
135700380cf3SMike Bayer    another column_property().  [ticket:2167].
135800380cf3SMike Bayer    Also in 0.6.8
135900380cf3SMike Bayer
13604bc2402cSMike Bayer  - Changed the handling in determination of join
13614bc2402cSMike Bayer    conditions such that foreign key errors are
13624bc2402cSMike Bayer    only considered between the two given tables.
13634bc2402cSMike Bayer    That is, t1.join(t2) will report FK errors
13644bc2402cSMike Bayer    that involve 't1' or 't2', but anything 
13654bc2402cSMike Bayer    involving 't3' will be skipped.   This affects
13664bc2402cSMike Bayer    join(), as well as ORM relationship and
13674bc2402cSMike Bayer    inherit condition logic.
13684bc2402cSMike Bayer
13697b2a76c4SMike Bayer  - Some improvements to error handling inside
13707b2a76c4SMike Bayer    of the execute procedure to ensure auto-close
13717b2a76c4SMike Bayer    connections are really closed when very 
13727b2a76c4SMike Bayer    unusual DBAPI errors occur.
13737b2a76c4SMike Bayer
1374d2162980SMike Bayer  - metadata.reflect() and reflection.Inspector() 
1375d2162980SMike Bayer    had some reliance on GC to close connections
1376d2162980SMike Bayer    which were internally procured, fixed this.
1377d2162980SMike Bayer
13780c560edeSMike Bayer  - Added explicit check for when Column .name
13790c560edeSMike Bayer    is assigned as blank string [ticket:2140]
13800c560edeSMike Bayer
13813452a2baSMike Bayer  - Fixed bug whereby if FetchedValue was passed
13823452a2baSMike Bayer    to column server_onupdate, it would not
13833452a2baSMike Bayer    have its parent "column" assigned, added
13843452a2baSMike Bayer    test coverage for all column default assignment
13853452a2baSMike Bayer    patterns.  [ticket:2147]  also in 0.6.8
13863452a2baSMike Bayer
1387c718dea7SMike Bayer- postgresql
1388c718dea7SMike Bayer  - Fixed the psycopg2_version parsing in the 
1389c718dea7SMike Bayer    psycopg2 dialect.
1390c718dea7SMike Bayer
1391ef654af3SMike Bayer  - Fixed bug affecting PG 9 whereby index reflection
1392ef654af3SMike Bayer    would fail if against a column whose name
1393ef654af3SMike Bayer    had changed.  [ticket:2141].  Also in 0.6.8.
1394ef654af3SMike Bayer
1395c7713a6fSMike Bayer- mssql
1396c7713a6fSMike Bayer  - Fixed bug in MSSQL dialect whereby the aliasing
1397c7713a6fSMike Bayer    applied to a schema-qualified table would leak
1398c7713a6fSMike Bayer    into enclosing select statements [ticket:2169].
1399c7713a6fSMike Bayer    Also in 0.6.8.
1400c7713a6fSMike Bayer
1401425b7388SMike Bayer- documentation
1402425b7388SMike Bayer  - Removed the usage of the "collections.MutableMapping"
1403425b7388SMike Bayer    abc from the ext.mutable docs as it was being used
1404425b7388SMike Bayer    incorrectly and makes the example more difficult
1405425b7388SMike Bayer    to understand in any case.  [ticket:2152]
1406425b7388SMike Bayer
1407d0322642SMike Bayer- examples
1408d0322642SMike Bayer  - removed the ancient "polymorphic association"
1409d0322642SMike Bayer    examples and replaced with an updated set of
1410d0322642SMike Bayer    examples that use declarative mixins, 
1411d0322642SMike Bayer    "generic_associations".   Each presents an alternative
1412d0322642SMike Bayer    table layout.
1413d0322642SMike Bayer
1414501b8aecSMike Bayer- ext
1415501b8aecSMike Bayer  - Fixed bugs in sqlalchemy.ext.mutable extension where
1416501b8aecSMike Bayer    `None` was not appropriately handled, replacement
1417501b8aecSMike Bayer    events were not appropriately handled.
1418501b8aecSMike Bayer    [ticket:2143]
1419501b8aecSMike Bayer
142039c465ecSMike Bayer0.7.0b4
142139c465ecSMike Bayer=======
1422cddf5856SMike Bayer- general
1423cddf5856SMike Bayer  - Changes to the format of CHANGES, this file.
1424cddf5856SMike Bayer    The format changes have been applied to 
1425cddf5856SMike Bayer    the 0.7 releases.
1426cddf5856SMike Bayer
1427cddf5856SMike Bayer    - The "-declarative" changes will now be listed
1428cddf5856SMike Bayer      directly under the "-orm" section, as these
1429cddf5856SMike Bayer      are closely related.
1430cddf5856SMike Bayer
1431cddf5856SMike Bayer    - The 0.5 series changes have been moved to
1432cddf5856SMike Bayer      the file CHANGES_PRE_06 which replaces
1433cddf5856SMike Bayer      CHANGES_PRE_05.
1434cddf5856SMike Bayer
1435cddf5856SMike Bayer    - The changelog for 0.6.7 and subsequent within
1436cddf5856SMike Bayer      the 0.6 series is now listed only in the 
1437e30d02c6SMike Bayer      CHANGES file within the 0.6 branch.
1438cddf5856SMike Bayer      In the 0.7 CHANGES file (i.e. this file), all the
1439cddf5856SMike Bayer      0.6 changes are listed inline within the 0.7
1440cddf5856SMike Bayer      section in which they were also applied 
1441cddf5856SMike Bayer      (since all 0.6 changes are in 0.7 as well).
1442cddf5856SMike Bayer      Changes that apply to an 0.6 version here
1443cddf5856SMike Bayer      are noted as are if any differences in 
1444cddf5856SMike Bayer      implementation/behavior are present.
1445cddf5856SMike Bayer
144633691f68SMike Bayer- orm
1447708a25e7SMike Bayer  - Some fixes to "evaulate" and "fetch" evaluation
1448708a25e7SMike Bayer    when query.update(), query.delete() are called.
1449708a25e7SMike Bayer    The retrieval of records is done after autoflush
1450708a25e7SMike Bayer    in all cases, and before update/delete is 
1451708a25e7SMike Bayer    emitted, guarding against unflushed data present
1452708a25e7SMike Bayer    as well as expired objects failing during 
1453708a25e7SMike Bayer    the evaluation.  [ticket:2122]
1454708a25e7SMike Bayer
145533691f68SMike Bayer  - Reworded the exception raised when a flush
145633691f68SMike Bayer    is attempted of a subclass that is not polymorphic
145733691f68SMike Bayer    against the supertype.  [ticket:2063]
145833691f68SMike Bayer
1459ed578377SMike Bayer  - Still more wording adjustments when a query option
1460ed578377SMike Bayer    can't find the target entity.  Explain that the
1461ed578377SMike Bayer    path must be from one of the root entities.
1462ed578377SMike Bayer
1463a6450322SMike Bayer  - Some fixes to the state handling regarding 
1464a6450322SMike Bayer    backrefs, typically when autoflush=False, where
1465a6450322SMike Bayer    the back-referenced collection wouldn't 
1466a6450322SMike Bayer    properly handle add/removes with no net 
1467a6450322SMike Bayer    change.  Thanks to Richard Murri for the 
1468a6450322SMike Bayer    test case + patch.  [ticket:2123]
1469a6450322SMike Bayer    (also in 0.6.7).
1470a6450322SMike Bayer
14711da499a8SMike Bayer  - Added checks inside the UOW to detect the unusual
14721da499a8SMike Bayer    condition of being asked to UPDATE or DELETE
14731da499a8SMike Bayer    on a primary key value that contains NULL
14741da499a8SMike Bayer    in it.  [ticket:2127]
14751da499a8SMike Bayer
14761da499a8SMike Bayer  - Some refinements to attribute history.  More
14771da499a8SMike Bayer    changes are pending possibly in 0.8, but
14781da499a8SMike Bayer    for now history has been modified such that
14791da499a8SMike Bayer    scalar history doesn't have a "side effect"
14801da499a8SMike Bayer    of populating None for a non-present value.
14811da499a8SMike Bayer    This allows a slightly better ability to 
14821da499a8SMike Bayer    distinguish between a None set and no actual 
14831da499a8SMike Bayer    change, affects [ticket:2127] as well.
14841da499a8SMike Bayer
1485674d4f8dSMike Bayer  - a "having" clause would be copied from the
1486674d4f8dSMike Bayer    inside to the outside query if from_self()
1487674d4f8dSMike Bayer    were used; in particular this would break
1488674d4f8dSMike Bayer    an 0.7 style count() query [ticket:2130].
1489674d4f8dSMike Bayer    (also in 0.6.7)
1490674d4f8dSMike Bayer
1491566f4688SMike Bayer  - the Query.execution_options() method now passes
1492566f4688SMike Bayer    those options to the Connection rather than
1493566f4688SMike Bayer    the SELECT statement, so that all available
1494566f4688SMike Bayer    options including isolation level and 
1495566f4688SMike Bayer    compiled cache may be used.  [ticket:2131]
1496566f4688SMike Bayer
149739c465ecSMike Bayer- sql
1498566f4688SMike Bayer  - The "compiled_cache" execution option now raises
1499566f4688SMike Bayer    an error when passed to a SELECT statement 
1500566f4688SMike Bayer    rather than a Connection.  Previously it was
1501566f4688SMike Bayer    being ignored entirely.   We may look into
1502566f4688SMike Bayer    having this option work on a per-statement
1503566f4688SMike Bayer    level at some point. [ticket:2131]
1504566f4688SMike Bayer
150539c465ecSMike Bayer  - Restored the "catchall" constructor on the base
150639c465ecSMike Bayer    TypeEngine class, with a deprecation warning.
150739c465ecSMike Bayer    This so that code which does something like
150839c465ecSMike Bayer    Integer(11) still succeeds.
150939c465ecSMike Bayer
151093da3087SMike Bayer  - Fixed regression whereby MetaData() coming
151193da3087SMike Bayer    back from unpickling did not keep track of 
151293da3087SMike Bayer    new things it keeps track of now, i.e.
151393da3087SMike Bayer    collection of Sequence objects, list
151493da3087SMike Bayer    of schema names.  [ticket:2104]
151593da3087SMike Bayer
151651fea2e1SMike Bayer  - The limit/offset keywords to select() as well
151751fea2e1SMike Bayer    as the value passed to select.limit()/offset()
151851fea2e1SMike Bayer    will be coerced to integer.  [ticket:2116]
151951fea2e1SMike Bayer    (also in 0.6.7)
152051fea2e1SMike Bayer
15212d34ded2SMike Bayer  - fixed bug where "from" clause gathering from an
15222d34ded2SMike Bayer    over() clause would be an itertools.chain() and
15232d34ded2SMike Bayer    not a list, causing "can only concatenate list"
15242d34ded2SMike Bayer    TypeError when combined with other clauses.
15252d34ded2SMike Bayer
1526509f3fb4SMike Bayer  - Fixed incorrect usage of "," in over() clause
1527509f3fb4SMike Bayer    being placed between the "partition" and "order by"
1528509f3fb4SMike Bayer    clauses.  [ticket:2134]
1529509f3fb4SMike Bayer
1530ae363b06SMike Bayer  - Before/after attach events for PrimaryKeyConstraint
1531ae363b06SMike Bayer    now function, tests added for before/after events
1532ae363b06SMike Bayer    on all constraint types.  [ticket:2105]
1533ae363b06SMike Bayer
153469dcd805SMike Bayer  - Added explicit true()/false() constructs to expression
153569dcd805SMike Bayer    lib - coercion rules will intercept "False"/"True"
153669dcd805SMike Bayer    into these constructs.  In 0.6, the constructs were
153769dcd805SMike Bayer    typically converted straight to string, which was 
153869dcd805SMike Bayer    no longer accepted in 0.7.  [ticket:2117]
153969dcd805SMike Bayer
1540a2094b1bSPhilip Jenvey- engine
1541e6fd32e1SPhilip Jenvey  - The C extension is now enabled by default on CPython
1542e6fd32e1SPhilip Jenvey    2.x with a fallback to pure python if it fails to
1543e6fd32e1SPhilip Jenvey    compile.  [ticket:2129]
1544a2094b1bSPhilip Jenvey
1545d34bc7daSMike Bayer- schema
1546d34bc7daSMike Bayer  - The 'useexisting' flag on Table has been superceded
1547d34bc7daSMike Bayer    by a new pair of flags 'keep_existing' and 
1548d34bc7daSMike Bayer    'extend_existing'.   'extend_existing' is equivalent
1549d34bc7daSMike Bayer    to 'useexisting' - the existing Table is returned,
1550d34bc7daSMike Bayer    and additional constructor elements are added.
1551d34bc7daSMike Bayer    With 'keep_existing', the existing Table is returned,
1552d34bc7daSMike Bayer    but additional constructor elements are not added -
1553d34bc7daSMike Bayer    these elements are only applied when the Table
1554d34bc7daSMike Bayer    is newly created.   [ticket:2109]
1555d34bc7daSMike Bayer
1556b462373bSMike Bayer- types
1557b462373bSMike Bayer  - REAL has been added to the core types.  Supported
1558b462373bSMike Bayer    by Postgresql, SQL Server, MySQL, SQLite.  Note
1559b462373bSMike Bayer    that the SQL Server and MySQL versions, which 
1560b462373bSMike Bayer    add extra arguments, are also still available
1561b462373bSMike Bayer    from those dialects.  [ticket:2081]
1562b462373bSMike Bayer
15630b52a5aeSMike Bayer-event
15640b52a5aeSMike Bayer  - Added @event.listens_for() decorator, given
15650b52a5aeSMike Bayer    target + event name, applies the decorated 
15660b52a5aeSMike Bayer    function as a listener.  [ticket:2106]
15670b52a5aeSMike Bayer
1568218c3cb3SMike Bayer- pool
1569218c3cb3SMike Bayer  - AssertionPool now stores the traceback indicating
1570218c3cb3SMike Bayer    where the currently checked out connection was
1571218c3cb3SMike Bayer    acquired; this traceback is reported within
1572218c3cb3SMike Bayer    the assertion raised upon a second concurrent 
1573218c3cb3SMike Bayer    checkout; courtesy Gunnlaugur Briem 
1574218c3cb3SMike Bayer    [ticket:2103]
1575218c3cb3SMike Bayer
1576393730f3SMike Bayer  - The "pool.manage" feature doesn't use pickle
1577393730f3SMike Bayer    anymore to hash the arguments for each pool.
1578393730f3SMike Bayer
1579fb97a666SMike Bayer- sqlite
1580fb97a666SMike Bayer  - Fixed bug where reflection of foreign key
1581fb97a666SMike Bayer    created as "REFERENCES <tablename>" without
1582fb97a666SMike Bayer    col name would fail.  [ticket:2115]
1583fb97a666SMike Bayer    (also in 0.6.7)
1584fb97a666SMike Bayer
15855eee7e2eSMike Bayer- postgresql
15865eee7e2eSMike Bayer  - Psycopg2 for Python 3 is now supported.
15875eee7e2eSMike Bayer
1588f9113b5dSMike Bayer  - Fixed support for precision numerics when using
1589f9113b5dSMike Bayer    pg8000. [ticket:2132]
1590f9113b5dSMike Bayer
1591545b70e8SMike Bayer- oracle
1592545b70e8SMike Bayer  - Using column names that would require quotes
1593545b70e8SMike Bayer    for the column itself or for a name-generated
1594545b70e8SMike Bayer    bind parameter, such as names with special
1595545b70e8SMike Bayer    characters, underscores, non-ascii characters,
1596545b70e8SMike Bayer    now properly translate bind parameter keys when
1597545b70e8SMike Bayer    talking to cx_oracle.  [ticket:2100]  (Also
1598545b70e8SMike Bayer    in 0.6.7)
1599545b70e8SMike Bayer
160051fea2e1SMike Bayer  - Oracle dialect adds use_binds_for_limits=False
160151fea2e1SMike Bayer    create_engine() flag, will render the LIMIT/OFFSET
160251fea2e1SMike Bayer    values inline instead of as binds, reported to
160351fea2e1SMike Bayer    modify the execution plan used by Oracle.
160451fea2e1SMike Bayer    [ticket:2116] (Also in 0.6.7)
160551fea2e1SMike Bayer
1606d355a3beSMike Bayer- documentation
1607d355a3beSMike Bayer  - Documented SQLite DATE/TIME/DATETIME types.
1608d355a3beSMike Bayer    [ticket:2029] (also in 0.6.7)
1609d355a3beSMike Bayer
161030143823SMike Bayer  - Fixed mutable extension docs to show the 
161130143823SMike Bayer    correct type-association methods.
161230143823SMike Bayer    [ticket:2118]
161330143823SMike Bayer
1614cf511311SMike Bayer0.7.0b3
1615cf511311SMike Bayer=======
1616b1b8e7deSMike Bayer- general
1617cddf5856SMike Bayer  - Lots of fixes to unit tests when run under Pypy
1618cddf5856SMike Bayer    (courtesy Alex Gaynor).
1619b1b8e7deSMike Bayer
1620403d7869SMike Bayer- orm
1621e7be5a57SMike Bayer  - Changed the underlying approach to query.count().
1622e7be5a57SMike Bayer    query.count() is now in all cases exactly:
1623e7be5a57SMike Bayer
1624e7be5a57SMike Bayer        query.
1625e7be5a57SMike Bayer            from_self(func.count(literal_column('1'))).
1626e7be5a57SMike Bayer            scalar()
1627e7be5a57SMike Bayer
1628e7be5a57SMike Bayer    That is, "select count(1) from (<full query>)".
1629e7be5a57SMike Bayer    This produces a subquery in all cases, but 
1630e7be5a57SMike Bayer    vastly simplifies all the guessing count()
1631e7be5a57SMike Bayer    tried to do previously, which would still
1632e7be5a57SMike Bayer    fail in many scenarios particularly when
1633e7be5a57SMike Bayer    joined table inheritance and other joins
1634e7be5a57SMike Bayer    were involved.  If the subquery produced
1635e7be5a57SMike Bayer    for an otherwise very simple count is really 
1636e7be5a57SMike Bayer    an issue, use query(func.count()) as an 
1637e7be5a57SMike Bayer    optimization.  [ticket:2093]
1638e7be5a57SMike Bayer
1639403d7869SMike Bayer  - some changes to the identity map regarding
1640403d7869SMike Bayer    rare weakref callbacks during iterations.
1641403d7869SMike Bayer    The mutex has been removed as it apparently 
1642403d7869SMike Bayer    can cause a reentrant (i.e. in one thread) deadlock,
1643403d7869SMike Bayer    perhaps when gc collects objects at the point of 
1644403d7869SMike Bayer    iteration in order to gain more memory.  It is hoped
1645403d7869SMike Bayer    that "dictionary changed during iteration" will
1646403d7869SMike Bayer    be exceedingly rare as iteration methods internally
1647403d7869SMike Bayer    acquire the full list of objects in a single values() 
1648cddf5856SMike Bayer    call. Note 0.6.7 has a more conservative fix here
1649cddf5856SMike Bayer    which still keeps the mutex in place. [ticket:2087]
1650403d7869SMike Bayer
1651438c31e6SMike Bayer  - A tweak to the unit of work causes it to order
1652438c31e6SMike Bayer    the flush along relationship() dependencies even if 
1653438c31e6SMike Bayer    the given objects don't have any inter-attribute 
1654438c31e6SMike Bayer    references in memory, which was the behavior in 
1655438c31e6SMike Bayer    0.5 and earlier, so a flush of Parent/Child with
1656e30d02c6SMike Bayer    only foreign key/primary key set will succeed.
1657438c31e6SMike Bayer    This while still maintaining 0.6 and above's not 
1658438c31e6SMike Bayer    generating a ton of useless internal dependency 
1659438c31e6SMike Bayer    structures within the flush that don't correspond 
1660438c31e6SMike Bayer    to state actually within the current flush.
1661438c31e6SMike Bayer    [ticket:2082]
1662438c31e6SMike Bayer
1663464835e4SMike Bayer  - Improvements to the error messages emitted when
1664464835e4SMike Bayer    querying against column-only entities in conjunction
1665464835e4SMike Bayer    with (typically incorrectly) using loader options, 
1666e30d02c6SMike Bayer    where the parent entity is not fully present.
1667464835e4SMike Bayer    [ticket:2069]
1668464835e4SMike Bayer
1669cec64cf8SMike Bayer  - Fixed bug in query.options() whereby a path 
1670cec64cf8SMike Bayer    applied to a lazyload using string keys could 
1671cec64cf8SMike Bayer    overlap a same named attribute on the wrong 
1672cddf5856SMike Bayer    entity.  Note 0.6.7 has a more conservative fix 
1673cec64cf8SMike Bayer    to this.  [ticket:2098]
1674cec64cf8SMike Bayer
1675cddf5856SMike Bayer- declarative
1676cddf5856SMike Bayer  - Arguments in __mapper_args__ that aren't "hashable"
1677cddf5856SMike Bayer    aren't mistaken for always-hashable, possibly-column
1678cddf5856SMike Bayer    arguments.  [ticket:2091] (also in 0.6.7)
1679cddf5856SMike Bayer
1680cf511311SMike Bayer- sql
1681cf511311SMike Bayer  - Added a fully descriptive error message for the
1682cf511311SMike Bayer    case where Column is subclassed and _make_proxy()
1683cf511311SMike Bayer    fails to make a copy due to TypeError on the
1684cf511311SMike Bayer    constructor.   The method _constructor should
1685cf511311SMike Bayer    be implemented in this case.
1686cf511311SMike Bayer
16872bd01b2dSMike Bayer  - Added new event "column_reflect" for Table objects.
16882bd01b2dSMike Bayer    Receives the info dictionary about a Column before
16892bd01b2dSMike Bayer    the object is generated within reflection, and allows
16902bd01b2dSMike Bayer    modification to the dictionary for control over
16912bd01b2dSMike Bayer    most aspects of the resulting Column including 
16922bd01b2dSMike Bayer    key, name, type, info dictionary.  [ticket:2095]
16932bd01b2dSMike Bayer
16942bd01b2dSMike Bayer  - To help with the "column_reflect" event being used
16952bd01b2dSMike Bayer    with specific Table objects instead of all instances
16962bd01b2dSMike Bayer    of Table, listeners can be added to a Table object 
16972bd01b2dSMike Bayer    inline with its construction using a new argument 
16982bd01b2dSMike Bayer    "listeners", a list of tuples of the form 
16992bd01b2dSMike Bayer    (<eventname>, <fn>), which are applied to the Table 
17002bd01b2dSMike Bayer    before the reflection process begins.
17012bd01b2dSMike Bayer
170290335a89SMike Bayer  - Added new generic function "next_value()", accepts
170390335a89SMike Bayer    a Sequence object as its argument and renders the
170490335a89SMike Bayer    appropriate "next value" generation string on the
170590335a89SMike Bayer    target platform, if supported.  Also provides
1706e30d02c6SMike Bayer    ".next_value()" method on Sequence itself.
170790335a89SMike Bayer    [ticket:2085]
170890335a89SMike Bayer
170990335a89SMike Bayer  - func.next_value() or other SQL expression can
171090335a89SMike Bayer    be embedded directly into an insert() construct,
171190335a89SMike Bayer    and if implicit or explicit "returning" is used
171290335a89SMike Bayer    in conjunction with a primary key column, 
171390335a89SMike Bayer    the newly generated value will be present in
171490335a89SMike Bayer    result.inserted_primary_key. [ticket:2084]
171590335a89SMike Bayer
1716cddf5856SMike Bayer  - Added accessors to ResultProxy "returns_rows", 
1717cddf5856SMike Bayer    "is_insert" [ticket:2089] (also in 0.6.7)
1718cddf5856SMike Bayer
1719852a1aefSMike Bayer- engine
1720852a1aefSMike Bayer  - Fixed AssertionPool regression bug.  [ticket:2097]
1721852a1aefSMike Bayer
172262c54510SMichael Trier  - Changed exception raised to ArgumentError when an
172362c54510SMichael Trier    invalid dialect is specified. [ticket:2060]
172462c54510SMichael Trier
1725cddf5856SMike Bayer- postgresql
1726cddf5856SMike Bayer  - Added RESERVED_WORDS for postgresql dialect. [ticket:2092]
1727cddf5856SMike Bayer    (also in 0.6.7)
1728cddf5856SMike Bayer
1729cddf5856SMike Bayer  - Fixed the BIT type to allow a "length" parameter, "varying"
1730cddf5856SMike Bayer    parameter.  Reflection also fixed.  [ticket:2073]
1731cddf5856SMike Bayer    (also in 0.6.7)
1732cddf5856SMike Bayer
1733cddf5856SMike Bayer- mssql
1734cddf5856SMike Bayer  - Rewrote the query used to get the definition of a view,
1735cddf5856SMike Bayer    typically when using the Inspector interface, to
1736cddf5856SMike Bayer    use sys.sql_modules instead of the information schema,
1737cddf5856SMike Bayer    thereby allowing views definitions longer than 4000
1738cddf5856SMike Bayer    characters to be fully returned.  [ticket:2071]
1739cddf5856SMike Bayer    (also in 0.6.7)
1740cddf5856SMike Bayer
1741cddf5856SMike Bayer- firebird
1742cddf5856SMike Bayer  - The "implicit_returning" flag on create_engine() is
1743cddf5856SMike Bayer    honored if set to False.  [ticket:2083] (also in 0.6.7)
1744cddf5856SMike Bayer
1745cddf5856SMike Bayer- informix
1746cddf5856SMike Bayer
1747cddf5856SMike Bayer  - Added RESERVED_WORDS informix dialect. [ticket:2092]
1748cddf5856SMike Bayer    (also in 0.6.7)
1749cddf5856SMike Bayer
1750cddf5856SMike Bayer- ext
1751cddf5856SMike Bayer  - The horizontal_shard ShardedSession class accepts the common
1752cddf5856SMike Bayer    Session argument "query_cls" as a constructor argument,
1753cddf5856SMike Bayer    to enable further subclassing of ShardedQuery.
1754cddf5856SMike Bayer    [ticket:2090] (also in 0.6.7)
1755cddf5856SMike Bayer
17568af45f93SMike Bayer- examples
17578af45f93SMike Bayer  - Updated the association, association proxy examples
17588af45f93SMike Bayer    to use declarative, added a new example 
17598af45f93SMike Bayer    dict_of_sets_with_default.py, a "pushing the envelope" 
17608af45f93SMike Bayer    example of association proxy.
17618af45f93SMike Bayer
1762cddf5856SMike Bayer  - The Beaker caching example allows a "query_cls" argument
1763cddf5856SMike Bayer    to the query_callable() function.  [ticket:2090] 
1764cddf5856SMike Bayer    (also in 0.6.7)
1765cddf5856SMike Bayer
1766838d78afSMike Bayer0.7.0b2
1767838d78afSMike Bayer========
1768838d78afSMike Bayer- orm
1769838d78afSMike Bayer  - Fixed bug whereby Session.merge() would call the
1770838d78afSMike Bayer    load() event with one too few arguments.
1771838d78afSMike Bayer    [ticket:2053]
1772838d78afSMike Bayer
1773838d78afSMike Bayer  - Added logic which prevents the generation of 
1774838d78afSMike Bayer    events from a MapperExtension or SessionExtension 
1775838d78afSMike Bayer    from generating do-nothing events for all the methods 
1776838d78afSMike Bayer    not overridden. [ticket:2052]
1777838d78afSMike Bayer
1778cddf5856SMike Bayer- declarative
1779cddf5856SMike Bayer  - Fixed regression whereby composite() with 
1780cddf5856SMike Bayer    Column objects placed inline would fail
1781cddf5856SMike Bayer    to initialize.  The Column objects can now
1782cddf5856SMike Bayer    be inline with the composite() or external
1783cddf5856SMike Bayer    and pulled in via name or object ref. 
1784cddf5856SMike Bayer    [ticket:2058]
1785cddf5856SMike Bayer
1786cddf5856SMike Bayer  - Fix error message referencing old @classproperty
1787cddf5856SMike Bayer    name to reference @declared_attr [ticket:2061]
1788cddf5856SMike Bayer    (also in 0.6.7)
1789cddf5856SMike Bayer
1790cddf5856SMike Bayer  - the dictionary at the end of the __table_args__
1791cddf5856SMike Bayer    tuple is now optional.  [ticket:1468]
1792cddf5856SMike Bayer
17932e4da522SMike Bayer- sql
17947b22358fSMike Bayer  - Renamed the EngineEvents event class to 
17957b22358fSMike Bayer    ConnectionEvents.  As these classes are never
17967b22358fSMike Bayer    accessed directly by end-user code, this strictly
17977b22358fSMike Bayer    is a documentation change for end users.  Also
17987b22358fSMike Bayer    simplified how events get linked to engines
17997b22358fSMike Bayer    and connections internally. [ticket:2059]
18007b22358fSMike Bayer
18012e4da522SMike Bayer  - The Sequence() construct, when passed a MetaData() 
18022e4da522SMike Bayer    object via its 'metadata' argument, will be 
18032e4da522SMike Bayer    included in CREATE/DROP statements within
18042e4da522SMike Bayer    metadata.create_all() and metadata.drop_all(), 
18052e4da522SMike Bayer    including "checkfirst" logic.  [ticket:2055]
18062e4da522SMike Bayer
180701cb9469SMike Bayer  - The Column.references() method now returns True
180801cb9469SMike Bayer    if it has a foreign key referencing the
180901cb9469SMike Bayer    given column exactly, not just it's parent
181001cb9469SMike Bayer    table.  [ticket:2064]
181101cb9469SMike Bayer
181274f26d22SMike Bayer- postgresql
181374f26d22SMike Bayer  - Fixed regression from 0.6 where SMALLINT and
181474f26d22SMike Bayer    BIGINT types would both generate SERIAL
181574f26d22SMike Bayer    on an integer PK column, instead of 
181674f26d22SMike Bayer    SMALLINT and BIGSERIAL [ticket:2065]
181774f26d22SMike Bayer
181827220358SMike Bayer- ext
181927220358SMike Bayer  - Association proxy now has correct behavior for
182027220358SMike Bayer    any(), has(), and contains() when proxying
182127220358SMike Bayer    a many-to-one scalar attribute to a one-to-many
182227220358SMike Bayer    collection (i.e. the reverse of the 'typical'
182327220358SMike Bayer    association proxy use case)  [ticket:2054]
182427220358SMike Bayer
182564580940SMike Bayer- examples
182664580940SMike Bayer  - Beaker example now takes into account 'limit'
182764580940SMike Bayer    and 'offset', bind params within embedded
182864580940SMike Bayer    FROM clauses (like when you use union() or 
182964580940SMike Bayer    from_self()) when generating a cache key.
183064580940SMike Bayer
183154085a0eSMike Bayer0.7.0b1
183254085a0eSMike Bayer=======
1833eee9b55fSMike Bayer- Detailed descriptions of each change below are 
1834eee9b55fSMike Bayer  described at:
1835eee9b55fSMike Bayer  http://www.sqlalchemy.org/trac/wiki/07Migration
1836eee9b55fSMike Bayer
1837eee9b55fSMike Bayer- general
1838eee9b55fSMike Bayer  - New event system, supercedes all extensions, listeners,
1839eee9b55fSMike Bayer    etc.  [ticket:1902]
1840eee9b55fSMike Bayer
1841eee9b55fSMike Bayer  - Logging enhancements
1842eee9b55fSMike Bayer    [ticket:1926]
1843eee9b55fSMike Bayer
1844eee9b55fSMike Bayer  - Setup no longer installs a Nose plugin
1845eee9b55fSMike Bayer    [ticket:1949]
1846eee9b55fSMike Bayer
184753aab63bSMike Bayer  - The "sqlalchemy.exceptions" alias in sys.modules
184853aab63bSMike Bayer    has been removed.   Base SQLA exceptions are 
184953aab63bSMike Bayer    available via "from sqlalchemy import exc".
185053aab63bSMike Bayer    The "exceptions" alias for "exc" remains in 
185153aab63bSMike Bayer    "sqlalchemy" for now, it's just not patched into 
185253aab63bSMike Bayer    sys.modules.
185353aab63bSMike Bayer
185439c79c03SMike Bayer- orm
1855eee9b55fSMike Bayer  - More succinct form of query.join(target, onclause)
1856eee9b55fSMike Bayer    [ticket:1923]
1857eee9b55fSMike Bayer
1858eee9b55fSMike Bayer  - Hybrid Attributes, implements/supercedes synonym()
1859eee9b55fSMike Bayer    [ticket:1903]
1860eee9b55fSMike Bayer
1861eee9b55fSMike Bayer  - Rewrite of composites [ticket:2008]
1862eee9b55fSMike Bayer
1863eee9b55fSMike Bayer  - Mutation Event Extension, supercedes "mutable=True"
1864eee9b55fSMike Bayer
1865eee9b55fSMike Bayer  - PickleType and ARRAY mutability turned off by default
1866eee9b55fSMike Bayer     [ticket:1980]
1867eee9b55fSMike Bayer
1868eee9b55fSMike Bayer  - Simplified polymorphic_on assignment
1869eee9b55fSMike Bayer    [ticket:1895]
1870eee9b55fSMike Bayer
1871eee9b55fSMike Bayer  - Flushing of Orphans that have no parent is allowed
1872eee9b55fSMike Bayer    [ticket:1912]
1873eee9b55fSMike Bayer
18748f381f20SMike Bayer  - Adjusted flush accounting step to occur before
18758f381f20SMike Bayer    the commit in the case of autocommit=True.  This allows
18768f381f20SMike Bayer    autocommit=True to work appropriately with 
18778f381f20SMike Bayer    expire_on_commit=True, and also allows post-flush session
18788f381f20SMike Bayer    hooks to operate in the same transactional context 
18798f381f20SMike Bayer    as when autocommit=False.  [ticket:2041]
1880ae5b58d9SMike Bayer
1881eee9b55fSMike Bayer  - Warnings generated when collection members, scalar referents 
1882eee9b55fSMike Bayer    not part of the flush
1883eee9b55fSMike Bayer    [ticket:1973]
1884eee9b55fSMike Bayer
1885eee9b55fSMike Bayer  - Non-`Table`-derived constructs can be mapped
1886eee9b55fSMike Bayer    [ticket:1876]
1887eee9b55fSMike Bayer
1888eee9b55fSMike Bayer  - Tuple label names in Query Improved
1889eee9b55fSMike Bayer    [ticket:1942]
1890eee9b55fSMike Bayer
1891eee9b55fSMike Bayer  - Mapped column attributes reference the most specific 
1892eee9b55fSMike Bayer    column first
1893eee9b55fSMike Bayer    [ticket:1892]
1894eee9b55fSMike Bayer
1895eee9b55fSMike Bayer  - Mapping to joins with two or more same-named columns 
1896eee9b55fSMike Bayer    requires explicit declaration
1897eee9b55fSMike Bayer    [ticket:1896]
1898eee9b55fSMike Bayer
1899eee9b55fSMike Bayer  - Mapper requires that polymorphic_on column be present 
1900eee9b55fSMike Bayer    in the mapped selectable
1901eee9b55fSMike Bayer    [ticket:1875]
1902eee9b55fSMike Bayer
1903eee9b55fSMike Bayer  - compile_mappers() renamed configure_mappers(), simplified 
1904eee9b55fSMike Bayer    configuration internals
1905eee9b55fSMike Bayer    [ticket:1966]
1906eee9b55fSMike Bayer
190739c79c03SMike Bayer  - the aliased() function, if passed a SQL FromClause element
190839c79c03SMike Bayer    (i.e. not a mapped class), will return element.alias() 
190939c79c03SMike Bayer    instead of raising an error on AliasedClass.  [ticket:2018]
191054085a0eSMike Bayer
1911b3dd50a8SMike Bayer  - Session.merge() will check the version id of the incoming
1912b3dd50a8SMike Bayer    state against that of the database, assuming the mapping
1913b3dd50a8SMike Bayer    uses version ids and incoming state has a version_id
1914b3dd50a8SMike Bayer    assigned, and raise StaleDataError if they don't 
1915b3dd50a8SMike Bayer    match.  [ticket:2027]
1916b3dd50a8SMike Bayer
19174a357af1SMike Bayer  - Session.connection(), Session.execute() accept 'bind',
19184a357af1SMike Bayer    to allow execute/connection operations to participate
19194a357af1SMike Bayer    in the open transaction of an engine explicitly.
19204a357af1SMike Bayer    [ticket:1996]
19214a357af1SMike Bayer
1922eee9b55fSMike Bayer  - Query.join(), Query.outerjoin(), eagerload(), 
1923eee9b55fSMike Bayer    eagerload_all(), others no longer allow lists 
1924eee9b55fSMike Bayer    of attributes as arguments (i.e. option([x, y, z]) 
1925eee9b55fSMike Bayer    form, deprecated since 0.5)
1926eee9b55fSMike Bayer
1927e6855d3fSMike Bayer  - ScopedSession.mapper is removed (deprecated since 0.5).
1928eee9b55fSMike Bayer
1929de725a0aSMike Bayer  - Horizontal shard query places 'shard_id' in 
1930de725a0aSMike Bayer    context.attributes where it's accessible by the 
1931de725a0aSMike Bayer    "load()" event. [ticket:2031]
1932de725a0aSMike Bayer
193385084caeSMike Bayer  - A single contains_eager() call across
193485084caeSMike Bayer    multiple entities will indicate all collections
193585084caeSMike Bayer    along that path should load, instead of requiring
193685084caeSMike Bayer    distinct contains_eager() calls for each endpoint
193785084caeSMike Bayer    (which was never correctly documented).
193885084caeSMike Bayer    [ticket:2032]
193985084caeSMike Bayer
194085084caeSMike Bayer  - The "name" field used in orm.aliased() now renders
194185084caeSMike Bayer    in the resulting SQL statement.
194285084caeSMike Bayer
1943a43b106aSMike Bayer  - Session weak_instance_dict=False is deprecated.
1944a43b106aSMike Bayer    [ticket:1473]
1945a43b106aSMike Bayer
1946e155b7b8SMike Bayer  - An exception is raised in the unusual case that an 
1947e155b7b8SMike Bayer    append or similar event on a collection occurs after
1948e155b7b8SMike Bayer    the parent object has been dereferenced, which 
1949e155b7b8SMike Bayer    prevents the parent from being marked as "dirty" 
1950e155b7b8SMike Bayer    in the session.  Was a warning in 0.6.6.
1951e155b7b8SMike Bayer    [ticket:2046]
1952e155b7b8SMike Bayer
19533f9a343dSMike Bayer  - Query.distinct() now accepts column expressions
19543f9a343dSMike Bayer    as *args, interpreted by the Postgresql dialect
19553f9a343dSMike Bayer    as DISTINCT ON (<expr>). [ticket:1069]
19563f9a343dSMike Bayer
1957d7fda4aeSMike Bayer  - Additional tuning to "many-to-one" relationship
1958d7fda4aeSMike Bayer    loads during a flush().   A change in version 0.6.6
1959d7fda4aeSMike Bayer    ([ticket:2002]) required that more "unnecessary" m2o 
1960d7fda4aeSMike Bayer    loads during a flush could occur.   Extra loading modes have
1961d7fda4aeSMike Bayer    been added so that the SQL emitted in this 
1962d7fda4aeSMike Bayer    specific use case is trimmed back, while still
1963d7fda4aeSMike Bayer    retrieving the information the flush needs in order
1964d7fda4aeSMike Bayer    to not miss anything.  [ticket:2049]
1965d7fda4aeSMike Bayer
19662a289e91SMike Bayer  - the value of "passive" as passed to 
19672a289e91SMike Bayer    attributes.get_history() should be one of the 
19682a289e91SMike Bayer    constants defined in the attributes package.  Sending 
19692a289e91SMike Bayer    True or False is deprecated.
19702a289e91SMike Bayer
1971cddf5856SMike Bayer  - Added a `name` argument to `Query.subquery()`, to allow
1972cddf5856SMike Bayer    a fixed name to be assigned to the alias object.
1973cddf5856SMike Bayer    [ticket:2030] (also in 0.6.7)
1974cddf5856SMike Bayer
1975cddf5856SMike Bayer  - A warning is emitted when a joined-table inheriting mapper
1976cddf5856SMike Bayer    has no primary keys on the locally mapped table
1977cddf5856SMike Bayer    (but has pks on the superclass table).  [ticket:2019]
1978cddf5856SMike Bayer    (also in 0.6.7)
1979cddf5856SMike Bayer
1980cddf5856SMike Bayer  - Fixed bug where "middle" class in a polymorphic hierarchy
1981cddf5856SMike Bayer    would have no 'polymorphic_on' column if it didn't also
1982cddf5856SMike Bayer    specify a 'polymorphic_identity', leading to strange
1983cddf5856SMike Bayer    errors upon refresh, wrong class loaded when querying
1984cddf5856SMike Bayer    from that target. Also emits the correct WHERE criterion
1985cddf5856SMike Bayer    when using single table inheritance. [ticket:2038]
1986cddf5856SMike Bayer    (also in 0.6.7)
1987cddf5856SMike Bayer
1988cddf5856SMike Bayer - Fixed bug where a column with a SQL or server side default
1989cddf5856SMike Bayer   that was excluded from a mapping with include_properties
1990cddf5856SMike Bayer   or exclude_properties would result in UnmappedColumnError.
1991cddf5856SMike Bayer   [ticket:1995] (also in 0.6.7)
1992cddf5856SMike Bayer
1993cddf5856SMike Bayer  - A warning is emitted in the unusual case that an
1994cddf5856SMike Bayer    append or similar event on a collection occurs after
1995cddf5856SMike Bayer    the parent object has been dereferenced, which
1996cddf5856SMike Bayer    prevents the parent from being marked as "dirty"
1997cddf5856SMike Bayer    in the session.  This will be an exception in 0.7.
1998cddf5856SMike Bayer    [ticket:2046] (also in 0.6.7)
1999cddf5856SMike Bayer
2000cddf5856SMike Bayer- declarative
2001cddf5856SMike Bayer  - Added an explicit check for the case that the name
2002cddf5856SMike Bayer    'metadata' is used for a column attribute on a
2003cddf5856SMike Bayer    declarative class. [ticket:2050] (also in 0.6.7)
2004cddf5856SMike Bayer
200515ea17d7SMichael Trier- sql
2006020d6ef8SMike Bayer  - Added over() function, method to FunctionElement
2007020d6ef8SMike Bayer    classes, produces the _Over() construct which 
2008020d6ef8SMike Bayer    in turn generates "window functions", i.e.
2009020d6ef8SMike Bayer    "<window function> OVER (PARTITION BY <partition by>,
2010020d6ef8SMike Bayer    ORDER BY <order by>)".
2011020d6ef8SMike Bayer    [ticket:1844]
2012020d6ef8SMike Bayer
2013eee9b55fSMike Bayer  - LIMIT/OFFSET clauses now use bind parameters
2014eee9b55fSMike Bayer    [ticket:805]
2015eee9b55fSMike Bayer
20163f9a343dSMike Bayer  - select.distinct() now accepts column expressions
20173f9a343dSMike Bayer    as *args, interpreted by the Postgresql dialect
20183f9a343dSMike Bayer    as DISTINCT ON (<expr>).  Note this was already
20193f9a343dSMike Bayer    available via passing a list to the `distinct` 
20203f9a343dSMike Bayer    keyword argument to select(). [ticket:1069]
20213f9a343dSMike Bayer
20223f9a343dSMike Bayer  - select.prefix_with() accepts multiple expressions
20233f9a343dSMike Bayer    (i.e. *expr), 'prefix' keyword argument to select()
20243f9a343dSMike Bayer    accepts a list or tuple.
20253f9a343dSMike Bayer
20263f9a343dSMike Bayer  - Passing a string to the `distinct` keyword argument
20273f9a343dSMike Bayer    of `select()` for the purpose of emitting special 
20283f9a343dSMike Bayer    MySQL keywords (DISTINCTROW etc.) is deprecated - 
20293f9a343dSMike Bayer    use `prefix_with()` for this.
20303f9a343dSMike Bayer
2031e6855d3fSMike Bayer  - TypeDecorator works with primary key columns
2032e6855d3fSMike Bayer    [ticket:2005] [ticket:2006]
2033eee9b55fSMike Bayer
2034e6855d3fSMike Bayer  - DDL() constructs now escape percent signs
2035e6855d3fSMike Bayer    [ticket:1897]
2036eee9b55fSMike Bayer
2037e6855d3fSMike Bayer  - Table.c / MetaData.tables refined a bit, don't allow direct 
2038e6855d3fSMike Bayer    mutation  [ticket:1893] [ticket:1917]
2039eee9b55fSMike Bayer
2040e6855d3fSMike Bayer  - Callables passed to `bindparam()` don't get evaluated
2041e6855d3fSMike Bayer    [ticket:1950]
2042eee9b55fSMike Bayer
2043e6855d3fSMike Bayer  - types.type_map is now private, types._type_map
2044e6855d3fSMike Bayer    [ticket:1870]
2045eee9b55fSMike Bayer
2046e6855d3fSMike Bayer  - Non-public Pool methods underscored
2047e6855d3fSMike Bayer    [ticket:1982]
2048eee9b55fSMike Bayer
204915ea17d7SMichael Trier  - Added NULLS FIRST and NULLS LAST support. It's implemented
205015ea17d7SMichael Trier    as an extension to the asc() and desc() operators, called
205115ea17d7SMichael Trier    nullsfirst() and nullslast().  [ticket:723]
205215ea17d7SMichael Trier
2053e46301b5SMike Bayer  - The Index() construct can be created inline with a Table
2054e46301b5SMike Bayer    definition, using strings as column names, as an alternative
2055e46301b5SMike Bayer    to the creation of the index outside of the Table.
2056e46301b5SMike Bayer
20577325ba60SMike Bayer  - execution_options() on Connection accepts 
20587325ba60SMike Bayer    "isolation_level" argument, sets transaction isolation
20597325ba60SMike Bayer    level for that connection only until returned to the
20607325ba60SMike Bayer    connection pool, for thsoe backends which support it
20617325ba60SMike Bayer    (SQLite, Postgresql) [ticket:2001]
20627325ba60SMike Bayer
206367e0f356SMike Bayer  - A TypeDecorator of Integer can be used with a primary key
206467e0f356SMike Bayer    column, and the "autoincrement" feature of various dialects
206567e0f356SMike Bayer    as well as the "sqlite_autoincrement" flag will honor
206667e0f356SMike Bayer    the underlying database type as being Integer-based.
206767e0f356SMike Bayer    [ticket:2005]
206867e0f356SMike Bayer
2069aedd34f3SMike Bayer  - Established consistency when server_default is present
2070aedd34f3SMike Bayer    on an Integer PK column.  SQLA doesn't pre-fetch these,
2071e30d02c6SMike Bayer    nor do they come back in cursor.lastrowid (DBAPI).
2072aedd34f3SMike Bayer    Ensured all backends consistently return None 
2073aedd34f3SMike Bayer    in result.inserted_primary_key for these. Regarding
2074aedd34f3SMike Bayer    reflection for this case, reflection of an int PK col 
2075aedd34f3SMike Bayer    with a server_default sets the "autoincrement" flag to False, 
2076aedd34f3SMike Bayer    except in the case of a PG SERIAL col where we detected a 
2077aedd34f3SMike Bayer    sequence default. [ticket:2020] [ticket:2021]
2078aedd34f3SMike Bayer
207967e0f356SMike Bayer  - Result-row processors are applied to pre-executed SQL 
208067e0f356SMike Bayer    defaults, as well as cursor.lastrowid, when determining
208167e0f356SMike Bayer    the contents of result.inserted_primary_key.
208267e0f356SMike Bayer    [ticket:2006]
208367e0f356SMike Bayer
208467e0f356SMike Bayer  - Bind parameters present in the "columns clause" of a select
208567e0f356SMike Bayer    are now auto-labeled like other "anonymous" clauses,
208667e0f356SMike Bayer    which among other things allows their "type" to be meaningful
208767e0f356SMike Bayer    when the row is fetched, as in result row processors.
208867e0f356SMike Bayer
208967e0f356SMike Bayer  - TypeDecorator is present in the "sqlalchemy" import space.
209067e0f356SMike Bayer
20917e8f3510SMike Bayer  - Non-DBAPI errors which occur in the scope of an `execute()`
20927e8f3510SMike Bayer    call are now wrapped in sqlalchemy.exc.StatementError,
20937e8f3510SMike Bayer    and the text of the SQL statement and repr() of params
20947e8f3510SMike Bayer    is included.  This makes it easier to identify statement
20957e8f3510SMike Bayer    executions which fail before the DBAPI becomes 
20967e8f3510SMike Bayer    involved.  [ticket:2015]
20977e8f3510SMike Bayer
2098848257f7SMike Bayer  - The concept of associating a ".bind" directly with a 
2099848257f7SMike Bayer    ClauseElement has been explicitly moved to Executable,
2100848257f7SMike Bayer    i.e. the mixin that describes ClauseElements which represent
2101848257f7SMike Bayer    engine-executable constructs.  This change is an improvement
2102848257f7SMike Bayer    to internal organization and is unlikely to affect any 
2103848257f7SMike Bayer    real-world usage.  [ticket:2048]
2104848257f7SMike Bayer
2105cddf5856SMike Bayer  - Column.copy(), as used in table.tometadata(), copies the
2106cddf5856SMike Bayer    'doc' attribute.  [ticket:2028] (also in 0.6.7)
2107cddf5856SMike Bayer
2108cddf5856SMike Bayer  - Added some defs to the resultproxy.c extension so that
2109cddf5856SMike Bayer    the extension compiles and runs on Python 2.4.
2110cddf5856SMike Bayer    [ticket:2023] (also in 0.6.7)
2111cddf5856SMike Bayer
2112cddf5856SMike Bayer  - The compiler extension now supports overriding the default
2113cddf5856SMike Bayer    compilation of expression._BindParamClause including that
2114cddf5856SMike Bayer    the auto-generated binds within the VALUES/SET clause
2115cddf5856SMike Bayer    of an insert()/update() statement will also use the new
2116cddf5856SMike Bayer    compilation rules. [ticket:2042] (also in 0.6.7)
2117cddf5856SMike Bayer
2118eee9b55fSMike Bayer-sqlite
2119eee9b55fSMike Bayer  - SQLite dialect now uses `NullPool` for file-based databases
2120eee9b55fSMike Bayer    [ticket:1921]
2121eee9b55fSMike Bayer
2122e43f8596SMike Bayer  - The path given as the location of a sqlite database is now
2123e43f8596SMike Bayer    normalized via os.path.abspath(), so that directory changes
2124e43f8596SMike Bayer    within the process don't affect the ultimate location
2125e43f8596SMike Bayer    of a relative file path.  [ticket:2036]
2126e43f8596SMike Bayer
2127cddf5856SMike Bayer- postgresql
2128cddf5856SMike Bayer  - When explicit sequence execution derives the name
2129cddf5856SMike Bayer    of the auto-generated sequence of a SERIAL column,
2130cddf5856SMike Bayer    which currently only occurs if implicit_returning=False,
2131cddf5856SMike Bayer    now accommodates if the table + column name is greater
2132cddf5856SMike Bayer    than 63 characters using the same logic Postgresql uses.
2133cddf5856SMike Bayer    [ticket:1083] (also in 0.6.7)
2134cddf5856SMike Bayer
2135cddf5856SMike Bayer  - Added an additional libpq message to the list of "disconnect"
2136cddf5856SMike Bayer    exceptions, "could not receive data from server"
2137cddf5856SMike Bayer    [ticket:2044] (also in 0.6.7)
2138cddf5856SMike Bayer
213954085a0eSMike Bayer- mssql
214054085a0eSMike Bayer  - the String/Unicode types, and their counterparts VARCHAR/
214154085a0eSMike Bayer    NVARCHAR, emit "max" as the length when no length is 
2142bc52cae4SMike Bayer    specified, so that the default length, normally '1' 
2143bc52cae4SMike Bayer    as per SQL server documentation, is instead
2144bc52cae4SMike Bayer    'unbounded'.  This also occurs for the VARBINARY type.
2145bc52cae4SMike Bayer    [ticket:1833].
2146bc52cae4SMike Bayer
2147bc52cae4SMike Bayer    This behavior makes these types more closely compatible 
2148bc52cae4SMike Bayer    with Postgresql's VARCHAR type which is similarly unbounded 
2149bc52cae4SMike Bayer    when no length is specified.
2150350aed3fSMike Bayer
21511515073bSMike Bayer- mysql
21521515073bSMike Bayer  - New DBAPI support for pymysql, a pure Python port
21531515073bSMike Bayer    of MySQL-python.  [ticket:1991]
21541515073bSMike Bayer
2155cddf5856SMike Bayer  - oursql dialect accepts the same "ssl" arguments in
2156cddf5856SMike Bayer    create_engine() as that of MySQLdb.  [ticket:2047]
2157cddf5856SMike Bayer    (also in 0.6.7)
2158cddf5856SMike Bayer
21595a2c332fSMike Bayer- firebird
21605a2c332fSMike Bayer  - Some adjustments so that Interbase is supported as well.
21615a2c332fSMike Bayer    FB/Interbase version idents are parsed into a structure
21625a2c332fSMike Bayer    such as (8, 1, 1, 'interbase') or (2, 1, 588, 'firebird')
21635a2c332fSMike Bayer    so they can be distinguished. [ticket:1885]
21645a2c332fSMike Bayer
21659122268eSMike Bayer- drizzle
21669122268eSMike Bayer  - New dialect for Drizzle, a MySQL variant.  Uses MySQL-python
21679122268eSMike Bayer    for the DBAPI.  [ticket:2003]
21689122268eSMike Bayer
2169cddf5856SMike Bayer0.6.7 - 0.6.xx
2170cddf5856SMike Bayer==============
2171ff1868b3SMike Bayer
2172cddf5856SMike BayerChanges which apply to 0.6.7 and subsequent versions of 0.6
2173cddf5856SMike Bayerare listed in the CHANGES file within the 0.6 branch.  All
2174cddf5856SMike Bayerthose changes which are also in the 0.7 series (which is typically
2175cddf5856SMike Bayerall of them) are listed inline within the 0.7 changes above,
2176cddf5856SMike Bayerthose which apply to an 0.6 release are noted.
2177ff1868b3SMike Bayer
21780d00f470SMike Bayer0.6.6
21790d00f470SMike Bayer=====
21800d00f470SMike Bayer- orm
21810d00f470SMike Bayer  - Fixed bug whereby a non-"mutable" attribute modified event
21820d00f470SMike Bayer    which occurred on an object that was clean except for
21830d00f470SMike Bayer    preceding mutable attribute changes would fail to strongly
21840d00f470SMike Bayer    reference itself in the identity map. This would cause the
21850d00f470SMike Bayer    object to be garbage collected, losing track of any changes
21860d00f470SMike Bayer    that weren't previously saved in the "mutable changes"
21870d00f470SMike Bayer    dictionary.
2188855dbda8SMike Bayer
2189848a56eaSMike Bayer  - Fixed bug whereby "passive_deletes='all'" wasn't passing
2190848a56eaSMike Bayer    the correct symbols to lazy loaders during flush, thereby
2191848a56eaSMike Bayer    causing an unwarranted load.  [ticket:2013]
2192848a56eaSMike Bayer
2193b0f48ca2SMike Bayer  - Fixed bug which prevented composite mapped
2194b0f48ca2SMike Bayer    attributes from being used on a mapped select statement. 
2195b0f48ca2SMike Bayer    [ticket:1997]. Note the workings of composite are slated to 
2196b0f48ca2SMike Bayer    change significantly in 0.7.
2197b0f48ca2SMike Bayer
2198b0f48ca2SMike Bayer  - active_history flag also added to composite(). 
2199b0f48ca2SMike Bayer    The flag has no effect in 0.6, but is instead 
2200b0f48ca2SMike Bayer    a placeholder flag for forwards compatibility,
2201b0f48ca2SMike Bayer    as it applies in 0.7 for composites.
2202b0f48ca2SMike Bayer    [ticket:1976]
2203b0f48ca2SMike Bayer
220480ae02f7SMike Bayer  - Fixed uow bug whereby expired objects passed to 
220580ae02f7SMike Bayer    Session.delete() would not have unloaded references 
220680ae02f7SMike Bayer    or collections taken into account when deleting
220780ae02f7SMike Bayer    objects, despite passive_deletes remaining at 
220880ae02f7SMike Bayer    its default of False.  [ticket:2002]
2209350aed3fSMike Bayer
22103351c35eSMike Bayer  - A warning is emitted when version_id_col is specified
22113351c35eSMike Bayer    on an inheriting mapper when the inherited mapper
22123351c35eSMike Bayer    already has one, if those column expressions are not
22133351c35eSMike Bayer    the same.  [ticket:1987]
2214350aed3fSMike Bayer
221530bc4240SMike Bayer  - "innerjoin" flag doesn't take effect along the chain
221630bc4240SMike Bayer    of joinedload() joins if a previous join in that chain
221730bc4240SMike Bayer    is an outer join, thus allowing primary rows without
221830bc4240SMike Bayer    a referenced child row to be correctly returned
221930bc4240SMike Bayer    in results.  [ticket:1954]
2220a41c50adSMike Bayer
2221bcf577c1SMike Bayer  - Fixed bug regarding "subqueryload" strategy whereby
2222bcf577c1SMike Bayer    strategy would fail if the entity was an aliased()
2223bcf577c1SMike Bayer    construct.  [ticket:1964]
2224588f7402SMike Bayer
22259f3b42cbSMike Bayer  - Fixed bug regarding "subqueryload" strategy whereby
22269f3b42cbSMike Bayer    the join would fail if using a multi-level load
22279f3b42cbSMike Bayer    of the form from A->joined-subclass->C [ticket:2014]
22289f3b42cbSMike Bayer
22294efb0747SMike Bayer  - Fixed indexing of Query objects by -1. It was erroneously
22304efb0747SMike Bayer    transformed to the empty slice -1:0 that resulted in
22314efb0747SMike Bayer    IndexError. [ticket:1968]
22324efb0747SMike Bayer
223308257953SMike Bayer  - The mapper argument "primary_key" can be passed as a 
223408257953SMike Bayer    single column as well as a list or tuple.  [ticket:1971]
223508257953SMike Bayer    The documentation examples that illustrated it as a 
2236350aed3fSMike Bayer    scalar value have been changed to lists.
2237d0dc622dSMike Bayer
2238d0dc622dSMike Bayer  - Added active_history flag to relationship()
2239d0dc622dSMike Bayer    and column_property(), forces attribute events to
2240d0dc622dSMike Bayer    always load the "old" value, so that it's available to
2241d0dc622dSMike Bayer    attributes.get_history(). [ticket:1961]
2242350aed3fSMike Bayer
224352167e1cSMike Bayer  - Query.get() will raise if the number of params
224452167e1cSMike Bayer    in a composite key is too large, as well as too 
224552167e1cSMike Bayer    small. [ticket:1977]
2246c8f8124cSMike Bayer
2247c8f8124cSMike Bayer  - Backport of "optimized get" fix from 0.7,
2248c8f8124cSMike Bayer    improves the generation of joined-inheritance
2249c8f8124cSMike Bayer    "load expired row" behavior.  [ticket:1992]
2250c8f8124cSMike Bayer
225174b7bd43SMike Bayer  - A little more verbiage to the "primaryjoin" error,
225274b7bd43SMike Bayer    in an unusual condition that the join condition
225374b7bd43SMike Bayer    "works" for viewonly but doesn't work for non-viewonly,
225474b7bd43SMike Bayer    and foreign_keys wasn't used - adds "foreign_keys" to
225574b7bd43SMike Bayer    the suggestion.  Also add "foreign_keys" to the 
225674b7bd43SMike Bayer    suggestion for the generic "direction" error.
2257350aed3fSMike Bayer
2258588f7402SMike Bayer- sql
225977f64142SMike Bayer  - Fixed operator precedence rules for multiple
226077f64142SMike Bayer    chains of a single non-associative operator.
226177f64142SMike Bayer    I.e. "x - (y - z)" will compile as "x - (y - z)"
226277f64142SMike Bayer    and not "x - y - z".  Also works with labels,
226377f64142SMike Bayer    i.e. "x - (y - z).label('foo')"
226477f64142SMike Bayer    [ticket:1984]
2265350aed3fSMike Bayer
2266588f7402SMike Bayer  - The 'info' attribute of Column is copied during 
2267588f7402SMike Bayer    Column.copy(), i.e. as occurs when using columns
2268588f7402SMike Bayer    in declarative mixins.  [ticket:1967]
226940d5a32eSMike Bayer
227040d5a32eSMike Bayer  - Added a bind processor for booleans which coerces
227140d5a32eSMike Bayer    to int, for DBAPIs such as pymssql that naively call 
227240d5a32eSMike Bayer    str() on values.
2273350aed3fSMike Bayer
22744e9e0f04SMike Bayer  - CheckConstraint will copy its 'initially', 'deferrable',
22754e9e0f04SMike Bayer    and '_create_rule' attributes within a copy()/tometadata()
22764e9e0f04SMike Bayer    [ticket:2000]
22774e9e0f04SMike Bayer
2278a41c50adSMike Bayer- engine
227946ad83edSMike Bayer  - The "unicode warning" against non-unicode bind data
228046ad83edSMike Bayer    is now raised only when the
228146ad83edSMike Bayer    Unicode type is used explictly; not when 
228246ad83edSMike Bayer    convert_unicode=True is used on the engine 
228346ad83edSMike Bayer    or String type.
2284350aed3fSMike Bayer
2285a967dffbSMike Bayer  - Fixed memory leak in C version of Decimal result
2286a967dffbSMike Bayer    processor.  [ticket:1978]
2287350aed3fSMike Bayer
2288a41c50adSMike Bayer  - Implemented sequence check capability for the C 
2289a41c50adSMike Bayer    version of RowProxy, as well as 2.7 style 
2290a41c50adSMike Bayer    "collections.Sequence" registration for RowProxy.
2291a41c50adSMike Bayer    [ticket:1871]
229234cb747fSMike Bayer
22938df4dc43SMike Bayer  - Threadlocal engine methods rollback(), commit(),
22948df4dc43SMike Bayer    prepare() won't raise if no transaction is in progress;
22958df4dc43SMike Bayer    this was a regression introduced in 0.6.  [ticket:1998]
2296350aed3fSMike Bayer
22974e9e0f04SMike Bayer  - Threadlocal engine returns itself upon begin(),
22984e9e0f04SMike Bayer    begin_nested(); engine then implements contextmanager
22994e9e0f04SMike Bayer    methods to allow the "with" statement. [ticket:2004]
23004e9e0f04SMike Bayer
230134cb747fSMike Bayer- postgresql
230277f64142SMike Bayer  - Single element tuple expressions inside an IN clause
230377f64142SMike Bayer    parenthesize correctly, also from [ticket:1984]
2304350aed3fSMike Bayer
230534cb747fSMike Bayer  - Ensured every numeric, float, int code, scalar + array,
230634cb747fSMike Bayer    are recognized by psycopg2 and pg8000's "numeric" 
230734cb747fSMike Bayer    base type. [ticket:1955]
23082336b1ceSMike Bayer
23092336b1ceSMike Bayer  - Added as_uuid=True flag to the UUID type, will receive
23102336b1ceSMike Bayer    and return values as Python UUID() objects rather than
23112336b1ceSMike Bayer    strings.  Currently, the UUID type is only known to 
23122336b1ceSMike Bayer    work with psycopg2.  [ticket:1956]
2313582b1215SMike Bayer
2314582b1215SMike Bayer  - Fixed bug whereby KeyError would occur with non-ENUM 
2315582b1215SMike Bayer    supported PG versions after a pool dispose+recreate
2316582b1215SMike Bayer    would occur, [ticket:1989]
2317350aed3fSMike Bayer
2318855dbda8SMike Bayer- mysql
2319855dbda8SMike Bayer  - Fixed error handling for Jython + zxjdbc, such that 
2320855dbda8SMike Bayer    has_table() property works again.  Regression from
2321855dbda8SMike Bayer    0.6.3 (we don't have a Jython buildbot, sorry)
2322855dbda8SMike Bayer    [ticket:1960]
2323bbe3f0a2SMike Bayer
2324bbe3f0a2SMike Bayer- sqlite
2325bbe3f0a2SMike Bayer  - The REFERENCES clause in a CREATE TABLE that includes
2326d3ee4f61SMike Bayer    a remote schema to another table with the same schema 
2327d3ee4f61SMike Bayer    name now renders the remote name without
2328bbe3f0a2SMike Bayer    the schema clause, as required by SQLite.  [ticket:1851]
2329d3ee4f61SMike Bayer
2330d3ee4f61SMike Bayer  - On the same theme, the REFERENCES clause in a CREATE TABLE
2331d3ee4f61SMike Bayer    that includes a remote schema to a *different* schema
2332d3ee4f61SMike Bayer    than that of the parent table doesn't render at all,
2333d3ee4f61SMike Bayer    as cross-schema references do not appear to be supported.
2334d3ca4156SMike Bayer
233546ad83edSMike Bayer- mssql
233646ad83edSMike Bayer   - The rewrite of index reflection in [ticket:1770] was
233746ad83edSMike Bayer     unfortunately not tested correctly, and returned incorrect
233846ad83edSMike Bayer     results.   This regression is now fixed.
233946ad83edSMike Bayer
234037644a64SMike Bayer- oracle
234137644a64SMike Bayer  - The cx_oracle "decimal detection" logic, which takes place
234237644a64SMike Bayer    for for result set columns with ambiguous numeric characteristics,
234337644a64SMike Bayer    now uses the decimal point character determined by the locale/
234437644a64SMike Bayer    NLS_LANG setting, using an on-first-connect detection of 
234537644a64SMike Bayer    this character.  cx_oracle 5.0.3 or greater is also required
234637644a64SMike Bayer    when using a non-period-decimal-point NLS_LANG setting.
234737644a64SMike Bayer    [ticket:1953].
2348350aed3fSMike Bayer
23496e023b16SMike Bayer- firebird
23506e023b16SMike Bayer  - Firebird numeric type now checks for Decimal explicitly,
23516e023b16SMike Bayer    lets float() pass right through, thereby allowing 
23526e023b16SMike Bayer    special values such as float('inf'). [ticket:2012]
23536e023b16SMike Bayer
2354d3ca4156SMike Bayer- declarative
2355d3ca4156SMike Bayer  - An error is raised if __table_args__ is not in tuple
2356d3ca4156SMike Bayer    or dict format, and is not None.  [ticket:1972]
2357c848624fSMike Bayer
2358c848624fSMike Bayer- sqlsoup
2359c848624fSMike Bayer  - Added "map_to()" method to SqlSoup, which is a "master"
2360c848624fSMike Bayer    method which accepts explicit arguments for each aspect of
2361c848624fSMike Bayer    the selectable and mapping, including a base class per
2362c848624fSMike Bayer    mapping. [ticket:1975]
2363c848624fSMike Bayer
2364c848624fSMike Bayer  - Mapped selectables used with the map(), with_labels(),
2365c848624fSMike Bayer    join() methods no longer put the given argument into the
2366c848624fSMike Bayer    internal "cache" dictionary.  Particularly since the
2367c848624fSMike Bayer    join() and select() objects are created in the method
2368c848624fSMike Bayer    itself this was pretty much a pure memory leaking behavior.
236909534eafSMike Bayer
237009534eafSMike Bayer- examples
237109534eafSMike Bayer  - The versioning example now supports detection of changes
237209534eafSMike Bayer    in an associated relationship().
2373350aed3fSMike Bayer
23749674b4bfSMike Bayer0.6.5
23759674b4bfSMike Bayer=====
23769674b4bfSMike Bayer- orm
2377350aed3fSMike Bayer  - Added a new "lazyload" option "immediateload".
2378295fd901SMike Bayer    Issues the usual "lazy" load operation automatically