Mike Bayer avatar Mike Bayer committed cdd256a

turn it into a proper package.

Comments (0)

Files changed (28)

 syntax:regexp
-^build
-.*\.pyc
+^build/
+^dist/
+^docs/build/output
+.pyc$
+.orig$
+.egg-info
+.coverage

CHANGES_06

--*- coding: utf-8; fill-column: 68 -*-
-
-=======
-CHANGES
-=======
-0.6.9
-=====
-- general
-   - Adjusted the "importlater" mechanism, which is
-     used internally to resolve import cycles,
-     such that the usage of __import__ is completed
-     when the import of sqlalchemy or sqlalchemy.orm
-     is done, thereby avoiding any usage of __import__
-     after the application starts new threads,
-     fixes [ticket:2279].
-
-- orm
-  - Fixed bug whereby the source clause
-    used by query.join() would be inconsistent
-    if against a column expression that combined
-    multiple entities together.  [ticket:2197]
-
-  - [bug] fixed inappropriate evaluation of user-mapped
-    object in a boolean context within query.get()
-    [ticket:2310].
-
-  - Fixed bug apparent only in Python 3 whereby
-    sorting of persistent + pending objects during
-    flush would produce an illegal comparison,
-    if the persistent object primary key
-    is not a single integer.  [ticket:2228]
-
-  - Fixed bug where query.join() + aliased=True
-    from a joined-inh structure to itself on
-    relationship() with join condition on the child
-    table would convert the lead entity into the
-    joined one inappropriately.  [ticket:2234]
-
-  - Fixed bug whereby mapper.order_by attribute would
-    be ignored in the "inner" query within a
-    subquery eager load.  [ticket:2287].
-
-  - Fixed bug whereby if a mapped class
-    redefined __hash__() or __eq__() to something
-    non-standard, which is a supported use case
-    as SQLA should never consult these,
-    the methods would be consulted if the class
-    was part of a "composite" (i.e. non-single-entity)
-    result set.  [ticket:2215]
-
-  - Fixed subtle bug that caused SQL to blow
-    up if: column_property() against subquery +
-    joinedload + LIMIT + order by the column
-    property() occurred.  [ticket:2188].
-
-  - The join condition produced by with_parent
-    as well as when using a "dynamic" relationship
-    against a parent will generate unique
-    bindparams, rather than incorrectly repeating
-    the same bindparam.  [ticket:2207].
-
-  - Repaired the "no statement condition"
-    assertion in Query which would attempt
-    to raise if a generative method were called
-    after from_statement() were called.
-    [ticket:2199].
-
-  - Cls.column.collate("some collation") now
-    works.  [ticket:1776]
-
-  - [bug] Fixed the error formatting raised when
-    a tuple is inadvertently passed to session.query()
-    [ticket:2297].
-
-- engine
-  - Backported the fix for [ticket:2317] introduced
-    in 0.7.4, which ensures that the connection
-    is in a valid state before attempting to call
-    rollback()/prepare()/release() on savepoint
-    and two-phase transactions.
-
-- sql
-  - Fixed two subtle bugs involving column
-    correspondence in a selectable,
-    one with the same labeled subquery repeated, the other
-    when the label has been "grouped" and
-    loses itself.  Affects [ticket:2188].
-
-  - Fixed bug whereby "warn on unicode" flag
-    would get set for the String type
-    when used with certain dialects.  This
-    bug is not in 0.7.
-
-  - Fixed bug whereby with_only_columns() method of
-    Select would fail if a selectable were passed.
-    [ticket:2270].   However, the FROM behavior is
-    still incorrect here, so you need 0.7 in
-    any case for this use case to be usable.
-
-- schema
-  - Added an informative error message when
-    ForeignKeyConstraint refers to a column name in
-    the parent that is not found.
-
-- postgresql
-  - Fixed bug related to [ticket:2141] whereby the
-    same modified index behavior in PG 9 affected
-    primary key reflection on a renamed column.
-    [ticket:2291].
-
-- mysql
-  - Fixed OurSQL dialect to use ansi-neutral
-    quote symbol "'" for XA commands instead
-    of '"'.  [ticket:2186].
-
-  - a CREATE TABLE will put the COLLATE option
-    after CHARSET, which appears to be part of
-    MySQL's arbitrary rules regarding if it will actually
-    work or not.  [ticket:2225]
-
-- mssql
-  - [bug] Decode incoming values when retrieving
-    list of index names and the names of columns
-    within those indexes.  [ticket:2269]
-
-- oracle
-  - Added ORA-00028 to disconnect codes, use
-    cx_oracle _Error.code to get at the code,
-    [ticket:2200].
-
-  - repaired the oracle.RAW type which did not
-    generate the correct DDL.  [ticket:2220]
-
-  - added CURRENT to reserved word list.
-    [ticket:2212]
-
-- examples
-  - Adjusted dictlike-polymorphic.py example
-    to apply the CAST such that it works on
-    PG, other databases.  [ticket:2266]
-
-0.6.8
-=====
-- orm
-  - Calling query.get() against a column-based entity is
-    invalid, this condition now raises a deprecation warning.
-    [ticket:2144]
-
-  - a non_primary mapper will inherit the _identity_class
-    of the primary mapper.  This so that a non_primary
-    established against a class that's normally in an
-    inheritance mapping will produce results that are
-    identity-map compatible with that of the primary
-    mapper [ticket:2151]
-
-  - Backported 0.7's identity map implementation, which
-    does not use a mutex around removal.  This as some users
-    were still getting deadlocks despite the adjustments
-    in 0.6.7; the 0.7 approach that doesn't use a mutex
-    does not appear to produce "dictionary changed size"
-    issues, the original rationale for the mutex.
-    [ticket:2148]
-
-  - Fixed the error message emitted for "can't
-    execute syncrule for destination column 'q';
-    mapper 'X' does not map this column" to
-    reference the correct mapper.  [ticket:2163].
-
-  - Fixed bug where determination of "self referential"
-    relationship would fail with no workaround
-    for joined-inh subclass related to itself,
-    or joined-inh subclass related to a subclass
-    of that with no cols in the sub-sub class
-    in the join condition.  [ticket:2149]
-
-  - mapper() will ignore non-configured foreign keys
-    to unrelated tables when determining inherit
-    condition between parent and child class.
-    This is equivalent to behavior already
-    applied to declarative.  Note that 0.7 has a
-    more comprehensive solution to this, altering
-    how join() itself determines an FK error.
-    [ticket:2153]
-
-  - Fixed bug whereby mapper mapped to an anonymous
-    alias would fail if logging were used, due to
-    unescaped % sign in the alias name.  [ticket:2171]
-
-  - Modify the text of the message which occurs
-    when the "identity" key isn't detected on
-    flush, to include the common cause that
-    the Column isn't set up to detect
-    auto-increment correctly; [ticket:2170].
-
-  - Fixed bug where transaction-level "deleted"
-    collection wouldn't be cleared of expunged
-    states, raising an error if they later
-    became transient [ticket:2182].
-
-- sql
-  - Fixed bug whereby if FetchedValue was passed
-    to column server_onupdate, it would not
-    have its parent "column" assigned, added
-    test coverage for all column default assignment
-    patterns.  [ticket:2147]
-
-  - Fixed bug whereby nesting a label of a select()
-    with another label in it would produce incorrect
-    exported columns.   Among other things this would
-    break an ORM column_property() mapping against
-    another column_property().  [ticket:2167].
-
-- engine
-  - Adjusted the __contains__() method of
-    a RowProxy result row such that no exception
-    throw is generated internally;
-    NoSuchColumnError() also will generate its
-    message regardless of whether or not the column
-    construct can be coerced to a string.
-    [ticket:2178].
-
-- postgresql
-
-  - Fixed bug affecting PG 9 whereby index reflection
-    would fail if against a column whose name
-    had changed.  [ticket:2141].
-
-  - Some unit test fixes regarding numeric arrays,
-    MATCH operator.   A potential floating-point
-    inaccuracy issue was fixed, and certain tests
-    of the MATCH operator only execute within an
-    EN-oriented locale for now.  [ticket:2175].
-
-- mssql
-  - Fixed bug in MSSQL dialect whereby the aliasing
-    applied to a schema-qualified table would leak
-    into enclosing select statements [ticket:2169].
-
-  - Fixed bug whereby DATETIME2 type would fail on
-    the "adapt" step when used in result sets or
-    bound parameters.  This issue is not in 0.7.
-    [ticket:2159]
-
-0.6.7
-=====
-- orm
-  - Tightened the iterate vs. remove mutex around the
-    identity map iteration, attempting to reduce the
-    chance of an (extremely rare) reentrant gc operation
-    causing a deadlock.  Might remove the mutex in
-    0.7.  [ticket:2087]
-
-  - Added a `name` argument to `Query.subquery()`, to allow
-    a fixed name to be assigned to the alias object.
-    [ticket:2030]
-
-  - A warning is emitted when a joined-table inheriting mapper
-    has no primary keys on the locally mapped table
-    (but has pks on the superclass table).  [ticket:2019]
-
-  - Fixed bug where "middle" class in a polymorphic hierarchy
-    would have no 'polymorphic_on' column if it didn't also
-    specify a 'polymorphic_identity', leading to strange
-    errors upon refresh, wrong class loaded when querying
-    from that target. Also emits the correct WHERE criterion
-    when using single table inheritance. [ticket:2038]
-
- - Fixed bug where a column with a SQL or server side default
-   that was excluded from a mapping with include_properties
-   or exclude_properties would result in UnmappedColumnError.
-   [ticket:1995]
-
-  - A warning is emitted in the unusual case that an
-    append or similar event on a collection occurs after
-    the parent object has been dereferenced, which
-    prevents the parent from being marked as "dirty"
-    in the session.  This will be an exception in 0.7.
-    [ticket:2046]
-
-  - Fixed bug in query.options() whereby a path
-    applied to a lazyload using string keys could
-    overlap a same named attribute on the wrong
-    entity.  Note 0.7 has an updated version of this
-    fix.  [ticket:2098]
-
-  - Reworded the exception raised when a flush
-    is attempted of a subclass that is not polymorphic
-    against the supertype.  [ticket:2063]
-
-  - Some fixes to the state handling regarding
-    backrefs, typically when autoflush=False, where
-    the back-referenced collection wouldn't
-    properly handle add/removes with no net
-    change.  Thanks to Richard Murri for the
-    test case + patch.  [ticket:2123]
-
-  - a "having" clause would be copied from the
-    inside to the outside query if from_self()
-    were used. [ticket:2130].
-
-- sql
-  - Column.copy(), as used in table.tometadata(), copies the
-    'doc' attribute.  [ticket:2028]
-
-  - Added some defs to the resultproxy.c extension so that
-    the extension compiles and runs on Python 2.4.
-    [ticket:2023]
-
-  - The compiler extension now supports overriding the default
-    compilation of expression._BindParamClause including that
-    the auto-generated binds within the VALUES/SET clause
-    of an insert()/update() statement will also use the new
-    compilation rules. [ticket:2042]
-
-  - Added accessors to ResultProxy "returns_rows", "is_insert"
-    [ticket:2089]
-
-  - The limit/offset keywords to select() as well
-    as the value passed to select.limit()/offset()
-    will be coerced to integer.  [ticket:2116]
-
-- engine
-  - Fixed bug in QueuePool, SingletonThreadPool whereby
-    connections that were discarded via overflow or periodic
-    cleanup() were not explicitly closed, leaving garbage
-    collection to the task instead.   This generally only
-    affects non-reference-counting backends like Jython
-    and Pypy.  Thanks to Jaimy Azle for spotting
-    this.  [ticket:2102]
-
-- sqlite
-  - Fixed bug where reflection of foreign key
-    created as "REFERENCES <tablename>" without
-    col name would fail.  [ticket:2115]
-
-- postgresql
-  - When explicit sequence execution derives the name
-    of the auto-generated sequence of a SERIAL column,
-    which currently only occurs if implicit_returning=False,
-    now accommodates if the table + column name is greater
-    than 63 characters using the same logic Postgresql uses.
-    [ticket:1083]
-
-  - Added an additional libpq message to the list of "disconnect"
-    exceptions, "could not receive data from server"
-    [ticket:2044]
-
-  - Added RESERVED_WORDS for postgresql dialect. [ticket:2092]
-
-  - Fixed the BIT type to allow a "length" parameter, "varying"
-    parameter.  Reflection also fixed.  [ticket:2073]
-
-- informix
-
-  - Added RESERVED_WORDS informix dialect. [ticket:2092]
-
-- mssql
-  - Rewrote the query used to get the definition of a view,
-    typically when using the Inspector interface, to
-    use sys.sql_modules instead of the information schema,
-    thereby allowing views definitions longer than 4000
-    characters to be fully returned.  [ticket:2071]
-
-- mysql
-  - oursql dialect accepts the same "ssl" arguments in
-    create_engine() as that of MySQLdb.  [ticket:2047]
-
-- firebird
-  - The "implicit_returning" flag on create_engine() is
-    honored if set to False.  [ticket:2083]
-
-- oracle
-  - Using column names that would require quotes
-    for the column itself or for a name-generated
-    bind parameter, such as names with special
-    characters, underscores, non-ascii characters,
-    now properly translate bind parameter keys when
-    talking to cx_oracle.  [ticket:2100]
-
-  - Oracle dialect adds use_binds_for_limits=False
-    create_engine() flag, will render the LIMIT/OFFSET
-    values inline instead of as binds, reported to
-    modify the execution plan used by Oracle.
-    [ticket:2116]
-
-- ext
-  - The horizontal_shard ShardedSession class accepts the common
-    Session argument "query_cls" as a constructor argument,
-    to enable further subclassing of ShardedQuery.
-    [ticket:2090]
-
-- declarative
-  - Added an explicit check for the case that the name
-    'metadata' is used for a column attribute on a
-    declarative class. [ticket:2050]
-
-  - Fix error message referencing old @classproperty
-    name to reference @declared_attr [ticket:2061]
-
-  - Arguments in __mapper_args__ that aren't "hashable"
-    aren't mistaken for always-hashable, possibly-column
-    arguments.  [ticket:2091]
-
-- documentation
-  - Documented SQLite DATE/TIME/DATETIME types.
-    [ticket:2029]
-
-- examples
-  - The Beaker caching example allows a "query_cls" argument
-    to the query_callable() function.  [ticket:2090]
-
-0.6.6
-=====
-- orm
-  - Fixed bug whereby a non-"mutable" attribute modified event
-    which occurred on an object that was clean except for
-    preceding mutable attribute changes would fail to strongly
-    reference itself in the identity map. This would cause the
-    object to be garbage collected, losing track of any changes
-    that weren't previously saved in the "mutable changes"
-    dictionary.
-
-  - Fixed bug whereby "passive_deletes='all'" wasn't passing
-    the correct symbols to lazy loaders during flush, thereby
-    causing an unwarranted load.  [ticket:2013]
-
-  - Fixed bug which prevented composite mapped
-    attributes from being used on a mapped select statement.
-    [ticket:1997]. Note the workings of composite are slated to
-    change significantly in 0.7.
-
-  - active_history flag also added to composite().
-    The flag has no effect in 0.6, but is instead
-    a placeholder flag for forwards compatibility,
-    as it applies in 0.7 for composites.
-    [ticket:1976]
-
-  - Fixed uow bug whereby expired objects passed to
-    Session.delete() would not have unloaded references
-    or collections taken into account when deleting
-    objects, despite passive_deletes remaining at
-    its default of False.  [ticket:2002]
-
-  - A warning is emitted when version_id_col is specified
-    on an inheriting mapper when the inherited mapper
-    already has one, if those column expressions are not
-    the same.  [ticket:1987]
-
-  - "innerjoin" flag doesn't take effect along the chain
-    of joinedload() joins if a previous join in that chain
-    is an outer join, thus allowing primary rows without
-    a referenced child row to be correctly returned
-    in results.  [ticket:1954]
-
-  - Fixed bug regarding "subqueryload" strategy whereby
-    strategy would fail if the entity was an aliased()
-    construct.  [ticket:1964]
-
-  - Fixed bug regarding "subqueryload" strategy whereby
-    the join would fail if using a multi-level load
-    of the form from A->joined-subclass->C [ticket:2014]
-
-  - Fixed indexing of Query objects by -1. It was erroneously
-    transformed to the empty slice -1:0 that resulted in
-    IndexError. [ticket:1968]
-
-  - The mapper argument "primary_key" can be passed as a
-    single column as well as a list or tuple.  [ticket:1971]
-    The documentation examples that illustrated it as a
-    scalar value have been changed to lists.
-
-  - Added active_history flag to relationship()
-    and column_property(), forces attribute events to
-    always load the "old" value, so that it's available to
-    attributes.get_history(). [ticket:1961]
-
-  - Query.get() will raise if the number of params
-    in a composite key is too large, as well as too
-    small. [ticket:1977]
-
-  - Backport of "optimized get" fix from 0.7,
-    improves the generation of joined-inheritance
-    "load expired row" behavior.  [ticket:1992]
-
-  - A little more verbiage to the "primaryjoin" error,
-    in an unusual condition that the join condition
-    "works" for viewonly but doesn't work for non-viewonly,
-    and foreign_keys wasn't used - adds "foreign_keys" to
-    the suggestion.  Also add "foreign_keys" to the
-    suggestion for the generic "direction" error.
-
-- sql
-  - Fixed operator precedence rules for multiple
-    chains of a single non-associative operator.
-    I.e. "x - (y - z)" will compile as "x - (y - z)"
-    and not "x - y - z".  Also works with labels,
-    i.e. "x - (y - z).label('foo')"
-    [ticket:1984]
-
-  - The 'info' attribute of Column is copied during
-    Column.copy(), i.e. as occurs when using columns
-    in declarative mixins.  [ticket:1967]
-
-  - Added a bind processor for booleans which coerces
-    to int, for DBAPIs such as pymssql that naively call
-    str() on values.
-
-  - CheckConstraint will copy its 'initially', 'deferrable',
-    and '_create_rule' attributes within a copy()/tometadata()
-    [ticket:2000]
-
-- engine
-  - The "unicode warning" against non-unicode bind data
-    is now raised only when the
-    Unicode type is used explictly; not when
-    convert_unicode=True is used on the engine
-    or String type.
-
-  - Fixed memory leak in C version of Decimal result
-    processor.  [ticket:1978]
-
-  - Implemented sequence check capability for the C
-    version of RowProxy, as well as 2.7 style
-    "collections.Sequence" registration for RowProxy.
-    [ticket:1871]
-
-  - Threadlocal engine methods rollback(), commit(),
-    prepare() won't raise if no transaction is in progress;
-    this was a regression introduced in 0.6.  [ticket:1998]
-
-  - Threadlocal engine returns itself upon begin(),
-    begin_nested(); engine then implements contextmanager
-    methods to allow the "with" statement. [ticket:2004]
-
-- postgresql
-  - Single element tuple expressions inside an IN clause
-    parenthesize correctly, also from [ticket:1984]
-
-  - Ensured every numeric, float, int code, scalar + array,
-    are recognized by psycopg2 and pg8000's "numeric"
-    base type. [ticket:1955]
-
-  - Added as_uuid=True flag to the UUID type, will receive
-    and return values as Python UUID() objects rather than
-    strings.  Currently, the UUID type is only known to
-    work with psycopg2.  [ticket:1956]
-
-  - Fixed bug whereby KeyError would occur with non-ENUM
-    supported PG versions after a pool dispose+recreate
-    would occur, [ticket:1989]
-
-- mysql
-  - Fixed error handling for Jython + zxjdbc, such that
-    has_table() property works again.  Regression from
-    0.6.3 (we don't have a Jython buildbot, sorry)
-    [ticket:1960]
-
-- sqlite
-  - The REFERENCES clause in a CREATE TABLE that includes
-    a remote schema to another table with the same schema
-    name now renders the remote name without
-    the schema clause, as required by SQLite.  [ticket:1851]
-
-  - On the same theme, the REFERENCES clause in a CREATE TABLE
-    that includes a remote schema to a *different* schema
-    than that of the parent table doesn't render at all,
-    as cross-schema references do not appear to be supported.
-
-- mssql
-   - The rewrite of index reflection in [ticket:1770] was
-     unfortunately not tested correctly, and returned incorrect
-     results.   This regression is now fixed.
-
-- oracle
-  - The cx_oracle "decimal detection" logic, which takes place
-    for for result set columns with ambiguous numeric characteristics,
-    now uses the decimal point character determined by the locale/
-    NLS_LANG setting, using an on-first-connect detection of
-    this character.  cx_oracle 5.0.3 or greater is also required
-    when using a non-period-decimal-point NLS_LANG setting.
-    [ticket:1953].
-
-- firebird
-  - Firebird numeric type now checks for Decimal explicitly,
-    lets float() pass right through, thereby allowing
-    special values such as float('inf'). [ticket:2012]
-
-- declarative
-  - An error is raised if __table_args__ is not in tuple
-    or dict format, and is not None.  [ticket:1972]
-
-- sqlsoup
-  - Added "map_to()" method to SqlSoup, which is a "master"
-    method which accepts explicit arguments for each aspect of
-    the selectable and mapping, including a base class per
-    mapping. [ticket:1975]
-
-  - Mapped selectables used with the map(), with_labels(),
-    join() methods no longer put the given argument into the
-    internal "cache" dictionary.  Particularly since the
-    join() and select() objects are created in the method
-    itself this was pretty much a pure memory leaking behavior.
-
-- examples
-  - The versioning example now supports detection of changes
-    in an associated relationship().
-
-0.6.5
-=====
-- orm
-  - Added a new "lazyload" option "immediateload".
-    Issues the usual "lazy" load operation automatically
-    as the object is populated.   The use case
-    here is when loading objects to be placed in
-    an offline cache, or otherwise used after
-    the session isn't available, and straight 'select'
-    loading, not 'joined' or 'subquery', is desired.
-    [ticket:1914]
-
-  - New Query methods: query.label(name), query.as_scalar(),
-    return the query's statement as a scalar subquery
-    with /without label [ticket:1920];
-    query.with_entities(*ent), replaces the SELECT list of
-    the query with new entities.
-    Roughly equivalent to a generative form of query.values()
-    which accepts mapped entities as well as column
-    expressions.
-
-  - Fixed recursion bug which could occur when moving
-    an object from one reference to another, with
-    backrefs involved, where the initiating parent
-    was a subclass (with its own mapper) of the
-    previous parent.
-
-  - Fixed a regression in 0.6.4 which occurred if you
-    passed an empty list to "include_properties" on
-    mapper() [ticket:1918]
-
-  - Fixed labeling bug in Query whereby the NamedTuple
-    would mis-apply labels if any of the column
-    expressions were un-labeled.
-
-  - Patched a case where query.join() would adapt the
-    right side to the right side of the left's join
-    inappropriately [ticket:1925]
-
-  - Query.select_from() has been beefed up to help
-    ensure that a subsequent call to query.join()
-    will use the select_from() entity, assuming it's
-    a mapped entity and not a plain selectable,
-    as the default "left" side, not the first entity
-    in the Query object's list of entities.
-
-  - The exception raised by Session when it is used
-    subsequent to a subtransaction rollback (which is what
-    happens when a flush fails in autocommit=False mode) has
-    now been reworded (this is the "inactive due to a
-    rollback in a subtransaction" message). In particular,
-    if the rollback was due to an exception during flush(),
-    the message states this is the case, and reiterates the
-    string form of the original exception that occurred
-    during flush. If the session is closed due to explicit
-    usage of subtransactions (not very common), the message
-    just states this is the case.
-
-  - The exception raised by Mapper when repeated requests to
-    its initialization are made after initialization already
-    failed no longer assumes the "hasattr" case, since
-    there's other scenarios in which this message gets
-    emitted, and the message also does not compound onto
-    itself multiple times - you get the same message for
-    each attempt at usage. The misnomer "compiles" is being
-    traded out for "initialize".
-
-  - Fixed bug in query.update() where 'evaluate' or 'fetch'
-    expiration would fail if the column expression key was
-    a class attribute with a different keyname as the
-    actual column name.  [ticket:1935]
-
-  - Added an assertion during flush which ensures
-    that no NULL-holding identity keys were generated
-    on "newly persistent" objects.
-    This can occur when user defined code inadvertently
-    triggers flushes on not-fully-loaded objects.
-
-  - lazy loads for relationship attributes now use
-    the current state, not the "committed" state,
-    of foreign and primary key attributes
-    when issuing SQL, if a flush is not in process.
-    Previously, only the database-committed state would
-    be used.  In particular, this would cause a many-to-one
-    get()-on-lazyload operation to fail, as autoflush
-    is not triggered on these loads when the attributes are
-    determined and the "committed" state may not be
-    available.  [ticket:1910]
-
-  - A new flag on relationship(), load_on_pending, allows
-    the lazy loader to fire off on pending objects without a
-    flush taking place, as well as a transient object that's
-    been manually "attached" to the session. Note that this
-    flag blocks attribute events from taking place when an
-    object is loaded, so backrefs aren't available until
-    after a flush. The flag is only intended for very
-    specific use cases.
-
-  - Another new flag on relationship(), cascade_backrefs,
-    disables the "save-update" cascade when the event was
-    initiated on the "reverse" side of a bidirectional
-    relationship.   This is a cleaner behavior so that
-    many-to-ones can be set on a transient object without
-    it getting sucked into the child object's session,
-    while still allowing the forward collection to
-    cascade.   We *might* default this to False in 0.7.
-
-  - Slight improvement to the behavior of
-    "passive_updates=False" when placed only on the
-    many-to-one side of a relationship; documentation has
-    been clarified that passive_updates=False should really
-    be on the one-to-many side.
-
-  - Placing passive_deletes=True on a many-to-one emits
-    a warning, since you probably intended to put it on
-    the one-to-many side.
-
-  - Fixed bug that would prevent "subqueryload" from
-    working correctly with single table inheritance
-    for a relationship from a subclass - the "where
-    type in (x, y, z)" only gets placed on the inside,
-    instead of repeatedly.
-
-  - When using from_self() with single table inheritance,
-    the "where type in (x, y, z)" is placed on the outside
-    of the query only, instead of repeatedly.   May make
-    some more adjustments to this.
-
-  - scoped_session emits a warning when configure() is
-    called if a Session is already present (checks only the
-    current thread) [ticket:1924]
-
-  - reworked the internals of mapper.cascade_iterator() to
-    cut down method calls by about 9% in some circumstances.
-    [ticket:1932]
-
-- sql
-   - Fixed bug in TypeDecorator whereby the dialect-specific
-     type was getting pulled in to generate the DDL for a
-     given type, which didn't always return the correct result.
-
-   - TypeDecorator can now have a fully constructed type
-     specified as its "impl", in addition to a type class.
-
-   - TypeDecorator will now place itself as the resulting
-     type for a binary expression where the type coercion
-     rules would normally return its impl type - previously,
-     a copy of the impl type would be returned which would
-     have the TypeDecorator embedded into it as the "dialect"
-     impl, this was probably an unintentional way of achieving
-     the desired effect.
-
-   - TypeDecorator.load_dialect_impl() returns "self.impl" by
-     default, i.e. not the dialect implementation type of
-     "self.impl".   This to support compilation correctly.
-     Behavior can be user-overridden in exactly the same way
-     as before to the same effect.
-
-   - Added type_coerce(expr, type_) expression element.
-     Treats the given expression as the given type when evaluating
-     expressions and processing result rows, but does not
-     affect the generation of SQL, other than an anonymous
-     label.
-
-   - Table.tometadata() now copies Index objects associated
-     with the Table as well.
-
-   - Table.tometadata() issues a warning if the given Table
-     is already present in the target MetaData - the existing
-     Table object is returned.
-
-   - An informative error message is raised if a Column
-     which has not yet been assigned a name, i.e. as in
-     declarative, is used in a context where it is
-     exported to the columns collection of an enclosing
-     select() construct, or if any construct involving
-     that column is compiled before its name is
-     assigned.
-
-   - as_scalar(), label() can be called on a selectable
-     which contains a Column that is not yet named.
-     [ticket:1862]
-
-   - Fixed recursion overflow which could occur when operating
-     with two expressions both of type "NullType", but
-     not the singleton NULLTYPE instance. [ticket:1907]
-
-- declarative
-   - @classproperty (soon/now @declared_attr) takes effect for
-     __mapper_args__, __table_args__, __tablename__ on
-     a base class that is not a mixin, as well as mixins.
-     [ticket:1922]
-
-   - @classproperty 's official name/location for usage
-     with declarative is sqlalchemy.ext.declarative.declared_attr.
-     Same thing, but moving there since it is more of a
-     "marker" that's specific to declararative,
-     not just an attribute technique.  [ticket:1915]
-
-   - Fixed bug whereby columns on a mixin wouldn't propagate
-     correctly to a single-table, or joined-table,
-     inheritance scheme where the attribute name is
-     different than that of the column. [ticket:1930],
-     [ticket:1931].
-
-   - A mixin can now specify a column that overrides
-     a column of the same name associated with a superclass.
-     Thanks to Oystein Haaland.
-
-- engine
-
-   - Fixed a regression in 0.6.4 whereby the change that
-     allowed cursor errors to be raised consistently broke
-     the result.lastrowid accessor.   Test coverage has
-     been added for result.lastrowid.   Note that lastrowid
-     is only supported by Pysqlite and some MySQL drivers,
-     so isn't super-useful in the general case.
-
-   - the logging message emitted by the engine when
-     a connection is first used is now "BEGIN (implicit)"
-     to emphasize that DBAPI has no explicit begin().
-
-   - added "views=True" option to metadata.reflect(),
-     will add the list of available views to those
-     being reflected.  [ticket:1936]
-
-   - engine_from_config() now accepts 'debug' for
-     'echo', 'echo_pool', 'force' for 'convert_unicode',
-     boolean values for 'use_native_unicode'.
-     [ticket:1899]
-
-- postgresql
-   - Added "as_tuple" flag to ARRAY type, returns results
-     as tuples instead of lists to allow hashing.
-
-   - Fixed bug which prevented "domain" built from a
-     custom type such as "enum" from being reflected.
-     [ticket:1933]
-
-- mysql
-   - Fixed bug involving reflection of CURRENT_TIMESTAMP
-     default used with ON UPDATE clause, thanks to
-     Taavi Burns [ticket:1940]
-
-- oracle
-   - The implicit_retunring argument to create_engine()
-     is now honored regardless of detected version of
-     Oracle.  Previously, the flag would be forced
-     to False if server version info was < 10.
-     [ticket:1878]
-
-- mssql
-   - Fixed reflection bug which did not properly handle
-     reflection of unknown types.  [ticket:1946]
-
-   - Fixed bug where aliasing of tables with "schema" would
-     fail to compile properly.  [ticket:1943]
-
-   - Rewrote the reflection of indexes to use sys.
-     catalogs, so that column names of any configuration
-     (spaces, embedded commas, etc.) can be reflected.
-     Note that reflection of indexes requires SQL
-     Server 2005 or greater.  [ticket:1770]
-
-   - mssql+pymssql dialect now honors the "port" portion
-     of the URL instead of discarding it.  [ticket:1952]
-
-- informix
-   - *Major* cleanup / modernization of the Informix
-     dialect for 0.6, courtesy Florian Apolloner.
-     [ticket:1906]
-
-- tests
-   - the NoseSQLAlchemyPlugin has been moved to a
-     new package "sqlalchemy_nose" which installs
-     along with "sqlalchemy".  This so that the "nosetests"
-     script works as always but also allows the
-     --with-coverage option to turn on coverage before
-     SQLAlchemy modules are imported, allowing coverage
-     to work correctly.
-
-- misc
-   - CircularDependencyError now has .cycles and .edges
-     members, which are the set of elements involved in
-     one or more cycles, and the set of edges as 2-tuples.
-     [ticket:1890]
-
-0.6.4
-=====
-- orm
-  - The name ConcurrentModificationError has been
-    changed to StaleDataError, and descriptive
-    error messages have been revised to reflect
-    exactly what the issue is.   Both names will
-    remain available for the forseeable future
-    for schemes that may be specifying
-    ConcurrentModificationError in an "except:"
-    clause.
-
-  - Added a mutex to the identity map which mutexes
-    remove operations against iteration methods,
-    which now pre-buffer before returning an
-    iterable.   This because asyncrhonous gc
-    can remove items via the gc thread at any time.
-    [ticket:1891]
-
-  - The Session class is now present in sqlalchemy.orm.*.
-    We're moving away from the usage of create_session(),
-    which has non-standard defaults, for those situations
-    where a one-step Session constructor is desired. Most
-    users should stick with sessionmaker() for general use,
-    however.
-
-  - query.with_parent() now accepts transient objects
-    and will use the non-persistent values of their pk/fk
-    attributes in order to formulate the criterion.
-    Docs are also clarified as to the purpose of with_parent().
-
-  - The include_properties and exclude_properties arguments
-    to mapper() now accept Column objects as members in
-    addition to strings.  This so that same-named Column
-    objects, such as those within a join(), can be
-    disambiguated.
-
-  - A warning is now emitted if a mapper is created against a
-    join or other single selectable that includes multiple
-    columns with the same name in its .c. collection,
-    and those columns aren't explictly named as part of
-    the same or separate attributes (or excluded).
-    In 0.7 this warning will be an exception.   Note that
-    this warning is not emitted when the combination occurs
-    as a result of inheritance, so that attributes
-    still allow being overridden naturally.
-    [ticket:1896].  In 0.7 this will be improved further.
-
-  - The primary_key argument to mapper() can now specify
-    a series of columns that are only a subset of
-    the calculated "primary key" columns of the mapped
-    selectable, without an error being raised.  This
-    helps for situations where a selectable's effective
-    primary key is simpler than the number of columns
-    in the selectable that are actually marked as
-    "primary_key", such as a join against two
-    tables on their primary key columns [ticket:1896].
-
-  - An object that's been deleted now gets a flag
-    'deleted', which prohibits the object from
-    being re-add()ed to the session, as previously
-    the object would live in the identity map
-    silently until its attributes were accessed.
-    The make_transient() function now resets this
-    flag along with the "key" flag.
-
-  - make_transient() can be safely called on an
-    already transient instance.
-
-  - a warning is emitted in mapper() if the polymorphic_on
-    column is not present either in direct or derived
-    form in the mapped selectable or in the
-    with_polymorphic selectable, instead of silently
-    ignoring it.  Look for this to become an
-    exception in 0.7.
-
-  - Another pass through the series of error messages
-    emitted when relationship() is configured with
-    ambiguous arguments.   The "foreign_keys"
-    setting is no longer mentioned, as it is almost
-    never needed and it is preferable users set up
-    correct ForeignKey metadata, which is now the
-    recommendation.  If 'foreign_keys'
-    is used and is incorrect, the message suggests
-    the attribute is probably unnecessary.  Docs
-    for the attribute are beefed up.  This
-    because all confused relationship() users on the
-    ML appear to be attempting to use foreign_keys
-    due to the message, which only confuses them
-    further since Table metadata is much clearer.
-
-  - If the "secondary" table has no ForeignKey metadata
-    and no foreign_keys is set, even though the
-    user is passing screwed up information, it is assumed
-    that primary/secondaryjoin expressions should
-    consider only and all cols in "secondary" to be
-    foreign.  It's not possible with "secondary" for
-    the foreign keys to be elsewhere in any case.
-    A warning is now emitted instead of an error,
-    and the mapping succeeds. [ticket:1877]
-
-  - Moving an o2m object from one collection to
-    another, or vice versa changing the referenced
-    object by an m2o, where the foreign key is also a
-    member of the primary key, will now be more
-    carefully checked during flush if the change in
-    value of the foreign key on the "many" side is the
-    result of a change in the primary key of the "one"
-    side, or if the "one" is just a different object.
-    In one case, a cascade-capable DB would have
-    cascaded the value already and we need to look at
-    the "new" PK value to do an UPDATE, in the other we
-    need to continue looking at the "old". We now look
-    at the "old", assuming passive_updates=True,
-    unless we know it was a PK switch that
-    triggered the change. [ticket:1856]
-
-  - The value of version_id_col can be changed
-    manually, and this will result in an UPDATE
-    of the row.  Versioned UPDATEs and DELETEs
-    now use the "committed" value of the
-    version_id_col in the WHERE clause and
-    not the pending changed value. The
-    version generator is also bypassed if
-    manual changes are present on the attribute.
-    [ticket:1857]
-
-  - Repaired the usage of merge() when used with
-    concrete inheriting mappers.  Such mappers frequently
-    have so-called "concrete" attributes, which are
-    subclass attributes that "disable" propagation from
-    the parent - these needed to allow a merge()
-    operation to pass through without effect.
-
-  - Specifying a non-column based argument
-    for column_mapped_collection, including string,
-    text() etc., will raise an error message that
-    specifically asks for a column element, no longer
-    misleads with incorrect information about
-    text() or literal().  [ticket:1863]
-
-  - Similarly, for relationship(), foreign_keys,
-    remote_side, order_by - all column-based
-    expressions are enforced - lists of strings
-    are explicitly disallowed since this is a
-    very common error
-
-  - Dynamic attributes don't support collection
-    population - added an assertion for when
-    set_committed_value() is called, as well as
-    when joinedload() or subqueryload() options
-    are applied to a dynamic attribute, instead
-    of failure / silent failure.  [ticket:1864]
-
-  - Fixed bug whereby generating a Query derived
-    from one which had the same column repeated
-    with different label names, typically
-    in some UNION situations, would fail to
-    propagate the inner columns completely to
-    the outer query.  [ticket:1852]
-
-  - object_session() raises the proper
-    UnmappedInstanceError when presented with an
-    unmapped instance.  [ticket:1881]
-
-  - Applied further memoizations to calculated Mapper
-    properties, with significant (~90%) runtime mapper.py
-    call count reduction in heavily polymorphic mapping
-    configurations.
-
-  - mapper _get_col_to_prop private method used
-    by the versioning example is deprecated;
-    now use mapper.get_property_by_column() which
-    will remain the public method for this.
-
-  - the versioning example works correctly now
-    if versioning on a col that was formerly
-    NULL.
-
-- sql
-  - Calling execute() on an alias() construct is pending
-    deprecation for 0.7, as it is not itself an
-    "executable" construct. It currently "proxies" its
-    inner element and is conditionally "executable" but
-    this is not the kind of ambiguity we like these days.
-
-  - The execute() and scalar() methods of ClauseElement
-    are now moved appropriately to the Executable
-    subclass. ClauseElement.execute()/ scalar() are still
-    present and are pending deprecation in 0.7, but note
-    these would always raise an error anyway if you were
-    not an Executable (unless you were an alias(), see
-    previous note).
-
-  - Added basic math expression coercion for
-    Numeric->Integer,
-    so that resulting type is Numeric regardless
-    of the direction of the expression.
-
-  - Changed the scheme used to generate truncated
-    "auto" index names when using the "index=True"
-    flag on Column.   The truncation only takes
-    place with the auto-generated name, not one
-    that is user-defined (an error would be
-    raised instead), and the truncation scheme
-    itself is now based on a fragment of an md5
-    hash of the identifier name, so that multiple
-    indexes on columns with similar names still
-    have unique names.  [ticket:1855]
-
-  - The generated index name also is based on
-    a "max index name length" attribute which is
-    separate from the "max identifier length" -
-    this to appease MySQL who has a max length
-    of 64 for index names, separate from their
-    overall max length of 255.  [ticket:1412]
-
-  - the text() construct, if placed in a column
-    oriented situation, will at least return NULLTYPE
-    for its type instead of None, allowing it to
-    be used a little more freely for ad-hoc column
-    expressions than before.   literal_column()
-    is still the better choice, however.
-
-  - Added full description of parent table/column,
-    target table/column in error message raised when
-    ForeignKey can't resolve target.
-
-  - Fixed bug whereby replacing composite foreign key
-    columns in a reflected table would cause an attempt
-    to remove the reflected constraint from the table
-    a second time, raising a KeyError.  [ticket:1865]
-
-  - the _Label construct, i.e. the one that is produced
-    whenever you say somecol.label(), now counts itself
-    in its "proxy_set" unioned with that of it's
-    contained column's proxy set, instead of
-    directly returning that of the contained column.
-    This allows column correspondence
-    operations which depend on the identity of the
-    _Labels themselves to return the correct result
-    - fixes ORM bug [ticket:1852].
-
-- engine
-
-  - Calling fetchone() or similar on a result that
-    has already been exhausted, has been closed,
-    or is not a result-returning result now
-    raises ResourceClosedError, a subclass of
-    InvalidRequestError, in all cases, regardless
-    of backend.  Previously, some DBAPIs would
-    raise ProgrammingError (i.e. pysqlite), others
-    would return None leading to downstream breakages
-    (i.e. MySQL-python).
-
-  - Fixed bug in Connection whereby if a "disconnect"
-    event occurred in the "initialize" phase of the
-    first connection pool connect, an AttributeError
-    would be raised when the Connection would attempt
-    to invalidate the DBAPI connection.  [ticket:1894]
-
-  - Connection, ResultProxy, as well as Session use
-    ResourceClosedError for all "this
-    connection/transaction/result is closed" types of
-    errors.
-
-  - Connection.invalidate() can be called more than
-    once and subsequent calls do nothing.
-
-- declarative
-  - if @classproperty is used with a regular class-bound
-    mapper property attribute, it will be called to get the
-    actual attribute value during initialization. Currently,
-    there's no advantage to using @classproperty on a column
-    or relationship attribute of a declarative class that
-    isn't a mixin - evaluation is at the same time as if
-    @classproperty weren't used. But here we at least allow
-    it to function as expected.
-
-  - Fixed bug where "Can't add additional column" message
-    would display the wrong name.
-
-- postgresql
-  - Fixed the psycopg2 dialect to use its
-    set_isolation_level() method instead of relying
-    upon the base "SET SESSION ISOLATION" command,
-    as psycopg2 resets the isolation level on each new
-    transaction otherwise.
-
-- mssql
-  - Fixed "default schema" query to work with
-    pymssql backend.
-
-- firebird
-  - Fixed bug whereby a column default would fail to
-    reflect if the "default" keyword were lower case.
-
-- oracle
-  - Added ROWID type to the Oracle dialect, for those
-    cases where an explicit CAST might be needed.
-    [ticket:1879]
-
-  - Oracle reflection of indexes has been tuned so
-    that indexes which include some or all primary
-    key columns, but not the same set of columns
-    as that of the primary key, are reflected.
-    Indexes which contain the identical columns
-    as that of the primary key are skipped within
-    reflection, as the index in that case is assumed
-    to be the auto-generated primary key index.
-    Previously, any index with PK columns present
-    would be skipped.  Thanks to Kent Bower
-    for the patch.  [ticket:1867]
-
-  - Oracle now reflects the names of primary key
-    constraints - also thanks to Kent Bower.
-    [ticket:1868]
-
-- informix
-  - Applied patches from [ticket:1904] to get
-    basic Informix functionality up again.  We
-    rely upon end-user testing to ensure that
-    Informix is working to some degree.
-
-- documentation
-  - The docs have been reorganized such that the "API
-    Reference" section is gone - all the docstrings from
-    there which were public API are moved into the
-    context of the main doc section that talks about it.
-    Main docs divided into "SQLAlchemy Core" and
-    "SQLAlchemy ORM" sections, mapper/relationship docs
-    have been broken out. Lots of sections rewritten
-    and/or reorganized.
-
-- examples
-  - The beaker_caching example has been reorgnized
-    such that the Session, cache manager,
-    declarative_base are part of environment, and
-    custom cache code is portable and now within
-    "caching_query.py".  This allows the example to
-    be easier to "drop in" to existing projects.
-
-  - the history_meta versioning recipe sets "unique=False"
-    when copying columns, so that the versioning
-    table handles multiple rows with repeating values.
-    [ticket:1887]
-
-0.6.3
-=====
-- orm
-  - Removed errant many-to-many load in unitofwork
-    which triggered unnecessarily on expired/unloaded
-    collections. This load now takes place only if
-    passive_updates is False and the parent primary
-    key has changed, or if passive_deletes is False
-    and a delete of the parent has occurred.
-    [ticket:1845]
-
-  - Column-entities (i.e. query(Foo.id)) copy their
-    state more fully when queries are derived from
-    themselves + a selectable (i.e. from_self(),
-    union(), etc.), so that join() and such have the
-    correct state to work from.  [ticket:1853]
-
-  - Fixed bug where Query.join() would fail if
-    querying a non-ORM column then joining without
-    an on clause when a FROM clause is already
-    present, now raises a checked exception the
-    same way it does when the clause is not
-    present.  [ticket:1853]
-
-  - Improved the check for an "unmapped class",
-    including the case where the superclass is mapped
-    but the subclass is not.  Any attempts to access
-    cls._sa_class_manager.mapper now raise
-    UnmappedClassError().  [ticket:1142]
-
-  - Added "column_descriptions" accessor to Query,
-    returns a list of dictionaries containing
-    naming/typing information about the entities
-    the Query will return.  Can be helpful for
-    building GUIs on top of ORM queries.
-
-- mysql
-
-  - The _extract_error_code() method now works
-    correctly with each MySQL dialect (
-    MySQL-python, OurSQL, MySQL-Connector-Python,
-    PyODBC).  Previously,
-    the reconnect logic would fail for OperationalError
-    conditions, however since MySQLdb and OurSQL
-    have their own reconnect feature, there was no
-    symptom for these drivers here unless one
-    watched the logs.  [ticket:1848]
-
-- oracle
-  - More tweaks to cx_oracle Decimal handling.
-    "Ambiguous" numerics with no decimal place
-    are coerced to int at the connection handler
-    level.  The advantage here is that ints
-    come back as ints without SQLA type
-    objects being involved and without needless
-    conversion to Decimal first.
-
-    Unfortunately, some exotic subquery cases
-    can even see different types between
-    individual result rows, so the Numeric
-    handler, when instructed to return Decimal,
-    can't take full advantage of "native decimal"
-    mode and must run isinstance() on every value
-    to check if its Decimal already. Reopen of
-    [ticket:1840]
-
-0.6.2
-=====
-- orm
-  - Query.join() will check for a call of the
-    form query.join(target, clause_expression),
-    i.e. missing the tuple, and raise an informative
-    error message that this is the wrong calling form.
-
-  - Fixed bug regarding flushes on self-referential
-    bi-directional many-to-many relationships, where
-    two objects made to mutually reference each other
-    in one flush would fail to insert a row for both
-    sides.  Regression from 0.5. [ticket:1824]
-
-  - the post_update feature of relationship() has been
-    reworked architecturally to integrate more closely
-    with the new 0.6 unit of work.  The motivation
-    for the change is so that multiple "post update"
-    calls, each affecting different foreign key
-    columns of the same row, are executed in a single
-    UPDATE statement, rather than one UPDATE
-    statement per column per row.   Multiple row
-    updates are also batched into executemany()s as
-    possible, while maintaining consistent row ordering.
-
-  - Query.statement, Query.subquery(), etc. now transfer
-    the values of bind parameters, i.e. those specified
-    by query.params(), into the resulting SQL expression.
-    Previously the values would not be transferred
-    and bind parameters would come out as None.
-
-  - Subquery-eager-loading now works with Query objects
-    which include params(), as well as get() Queries.
-
-  - Can now call make_transient() on an instance that
-    is referenced by parent objects via many-to-one,
-    without the parent's foreign key value getting
-    temporarily set to None - this was a function
-    of the "detect primary key switch" flush handler.
-    It now ignores objects that are no longer
-    in the "persistent" state, and the parent's
-    foreign key identifier is left unaffected.
-
-  - query.order_by() now accepts False, which cancels
-    any existing order_by() state on the Query, allowing
-    subsequent generative methods to be called which do
-    not support ORDER BY.  This is not the same as the
-    already existing feature of passing None, which
-    suppresses any existing order_by() settings, including
-    those configured on the mapper.  False will make it
-    as though order_by() was never called, while
-    None is an active setting.
-
-  - An instance which is moved to "transient", has
-    an incomplete or missing set of primary key
-    attributes, and contains expired attributes, will
-    raise an InvalidRequestError if an expired attribute
-    is accessed, instead of getting a recursion overflow.
-
-  - The make_transient() function is now in the generated
-    documentation.
-
-  - make_transient() removes all "loader" callables from
-    the state being made transient, removing any
-    "expired" state - all unloaded attributes reset back
-    to undefined, None/empty on access.
-
-- sql
-  - The warning emitted by the Unicode and String types
-    with convert_unicode=True no longer embeds the actual
-    value passed.   This so that the Python warning
-    registry does not continue to grow in size, the warning
-    is emitted once as per the warning filter settings,
-    and large string values don't pollute the output.
-    [ticket:1822]
-
-  - Fixed bug that would prevent overridden clause
-    compilation from working for "annotated" expression
-    elements, which are often generated by the ORM.
-
-  - The argument to "ESCAPE" of a LIKE operator or similar
-    is passed through render_literal_value(), which may
-    implement escaping of backslashes.  [ticket:1400]
-
-  - Fixed bug in Enum type which blew away native_enum
-    flag when used with TypeDecorators or other adaption
-    scenarios.
-
-  - Inspector hits bind.connect() when invoked to ensure
-    initialize has been called.  the internal name ".conn"
-    is changed to ".bind", since that's what it is.
-
-  - Modified the internals of "column annotation" such that
-    a custom Column subclass can safely override
-    _constructor to return Column, for the purposes of
-    making "configurational" column classes that aren't
-    involved in proxying, etc.
-
-  - Column.copy() takes along the "unique" attribute
-    among others, fixes [ticket:1829] regarding declarative
-    mixins
-
-- postgresql
-  - render_literal_value() is overridden which escapes
-    backslashes, currently applies to the ESCAPE clause
-    of LIKE and similar expressions.
-    Ultimately this will have to detect the value of
-    "standard_conforming_strings" for full behavior.
-    [ticket:1400]
-
-  - Won't generate "CREATE TYPE" / "DROP TYPE" if
-    using types.Enum on a PG version prior to 8.3 -
-    the supports_native_enum flag is fully
-    honored.  [ticket:1836]
-
-- mysql
-  - MySQL dialect doesn't emit CAST() for MySQL version
-    detected < 4.0.2.  This allows the unicode
-    check on connect to proceed. [ticket:1826]
-
-  - MySQL dialect now detects NO_BACKSLASH_ESCAPES sql
-    mode, in addition to ANSI_QUOTES.
-
-  - render_literal_value() is overridden which escapes
-    backslashes, currently applies to the ESCAPE clause
-    of LIKE and similar expressions.   This behavior
-    is derived from detecting the value of
-    NO_BACKSLASH_ESCAPES.  [ticket:1400]
-
-- oracle:
-  - Fixed ora-8 compatibility flags such that they
-    don't cache a stale value from before the first
-    database connection actually occurs. [ticket:1819]
-
-  - Oracle's "native decimal" metadata begins to return
-    ambiguous typing information about numerics
-    when columns are embedded in subqueries as well
-    as when ROWNUM is consulted with subqueries, as we
-    do for limit/offset.  We've added these ambiguous
-    conditions to the cx_oracle "convert to Decimal()"
-    handler, so that we receive numerics as Decimal
-    in more cases instead of as floats.  These are
-    then converted, if requested, into Integer
-    or Float, or otherwise kept as the lossless
-    Decimal [ticket:1840].
-
-- mssql
-  - If server_version_info is outside the usual
-    range of (8, ), (9, ), (10, ), a warning is emitted
-    which suggests checking that the FreeTDS version
-    configuration is using 7.0 or 8.0, not 4.2.
-    [ticket:1825]
-
-- firebird
-  - Fixed incorrect signature in do_execute(), error
-    introduced in 0.6.1. [ticket:1823]
-
-  - Firebird dialect adds CHAR, VARCHAR types which
-    accept a "charset" flag, to support Firebird
-    "CHARACTER SET" clause.  [ticket:1813]
-
-- declarative
-   - Added support for @classproperty to provide
-     any kind of schema/mapping construct from a
-     declarative mixin, including columns with foreign
-     keys, relationships, column_property, deferred.
-     This solves all such issues on declarative mixins.
-     An error is raised if any MapperProperty subclass
-     is specified on a mixin without using @classproperty.
-     [ticket:1751] [ticket:1796] [ticket:1805]
-
-   - a mixin class can now define a column that matches
-     one which is present on a __table__ defined on a
-     subclass.  It cannot, however, define one that is
-     not present in the __table__, and the error message
-     here now works.  [ticket:1821]
-
-- compiler extension
-  - The 'default' compiler is automatically copied over
-    when overriding the compilation of a built in
-    clause construct, so no KeyError is raised if the
-    user-defined compiler is specific to certain
-    backends and compilation for a different backend
-    is invoked. [ticket:1838]
-
-- documentation
-  - Added documentation for the Inspector. [ticket:1820]
-
-  - Fixed @memoized_property and @memoized_instancemethod
-    decorators so that Sphinx documentation picks up
-    these attributes and methods, such as
-    ResultProxy.inserted_primary_key. [ticket:1830]
-
-
-0.6.1
-=====
-- orm
-  - Fixed regression introduced in 0.6.0 involving improper
-    history accounting on mutable attributes.  [ticket:1782]
-
-  - Fixed regression introduced in 0.6.0 unit of work refactor
-    that broke updates for bi-directional relationship()
-    with post_update=True. [ticket:1807]
-
-  - session.merge() will not expire attributes on the returned
-    instance if that instance is "pending".  [ticket:1789]
-
-  - fixed __setstate__ method of CollectionAdapter to not
-    fail during deserialize where parent InstanceState not
-    yet unserialized.  [ticket:1802]
-
-  - Added internal warning in case an instance without a
-    full PK happened to be expired and then was asked
-    to refresh. [ticket:1797]
-
-  - Added more aggressive caching to the mapper's usage of
-    UPDATE, INSERT, and DELETE expressions.  Assuming the
-    statement has no per-object SQL expressions attached,
-    the expression objects are cached by the mapper after
-    the first create, and their compiled form is stored
-    persistently in a cache dictionary for the duration of
-    the related Engine.  The cache is an LRUCache for the
-    rare case that a mapper receives an extremely
-    high number of different column patterns as UPDATEs.
-
-- sql
-  - expr.in_() now accepts a text() construct as the argument.
-    Grouping parenthesis are added automatically, i.e. usage
-    is like `col.in_(text("select id from table"))`.
-    [ticket:1793]
-
-  - Columns of _Binary type (i.e. LargeBinary, BLOB, etc.)
-    will coerce a "basestring" on the right side into a
-    _Binary as well so that required DBAPI processing
-    takes place.
-
-  - Added table.add_is_dependent_on(othertable), allows manual
-    placement of dependency rules between two Table objects
-    for use within create_all(), drop_all(), sorted_tables.
-    [ticket:1801]
-
-  - Fixed bug that prevented implicit RETURNING from functioning
-    properly with composite primary key that contained zeroes.
-    [ticket:1778]
-
-  - Fixed errant space character when generating ADD CONSTRAINT
-    for a named UNIQUE constraint.
-
-  - Fixed "table" argument on constructor of ForeginKeyConstraint
-    [ticket:1571]
-
-  - Fixed bug in connection pool cursor wrapper whereby if a
-    cursor threw an exception on close(), the logging of the
-    message would fail.  [ticket:1786]
-
-  - the _make_proxy() method of ColumnClause and Column now use
-    self.__class__ to determine the class of object to be returned
-    instead of hardcoding to ColumnClause/Column, making it slightly
-    easier to produce specific subclasses of these which work in
-    alias/subquery situations.
-
-  - func.XXX() doesn't inadvertently resolve to non-Function
-    classes (e.g. fixes func.text()).  [ticket:1798]
-
-- engines
-  - Fixed building the C extensions on Python 2.4. [ticket:1781]
-
-  - Pool classes will reuse the same "pool_logging_name" setting
-    after a dispose() occurs.
-
-  - Engine gains an "execution_options" argument and
-    update_execution_options() method, which will apply to
-    all connections generated by this engine.
-
-- mysql
-  - func.sysdate() emits "SYSDATE()", i.e. with the ending
-    parenthesis, on MySQL.  [ticket:1794]
-
-- sqlite
-  - Fixed concatenation of constraints when "PRIMARY KEY"
-    constraint gets moved to column level due to SQLite
-    AUTOINCREMENT keyword being rendered.  [ticket:1812]
-
-- oracle
-  - Added a check for cx_oracle versions lower than version 5,
-    in which case the incompatible "output type handler" won't
-    be used.   This will impact decimal accuracy and some
-    unicode handling issues.  [ticket:1775]
-
-  - Fixed use_ansi=False mode, which was producing broken
-    WHERE clauses in pretty much all cases.  [ticket:1790]
-
-  - Re-established support for Oracle 8 with cx_oracle,
-    including that use_ansi is set to False automatically,
-    NVARCHAR2 and NCLOB are not rendered for Unicode,
-    "native unicode" check doesn't fail, cx_oracle
-    "native unicode" mode is disabled, VARCHAR() is emitted
-    with bytes count instead of char count. [ticket:1808]
-
-  - oracle_xe 5 doesn't accept a Python unicode object in
-    its connect string in normal Python 2.x mode - so we coerce
-    to str() directly.  non-ascii characters aren't supported
-    in connect strings here since we don't know what encoding
-    we could use.  [ticket:1670]
-
-  - FOR UPDATE is emitted in the syntactically correct position
-    when limit/offset is used, i.e. the ROWNUM subquery.
-    However, Oracle can't really handle FOR UPDATE with ORDER BY
-    or with subqueries, so its still not very usable, but at
-    least SQLA gets the SQL past the Oracle parser.
-    [ticket:1815]
-
-- firebird
-  - Added a label to the query used within has_table() and
-    has_sequence() to work with older versions of Firebird
-    that don't provide labels for result columns. [ticket:1521]
-
-  - Added integer coercion to the "type_conv" attribute when
-    passed via query string, so that it is properly interpreted
-    by Kinterbasdb. [ticket:1779]
-
-  - Added 'connection shutdown' to the list of exception strings
-    which indicate a dropped connection.  [ticket:1646]
-
-- sqlsoup
-  - the SqlSoup constructor accepts a `base` argument which specifies
-    the base class to use for mapped classes, the default being
-    `object`.  [ticket:1783]
-
-0.6.0
-=====
-
-- orm
-  - Unit of work internals have been rewritten.  Units of work
-    with large numbers of objects interdependent objects
-    can now be flushed without recursion overflows
-    as there is no longer reliance upon recursive calls
-    [ticket:1081].  The number of internal structures now stays
-    constant for a particular session state, regardless of
-    how many relationships are present on mappings.  The flow
-    of events now corresponds to a linear list of steps,
-    generated by the mappers and relationships based on actual
-    work to be done, filtered through a single topological sort
-    for correct ordering.  Flush actions are assembled using
-    far fewer steps and less memory. [ticket:1742]
-
-  - Along with the UOW rewrite, this also removes an issue
-    introduced in 0.6beta3 regarding topological cycle detection
-    for units of work with long dependency cycles.  We now use
-    an algorithm written by Guido (thanks Guido!).
-
-  - one-to-many relationships now maintain a list of positive
-    parent-child associations within the flush, preventing
-    previous parents marked as deleted from cascading a
-    delete or NULL foreign key set on those child objects,
-    despite the end-user not removing the child from the old
-    association. [ticket:1764]
-
-  - A collection lazy load will switch off default
-    eagerloading on the reverse many-to-one side, since
-    that loading is by definition unnecessary.  [ticket:1495]
-
-  - Session.refresh() now does an equivalent expire()
-    on the given instance first, so that the "refresh-expire"
-    cascade is propagated.   Previously, refresh() was
-    not affected in any way by the presence of "refresh-expire"
-    cascade.   This is a change in behavior versus that
-    of 0.6beta2, where the "lockmode" flag passed to refresh()
-    would cause a version check to occur.  Since the instance
-    is first expired, refresh() always upgrades the object
-    to the most recent version.
-
-  - The 'refresh-expire' cascade, when reaching a pending object,
-    will expunge the object if the cascade also includes
-    "delete-orphan", or will simply detach it otherwise.
-    [ticket:1754]
-
-  - id(obj) is no longer used internally within topological.py,
-    as the sorting functions now require hashable objects
-    only.  [ticket:1756]
-
-  - The ORM will set the docstring of all generated descriptors
-    to None by default.  This can be overridden using 'doc'
-    (or if using Sphinx, attribute docstrings work too).
-
-  - Added kw argument 'doc' to all mapper property callables
-    as well as Column().  Will assemble the string 'doc' as
-    the '__doc__' attribute on the descriptor.
-
-  - Usage of version_id_col on a backend that supports
-    cursor.rowcount for execute() but not executemany() now works
-    when a delete is issued (already worked for saves, since those
-    don't use executemany()). For a backend that doesn't support
-    cursor.rowcount at all, a warning is emitted the same
-    as with saves.  [ticket:1761]
-
-  - The ORM now short-term caches the "compiled" form of
-    insert() and update() constructs when flushing lists of
-    objects of all the same class, thereby avoiding redundant
-    compilation per individual INSERT/UPDATE within an
-    individual flush() call.
-
-  - internal getattr(), setattr(), getcommitted() methods
-    on ColumnProperty, CompositeProperty, RelationshipProperty
-    have been underscored (i.e. are private), signature has
-    changed.
-
-- engines
-  - The C extension now also works with DBAPIs which use custom
-    sequences as row (and not only tuples). [ticket:1757]
-
-- sql
-  - Restored some bind-labeling logic from 0.5 which ensures
-    that tables with column names that overlap another column
-    of the form "<tablename>_<columnname>" won't produce
-    errors if column._label is used as a bind name during
-    an UPDATE.  Test coverage which wasn't present in 0.5
-    has been added.  [ticket:1755]
-
-  - somejoin.select(fold_equivalents=True) is no longer
-    deprecated, and will eventually be rolled into a more
-    comprehensive version of the feature for [ticket:1729].
-
-  - the Numeric type raises an *enormous* warning when expected
-    to convert floats to Decimal from a DBAPI that returns floats.
-    This includes SQLite, Sybase, MS-SQL. [ticket:1759]
-
-  - Fixed an error in expression typing which caused an endless
-    loop for expressions with two NULL types.
-
-  - Fixed bug in execution_options() feature whereby the existing
-    Transaction and other state information from the parent
-    connection would not be propagated to the sub-connection.
-
-  - Added new 'compiled_cache' execution option.  A dictionary
-    where Compiled objects will be cached when the Connection
-    compiles a clause expression into a dialect- and parameter-
-    specific Compiled object.  It is the user's responsibility to
-    manage the size of this dictionary, which will have keys
-    corresponding to the dialect, clause element, the column
-    names within the VALUES or SET clause of an INSERT or UPDATE,
-    as well as the "batch" mode for an INSERT or UPDATE statement.
-
-  - Added get_pk_constraint() to reflection.Inspector, similar
-    to get_primary_keys() except returns a dict that includes the
-    name of the constraint, for supported backends (PG so far).
-    [ticket:1769]
-
-  - Table.create() and Table.drop() no longer apply metadata-
-    level create/drop events.  [ticket:1771]
-
-- ext
-  - the compiler extension now allows @compiles decorators
-    on base classes that extend to child classes, @compiles
-    decorators on child classes that aren't broken by a
-    @compiles decorator on the base class.
-
-  - Declarative will raise an informative error message
-    if a non-mapped class attribute is referenced in the
-    string-based relationship() arguments.
-
-  - Further reworked the "mixin" logic in declarative to
-    additionally allow __mapper_args__ as a @classproperty
-    on a mixin, such as to dynamically assign polymorphic_identity.
-
-- postgresql
-  - Postgresql now reflects sequence names associated with
-    SERIAL columns correctly, after the name of of the sequence
-    has been changed.  Thanks to Kumar McMillan for the patch.
-    [ticket:1071]
-
-  - Repaired missing import in psycopg2._PGNumeric type when
-    unknown numeric is received.
-
-  - psycopg2/pg8000 dialects now aware of REAL[], FLOAT[],
-    DOUBLE_PRECISION[], NUMERIC[] return types without
-    raising an exception.
-
-  - Postgresql reflects the name of primary key constraints,
-    if one exists.  [ticket:1769]
-
-- oracle
-  - Now using cx_oracle output converters so that the
-    DBAPI returns natively the kinds of values we prefer:
-    - NUMBER values with positive precision + scale convert
-      to cx_oracle.STRING and then to Decimal.   This
-      allows perfect precision for the Numeric type when
-      using cx_oracle.  [ticket:1759]
-    - STRING/FIXED_CHAR now convert to unicode natively.
-      SQLAlchemy's String types then don't need to
-      apply any kind of conversions.
-
-- firebird
-   - The functionality of result.rowcount can be disabled on a
-     per-engine basis by setting 'enable_rowcount=False'
-     on create_engine().  Normally, cursor.rowcount is called
-     after any UPDATE or DELETE statement unconditionally,
-     because the cursor is then closed and Firebird requires
-     an open cursor in order to get a rowcount.  This
-     call is slightly expensive however so it can be disabled.
-     To re-enable on a per-execution basis, the
-     'enable_rowcount=True' execution option may be used.
-
-- examples
-  - Updated attribute_shard.py example to use a more robust
-    method of searching a Query for binary expressions which
-    compare columns against literal values.
-
-0.6beta3
-========
-
-- orm
-  - Major feature: Added new "subquery" loading capability to
-    relationship().   This is an eager loading option which
-    generates a second SELECT for each collection represented
-    in a query, across all parents at once.  The query
-    re-issues the original end-user query wrapped in a subquery,
-    applies joins out to the target collection, and loads
-    all those collections fully in one result, similar to
-    "joined" eager loading but using all inner joins and not
-    re-fetching full parent rows repeatedly (as most DBAPIs seem
-    to do, even if columns are skipped).   Subquery loading is
-    available at mapper config level using "lazy='subquery'" and
-    at the query options level using "subqueryload(props..)",
-    "subqueryload_all(props...)".  [ticket:1675]
-
-  - To accomodate the fact that there are now two kinds of eager
-    loading available, the new names for eagerload() and
-    eagerload_all() are joinedload() and joinedload_all().  The
-    old names will remain as synonyms for the foreseeable future.
-
-  - The "lazy" flag on the relationship() function now accepts
-    a string argument for all kinds of loading: "select", "joined",
-    "subquery", "noload" and "dynamic", where the default is now
-    "select".  The old values of True/
-    False/None still retain their usual meanings and will remain
-    as synonyms for the foreseeable future.
-
-  - Added with_hint() method to Query() construct.  This calls
-    directly down to select().with_hint() and also accepts
-    entities as well as tables and aliases.  See with_hint() in the
-    SQL section below. [ticket:921]
-
-  - Fixed bug in Query whereby calling q.join(prop).from_self(...).
-    join(prop) would fail to render the second join outside the
-    subquery, when joining on the same criterion as was on the
-    inside.
-
-  - Fixed bug in Query whereby the usage of aliased() constructs
-    would fail if the underlying table (but not the actual alias)
-    were referenced inside the subquery generated by
-    q.from_self() or q.select_from().
-
-  - Fixed bug which affected all eagerload() and similar options
-    such that "remote" eager loads, i.e. eagerloads off of a lazy
-    load such as query(A).options(eagerload(A.b, B.c))
-    wouldn't eagerload anything, but using eagerload("b.c") would
-    work fine.
-
-  - Query gains an add_columns(*columns) method which is a multi-
-    version of add_column(col).  add_column(col) is future
-    deprecated.
-
-  - Query.join() will detect if the end result will be
-    "FROM A JOIN A", and will raise an error if so.
-
-  - Query.join(Cls.propname, from_joinpoint=True) will check more
-    carefully that "Cls" is compatible with the current joinpoint,
-    and act the same way as Query.join("propname", from_joinpoint=True)
-    in that regard.
-
-- sql
-   - Added with_hint() method to select() construct.  Specify
-     a table/alias, hint text, and optional dialect name, and
-     "hints" will be rendered in the appropriate place in the
-     statement.  Works for Oracle, Sybase, MySQL.  [ticket:921]
-
-   - Fixed bug introduced in 0.6beta2 where column labels would
-     render inside of column expressions already assigned a label.
-     [ticket:1747]
-
-- postgresql
-   - The psycopg2 dialect will log NOTICE messages via the
-     "sqlalchemy.dialects.postgresql" logger name.
-     [ticket:877]
-
-   - the TIME and TIMESTAMP types are now availble from the
-     postgresql dialect directly, which add the PG-specific
-     argument 'precision' to both.   'precision' and
-     'timezone' are correctly reflected for both TIME and
-     TIMEZONE types. [ticket:997]
-
-- mysql
-   - No longer guessing that TINYINT(1) should be BOOLEAN
-     when reflecting - TINYINT(1) is returned.  Use Boolean/
-     BOOLEAN in table definition to get boolean conversion
-     behavior.  [ticket:1752]
-
-- oracle
-   - The Oracle dialect will issue VARCHAR type definitions
-     using character counts, i.e. VARCHAR2(50 CHAR), so that
-     the column is sized in terms of characters and not bytes.
-     Column reflection of character types will also use
-     ALL_TAB_COLUMNS.CHAR_LENGTH instead of
-     ALL_TAB_COLUMNS.DATA_LENGTH.  Both of these behaviors take
-     effect when the server version is 9 or higher - for
-     version 8, the old behaviors are used.  [ticket:1744]
-
-- declarative
-   - Using a mixin won't break if the mixin implements an
-     unpredictable __getattribute__(), i.e. Zope interfaces.
-     [ticket:1746]
-
-   - Using @classdecorator and similar on mixins to define
-     __tablename__, __table_args__, etc. now works if
-     the method references attributes on the ultimate
-     subclass. [ticket:1749]
-
-   - relationships and columns with foreign keys aren't
-     allowed on declarative mixins, sorry.  [ticket:1751]
-
-- ext
-    - The sqlalchemy.orm.shard module now becomes an extension,
-      sqlalchemy.ext.horizontal_shard.   The old import
-      works with a deprecation warning.
-
-0.6beta2
-========
-
-- py3k
-  - Improved the installation/test setup regarding Python 3,
-    now that Distribute runs on Py3k.   distribute_setup.py
-    is now included.  See README.py3k for Python 3 installation/
-    testing instructions.
-
-- orm
-  - The official name for the relation() function is now
-    relationship(), to eliminate confusion over the relational
-    algebra term.  relation() however will remain available
-    in equal capacity for the foreseeable future.  [ticket:1740]
-
-  - Added "version_id_generator" argument to Mapper, this is a
-    callable that, given the current value of the "version_id_col",
-    returns the next version number.  Can be used for alternate
-    versioning schemes such as uuid, timestamps.  [ticket:1692]
-
-  - added "lockmode" kw argument to Session.refresh(), will
-    pass through the string value to Query the same as
-    in with_lockmode(), will also do version check for a
-    version_id_col-enabled mapping.
-
-  - Fixed bug whereby calling query(A).join(A.bs).add_entity(B)
-    in a joined inheritance scenario would double-add B as a
-    target and produce an invalid query.  [ticket:1188]
-
-  - Fixed bug in session.rollback() which involved not removing
-    formerly "pending" objects from the session before
-    re-integrating "deleted" objects, typically occured with
-    natural primary keys. If there was a primary key conflict
-    between them, the attach of the deleted would fail
-    internally. The formerly "pending" objects are now expunged
-    first. [ticket:1674]
-
-  - Removed a lot of logging that nobody really cares about,
-    logging that remains will respond to live changes in the
-    log level.  No significant overhead is added.  [ticket:1719]
-
-  - Fixed bug in session.merge() which prevented dict-like
-    collections from merging.
-
-  - session.merge() works with relations that specifically
-    don't include "merge" in their cascade options - the target
-    is ignored completely.
-
-  - session.merge() will not expire existing scalar attributes
-    on an existing target if the target has a value for that
-    attribute, even if the incoming merged doesn't have
-    a value for the attribute.  This prevents unnecessary loads
-    on existing items.  Will still mark the attr as expired
-    if the destination doesn't have the attr, though, which
-    fulfills some contracts of deferred cols.  [ticket:1681]
-
-  - The "allow_null_pks" flag is now called "allow_partial_pks",
-    defaults to True, acts like it did in 0.5 again.  Except,
-    it also is implemented within merge() such that a SELECT
-    won't be issued for an incoming instance with partially
-    NULL primary key if the flag is False.  [ticket:1680]
-
-  - Fixed bug in 0.6-reworked "many-to-one" optimizations
-    such that a many-to-one that is against a non-primary key
-    column on the remote table (i.e. foreign key against a
-    UNIQUE column) will pull the "old" value in from the
-    database during a change, since if it's in the session
-    we will need it for proper history/backref accounting,
-    and we can't pull from the local identity map on a
-    non-primary key column. [ticket:1737]
-
-  - fixed internal error which would occur if calling has()
-    or similar complex expression on a single-table inheritance
-    relation(). [ticket:1731]
-
-  - query.one() no longer applies LIMIT to the query, this to
-    ensure that it fully counts all object identities present
-    in the result, even in the case where joins may conceal
-    multiple identities for two or more rows.  As a bonus,
-    one() can now also be called with a query that issued
-    from_statement() to start with since it no longer modifies
-    the query.  [ticket:1688]
-
-  - query.get() now returns None if queried for an identifier
-    that is present in the identity map with a different class
-    than the one requested, i.e. when using polymorphic loading.
-    [ticket:1727]
-
-  - A major fix in query.join(), when the "on" clause is an
-    attribute of an aliased() construct, but there is already
-    an existing join made out to a compatible target, query properly
-    joins to the right aliased() construct instead of sticking
-    onto the right side of the existing join.  [ticket:1706]
-
-  - Slight improvement to the fix for [ticket:1362] to not issue
-    needless updates of the primary key column during a so-called
-    "row switch" operation, i.e. add + delete of two objects
-    with the same PK.
-
-  - Now uses sqlalchemy.orm.exc.DetachedInstanceError when an
-    attribute load or refresh action fails due to object
-    being detached from any Session.   UnboundExecutionError
-    is specific to engines bound to sessions and statements.
-
-  - Query called in the context of an expression will render
-    disambiguating labels in all cases.    Note that this does
-    not apply to the existing .statement and .subquery()
-    accessor/method, which still honors the .with_labels()
-    setting that defaults to False.
-
-  - Query.union() retains disambiguating labels within the
-    returned statement, thus avoiding various SQL composition
-    errors which can result from column name conflicts.
-    [ticket:1676]
-
-  - Fixed bug in attribute history that inadvertently invoked
-    __eq__ on mapped instances.
-
-  - Some internal streamlining of object loading grants a
-    small speedup for large results, estimates are around
-    10-15%.   Gave the "state" internals a good solid
-    cleanup with less complexity, datamembers,
-    method calls, blank dictionary creates.
-
-  - Documentation clarification for query.delete()
-    [ticket:1689]
-
-  - Fixed cascade bug in many-to-one relation() when attribute
-    was set to None, introduced in r6711 (cascade deleted
-    items into session during add()).
-
-  - Calling query.order_by() or query.distinct() before calling
-    query.select_from(), query.with_polymorphic(), or
-    query.from_statement() raises an exception now instead of
-    silently dropping those criterion. [ticket:1736]
-
-  - query.scalar() now raises an exception if more than one
-    row is returned.  All other behavior remains the same.
-    [ticket:1735]
-
-  - Fixed bug which caused "row switch" logic, that is an
-    INSERT and DELETE replaced by an UPDATE, to fail when
-    version_id_col was in use. [ticket:1692]
-
-- sql
-  - join() will now simulate a NATURAL JOIN by default.  Meaning,
-    if the left side is a join, it will attempt to join the right
-    side to the rightmost side of the left first, and not raise
-    any exceptions about ambiguous join conditions if successful
-    even if there are further join targets across the rest of
-    the left.  [ticket:1714]
-
-  - The most common result processors conversion function were
-    moved to the new "processors" module.  Dialect authors are
-    encouraged to use those functions whenever they correspond
-    to their needs instead of implementing custom ones.
-
-  - SchemaType and subclasses Boolean, Enum are now serializable,
-    including their ddl listener and other event callables.
-    [ticket:1694] [ticket:1698]
-
-  - Some platforms will now interpret certain literal values
-    as non-bind parameters, rendered literally into the SQL
-    statement.   This to support strict SQL-92 rules that are
-    enforced by some platforms including MS-SQL and Sybase.
-    In this model, bind parameters aren't allowed in the
-    columns clause of a SELECT, nor are certain ambiguous
-    expressions like "?=?".  When this mode is enabled, the base
-    compiler will render the binds as inline literals, but only across
-    strings and numeric values.  Other types such as dates
-    will raise an error, unless the dialect subclass defines
-    a literal rendering function for those.  The bind parameter
-    must have an embedded literal value already or an error
-    is raised (i.e. won't work with straight bindparam('x')).
-    Dialects can also expand upon the areas where binds are not
-    accepted, such as within argument lists of functions
-    (which don't work on MS-SQL when native SQL binding is used).
-
-  - Added "unicode_errors" parameter to String, Unicode, etc.
-    Behaves like the 'errors' keyword argument to
-    the standard library's string.decode() functions.   This flag
-    requires that `convert_unicode` is set to `"force"` - otherwise,
-    SQLAlchemy is not guaranteed to handle the task of unicode
-    conversion.   Note that this flag adds significant performance
-    overhead to row-fetching operations for backends that already
-    return unicode objects natively (which most DBAPIs do).  This
-    flag should only be used as an absolute last resort for reading
-    strings from a column with varied or corrupted encodings,
-    which only applies to databases that accept invalid encodings
-    in the first place (i.e. MySQL. *not* PG, Sqlite, etc.)
-
-  - Added math negation operator support, -x.
-
-  - FunctionElement subclasses are now directly executable the
-    same way any func.foo() construct is, with automatic
-    SELECT being applied when passed to execute().
-
-  - The "type" and "bind" keyword arguments of a func.foo()
-    construct are now local to "func." constructs and are
-    not part of the FunctionElement base class, allowing
-    a "type" to be handled in a custom constructor or
-    class-level variable.
-
-  - Restored the keys() method to ResultProxy.
-
-  - The type/expression system now does a more complete job
-    of determining the return type from an expression
-    as well as the adaptation of the Python operator into
-    a SQL operator, based on the full left/right/operator
-    of the given expression.  In particular
-    the date/time/interval system created for Postgresql
-    EXTRACT in [ticket:1647] has now been generalized into
-    the type system.   The previous behavior which often
-    occured of an expression "column + literal" forcing
-    the type of "literal" to be the same as that of "column"
-    will now usually not occur - the type of
-    "literal" is first derived from the Python type of the
-    literal, assuming standard native Python types + date
-    types, before falling back to that of the known type
-    on the other side of the expression.  If the
-    "fallback" type is compatible (i.e. CHAR from String),
-    the literal side will use that.  TypeDecorator
-    types override this by default to coerce the "literal"
-    side unconditionally, which can be changed by implementing
-    the coerce_compared_value() method. Also part of
-    [ticket:1683].
-
-  - Made sqlalchemy.sql.expressions.Executable part of public
-    API, used for any expression construct that can be sent to
-    execute().  FunctionElement now inherits Executable so that
-    it gains execution_options(), which are also propagated
-    to the select() that's generated within execute().
-    Executable in turn subclasses _Generative which marks
-    any ClauseElement that supports the @_generative
-    decorator - these may also become "public" for the benefit
-    of the compiler extension at some point.
-
-  - A change to the solution for [ticket:1579] - an end-user
-    defined bind parameter name that directly conflicts with
-    a column-named bind generated directly from the SET or
-    VALUES clause of an update/insert generates a compile error.
-    This reduces call counts and eliminates some cases where
-    undesirable name conflicts could still occur.
-
-  - Column() requires a type if it has no foreign keys (this is
-    not new).  An error is now raised if a Column() has no type
-    and no foreign keys.  [ticket:1705]
-
-  - the "scale" argument of the Numeric() type is honored when
-    coercing a returned floating point value into a string
-    on its way to Decimal - this allows accuracy to function
-    on SQLite, MySQL.  [ticket:1717]
-
-  - the copy() method of Column now copies over uninitialized
-    "on table attach" events.  Helps with the new declarative
-    "mixin" capability.
-
-- engines
-  - Added an optional C extension to speed up the sql layer by
-    reimplementing RowProxy and the most common result processors.
-    The actual speedups will depend heavily on your DBAPI and
-    the mix of datatypes used in your tables, and can vary from
-    a 30% improvement to more than 200%.  It also provides a modest
-    (~15-20%) indirect improvement to ORM speed for large queries.
-    Note that it is *not* built/installed by default.
-    See README for installation instructions.
-
-  - the execution sequence pulls all rowcount/last inserted ID
-    info from the cursor before commit() is called on the
-    DBAPI connection in an "autocommit" scenario.  This helps
-    mxodbc with rowcount and is probably a good idea overall.
-
-  - Opened up logging a bit such that isEnabledFor() is called
-    more often, so that changes to the log level for engine/pool
-    will be reflected on next connect.   This adds a small
-    amount of method call overhead.  It's negligible and will make
-    life a lot easier for all those situations when logging
-    just happens to be configured after create_engine() is called.
-    [ticket:1719]
-
-  - The assert_unicode flag is deprecated.  SQLAlchemy will raise
-    a warning in all cases where it is asked to encode a non-unicode
-    Python string, as well as when a Unicode or UnicodeType type
-    is explicitly passed a bytestring.  The String type will do nothing
-    for DBAPIs that already accept Python unicode objects.
-
-  - Bind parameters are sent as a tuple instead of a list. Some
-    backend drivers will not accept bind parameters as a list.
-
-  - threadlocal engine wasn't properly closing the connection
-    upon close() - fixed that.
-
-  - Transaction object doesn't rollback or commit if it isn't
-    "active", allows more accurate nesting of begin/rollback/commit.
-
-  - Python unicode objects as binds result in the Unicode type,
-    not string, thus eliminating a certain class of unicode errors
-    on drivers that don't support unicode binds.
-
-  - Added "logging_name" argument to create_engine(), Pool() constructor
-    as well as "pool_logging_name" argument to create_engine() which
-    filters down to that of Pool.   Issues the given string name
-    within the "name" field of logging messages instead of the default
-    hex identifier string.  [ticket:1555]
-
-  - The visit_pool() method of Dialect is removed, and replaced with
-    on_connect().  This method returns a callable which receives
-    the raw DBAPI connection after each one is created.   The callable
-    is assembled into a first_connect/connect pool listener by the
-    connection strategy if non-None.   Provides a simpler interface
-    for dialects.
-
-  - StaticPool now initializes, disposes and recreates without
-    opening a new connection - the connection is only opened when
-    first requested. dispose() also works on AssertionPool now.
-    [ticket:1728]
-
-- metadata
-  - Added the ability to strip schema information when using
-    "tometadata" by passing "schema=None" as an argument. If schema
-    is not specified then the table's schema is retained.
-    [ticket: 1673]
-
-- declarative
-  - DeclarativeMeta exclusively uses cls.__dict__ (not dict_)
-    as the source of class information; _as_declarative exclusively
-    uses the  dict_ passed to it as the source of class information
-    (which when using DeclarativeMeta is cls.__dict__).  This should
-    in theory make it easier for custom metaclasses to modify
-    the state passed into _as_declarative.
-
-  - declarative now accepts mixin classes directly, as a means
-    to provide common functional and column-based elements on
-    all subclasses, as well as a means to propagate a fixed
-    set of __table_args__ or __mapper_args__ to subclasses.
-    For custom combinations of __table_args__/__mapper_args__ from
-    an inherited mixin to local, descriptors can now be used.
-    New details are all up in the Declarative documentation.
-    Thanks to Chris Withers for putting up with my strife
-    on this. [ticket:1707]
-
-  - the __mapper_args__ dict is copied when propagating to a subclass,
-    and is taken straight off the class __dict__ to avoid any
-    propagation from the parent.  mapper inheritance already
-    propagates the things you want from the parent mapper.
-    [ticket:1393]
-
-  - An exception is raised when a single-table subclass specifies
-    a column that is already present on the base class.
-    [ticket:1732]
-
-- mysql
-  - Fixed reflection bug whereby when COLLATE was present,
-    nullable flag and server defaults would not be reflected.
-    [ticket:1655]
-
-  - Fixed reflection of TINYINT(1) "boolean" columns defined with
-    integer flags like UNSIGNED.
-
-  - Further fixes for the mysql-connector dialect.  [ticket:1668]
-
-  - Composite PK table on InnoDB where the "autoincrement" column
-    isn't first will emit an explicit "KEY" phrase within
-    CREATE TABLE thereby avoiding errors, [ticket:1496]
-
-  - Added reflection/create table support for a wide range
-    of MySQL keywords.  [ticket:1634]
-
-  - Fixed import error which could occur reflecting tables on
-    a Windows host [ticket:1580]
-
-- mssql
-  - Re-established support for the pymssql dialect.
-
-  - Various fixes for implicit returning, reflection,
-    etc. - the MS-SQL dialects aren't quite complete
-    in 0.6 yet (but are close)
-
-  - Added basic support for mxODBC [ticket:1710].
-
-  - Removed the text_as_varchar option.
-
-- oracle
-   - "out" parameters require a type that is supported by
-     cx_oracle.  An error will be raised if no cx_oracle
-     type can be found.
-
-   - Oracle 'DATE' now does not perform any result processing,
-     as the DATE type in Oracle stores full date+time objects,
-     that's what you'll get.  Note that the generic types.Date
-     type *will* still call value.date() on incoming values,
-     however.  When reflecting a table, the reflected type
-     will be 'DATE'.
-
-   - Added preliminary support for Oracle's WITH_UNICODE
-     mode.  At the very least this establishes initial
-     support for cx_Oracle with Python 3.  When WITH_UNICODE