Commit Graph

79 Commits

Author SHA1 Message Date
Mike Bayer 60c36ca841 - Fixed joinedload bug which would occur when a. the query includes
limit/offset criteria that forces a subquery b. the relationship
uses "secondary" c. the primaryjoin of the relationship refers to
a column that is either not part of the primary key, or is a PK
col in a joined-inheritance subclass table that is under a different
attribute name than the parent table's primary key column d. the
query defers the columns that are present in the primaryjoin, typically
via not being included in load_only(); the necessary column(s) would
not be present in the subquery and produce invalid SQL.
fixes #3592
2015-11-21 16:36:50 -05:00
Mike Bayer 068d37035a - don't create tables on compile-only tests 2015-11-21 16:20:25 -05:00
Mike Bayer 5c85240921 - appease oracle's anger (no sequence defined for these PKs) 2015-05-05 17:01:13 -04:00
Mike Bayer 8ac2bec029 - Liberalized an assertion that was added as part of 🎫3347
to protect against unknown conditions when splicing inner joins
together within joined eager loads with ``innerjoin=True``; if
some of the joins use a "secondary" table, the assertion needs to
unwrap further joins in order to pass.
fixes #3412
2015-05-02 11:33:54 -04:00
Mike Bayer 2cae4f262b - use odict here for test determinism 2015-04-01 19:41:26 -04:00
Mike Bayer dedc85ba9d - further fixes for #3347; track the mappers we're joining
between fully and match on those, rather than trying to
compare selectables; fixes #3347
2015-03-31 13:29:10 -04:00
Mike Bayer 4318edf9bb - use an ordered dict so that queries are deterministic 2015-03-30 23:29:39 -04:00
Mike Bayer 1a56177c21 - Fixed a bug related to "nested" inner join eager loading, which
exists in 0.9 as well but is more of a regression in 1.0 due to
🎫`3008` which turns on "nested" by default, such that
a joined eager load that travels across sibling paths from a common
ancestor using innerjoin=True will correctly splice each "innerjoin"
sibling into the appropriate part of the join, when a series of
inner/outer joins are mixed together.
fixes #3347
2015-03-30 17:49:39 -04:00
Mike Bayer 201ba16fc8 - The subquery wrapping which occurs when joined eager loading
is used with a one-to-many query that also features LIMIT,
OFFSET, or DISTINCT has been disabled in the case of a one-to-one
relationship, that is a one-to-many with
:paramref:`.relationship.uselist` set to False.  This will produce
more efficient queries in these cases.
fixes #3249
2015-03-10 18:23:23 -04:00
Mike Bayer 79cbd377a6 - squash-merge the final row_proc integration branch. this is
a much more modest outcome than what we started with.   The
work of create_row_processor() for ColumnProperty objects
is essentially done at query setup time combined with some
lookups in _instance_processor().
- to allow this change for deferred columns, deferred columns
no longer search for themselves in the result.   If they've been
set up as deferred without any explicit directive to undefer them,
then this is what was asked for.  if we don't do this,
then we're stuck with this performance penalty for all deferred
columns which in the vast majority of typical use cases (e.g. loading
large, legacy tables or tables with many/large very seldom
used values) won't be present in the result and won't be accessed at all.
2015-03-01 16:09:11 -05:00
Mike Bayer 1f2f88d8ff - not sure what this is testing but remove the self.l that might
be contributing to pypy not cleaning up on this one
2014-09-17 15:40:09 -04:00
Mike Bayer e80c7cc5c1 wip for #3148 2014-09-06 17:56:53 -04:00
Mike Bayer 7c6a45c480 - The :func:~.expression.column and :func:~.expression.table
constructs are now importable from the "from sqlalchemy" namespace,
just like every other Core construct.
- The implicit conversion of strings to :func:`.text` constructs
when passed to most builder methods of :func:`.select` as
well as :class:`.Query` now emits a warning with just the
plain string sent.   The textual conversion still proceeds normally,
however.  The only method that accepts a string without a warning
are the "label reference" methods like order_by(), group_by();
these functions will now at compile time attempt to resolve a single
string argument to a column or label expression present in the
selectable; if none is located, the expression still renders, but
you get the warning again. The rationale here is that the implicit
conversion from string to text is more unexpected than not these days,
and it is better that the user send more direction to the Core / ORM
when passing a raw string as to what direction should be taken.
Core/ORM tutorials have been updated to go more in depth as to how text
is handled.
fixes #2992
2014-09-01 20:19:54 -04:00
Mike Bayer 00862a29c6 - The behavior of :paramref:.joinedload.innerjoin as well as
:paramref:`.relationship.innerjoin` is now to use "nested"
inner joins, that is, right-nested, as the default behavior when an
inner join joined eager load is chained to an outer join eager load.
fixes #3008
2014-08-26 17:23:23 -04:00
Mike Bayer e346ee2c57 - hard-won pep8 formatting of one of the giants... 2014-08-26 16:36:56 -04:00
Mike Bayer 828cf1263a - use an odict here to ensure ordering of properties 2014-07-15 18:59:44 -04:00
Mike Bayer 61384fd0e5 - Fixed a regression caused by 🎫2976 released in 0.9.4 where
the "outer join" propagation along a chain of joined eager loads
would incorrectly convert an "inner join" along a sibling join path
into an outer join as well, when only descendant paths should be
receiving the "outer join" propagation; additionally, fixed related
issue where "nested" join propagation would take place inappropriately
between two sibling join paths.

this is accomplished by re-introducing the removed flag "allow_innerjoin",
now inverted and named "chained_from_outerjoin".  Propagating this flag
allows us to know when we have encountered an outerjoin along a load
path, without confusing it for state obtained from a sibling path.

fixes #3131
ref #2976
2014-07-15 13:20:55 -04:00
Mike Bayer 50d19f55d2 - add some more rules to make sure all tests run if DBs are available 2014-03-24 12:49:22 -04:00
Mike Bayer 12ce2edc92 - Added a new option to :paramref:.relationship.innerjoin which is
to specify the string ``"nested"``.  When set to ``"nested"`` as opposed
to ``True``, the "chaining" of joins will parenthesize the inner join on the
right side of an existing outer join, instead of chaining as a string
of outer joins.   This possibly should have been the default behavior
when 0.9 was released, as we introduced the feature of right-nested
joins in the ORM, however we are keeping it as a non-default for now
to avoid further surprises.
fixes #2976
2014-02-28 14:15:13 -05:00
Mike Bayer 59ca4633ac - remove informix dialect, moved out to https://bitbucket.org/zzzeek/sqlalchemy_informixdb
- remove informix, maxdb, access symbols from tests etc.
2013-11-17 13:45:23 -05:00
Mike Bayer d914493616 - add some tests for propagate of wildcard lazyload 2013-10-06 21:07:20 -04:00
Mike Bayer 1b25ed907f - merge ticket_1418 branch, [ticket:1418]
- The system of loader options has been entirely rearchitected to build
upon a much more comprehensive base, the :class:`.Load` object.  This
base allows any common loader option like :func:`.joinedload`,
:func:`.defer`, etc. to be used in a "chained" style for the purpose
of specifying options down a path, such as ``joinedload("foo").subqueryload("bar")``.
The new system supersedes the usage of dot-separated path names,
multiple attributes within options, and the usage of ``_all()`` options.
-  Added a new load option :func:`.orm.load_only`.  This allows a series
of column names to be specified as loading "only" those attributes,
deferring the rest.
2013-10-06 20:29:08 -04:00
Mike Bayer d5363fca54 - Fixed an obscure bug where the wrong results would be
fetched when joining/joinedloading across a many-to-many
relationship to a single-table-inheriting
subclass with a specific discriminator value, due to "secondary"
rows that would come back.  The "secondary" and right-side
tables are now inner joined inside of parenthesis for all
ORM joins on many-to-many relationships so that the left->right
join can accurately filtered.
[ticket:2369]
2013-06-07 23:04:33 -04:00
Mike Bayer 26ec0507be Merge branch 'ticket_2587'
Conflicts:
	test/profiles.txt
	test/sql/test_selectable.py
2013-06-04 21:38:56 -04:00
Mike Bayer 58e917fe2d - eager loads
- two suite of SQL assertions converted
2013-06-04 16:48:14 -04:00
Mike Bayer 74c98bf182 Merge branch 'master' into ticket_1068 2013-06-03 13:13:16 -04:00
Mike Bayer 0adcfea0d3 still not locating more nested expressions, may need to match on name 2013-05-27 21:05:16 -04:00
Mike Bayer 26657f92ec merge default 2013-05-13 16:13:51 -04:00
Mike Bayer f574bcf98d Fixed a regression from 0.7 caused by this ticket, which
made the check for recursion overflow in self-referential
eager joining too loose, missing a particular circumstance
where a subclass had lazy="joined" or "subquery" configured
and the load was a "with_polymorphic" against the base.
[ticket:2481]
2013-05-13 16:13:15 -04:00
Mike Bayer 220fa91337 most of ORM passing... 2013-05-04 16:23:27 -04:00
Mike Bayer 4b614b9b35 - the raw 2to3 run
- went through examples/ and cleaned out excess list() calls
2013-04-27 19:53:57 -04:00
Mike Bayer b66dad46f3 - refactor of pathing mechanics, to address #2614, #2617
- paths now store Mapper + MapperProperty now instead of string key,
so that the parent mapper for the property is known, supports same-named
properties on multiple subclasses
- the Mapper within the path is now always relevant to the property
to the right of it.  PathRegistry does the translation now, instead
of having all the outside users of PathRegistry worry about it,
to produce a path that is much more consistent.  Paths are now
consistent with mappings in all cases.  Special logic to get at
"with_polymorphic" structures and such added also.
- AliasedClass now has two modes, "use_mapper_path" and regular;
"use_mapper_path" is for all those situations where we put an AliasedClass
in for a plain class internally, and want it to "path" with the
plain mapper.
- The AliasedInsp is now the first class "entity" for an AliasedClass,
and is passed around internally and used as attr._parententity
and such.  it is the AliasedClass analogue for Mapper.
2012-12-01 20:12:23 -05:00
Mike Bayer e2697d547e Added a new exception to detect the case where two
subclasses are being loaded using with_polymorphic(),
each subclass contains a relationship attribute of the same
name, and eager loading is being applied to one or both.
This is an ongoing bug which can't be immediately fixed,
so since the results are usually wrong in any case it raises an
exception for now.   0.7 has the same issue, so an exception
raise here probably means the code was returning the wrong
data in 0.7.  [ticket:2614]
2012-11-24 16:14:58 -05:00
Mike Bayer c307df6596 - [feature] "scalar" selects now have a WHERE method
to help with generative building.  Also slight adjustment
    regarding how SS "correlates" columns; the new methodology
    no longer applies meaning to the underlying
    Table column being selected.  This improves
    some fairly esoteric situations, and the logic
    that was there didn't seem to have any purpose.
  - [feature] Some support for auto-rendering of a
    relationship join condition based on the mapped
    attribute, with usage of core SQL constructs.
    E.g. select([SomeClass]).where(SomeClass.somerelationship)
    would render SELECT from "someclass" and use the
    primaryjoin of "somerelationship" as the WHERE
    clause.   This changes the previous meaning
    of "SomeClass.somerelationship" when used in a
    core SQL context; previously, it would "resolve"
    to the parent selectable, which wasn't generally
    useful.  Related to [ticket:2245].
2012-10-15 17:21:38 -04:00
Mike Bayer 20cdc64588 trying different approaches to test layout. in this one, the testing modules
become an externally usable package but still remains within the main sqlalchemy parent package.
in this system, we use kind of an ugly hack to get the noseplugin imported outside of the
"sqlalchemy" package, while still making it available within sqlalchemy for usage by
third party libraries.
2012-09-27 02:37:33 -04:00
Mike Bayer ffab937e4c fixes for pg9 2012-08-22 03:37:10 -04:00
Mike Bayer 734d081ce6 - more fixes to py 3.3 tests, [ticket:2542] 2012-08-11 22:15:29 -04:00
Mike Bayer ec7ea3d264 mo tests mo problems 2012-08-06 12:19:22 -04:00
Mike Bayer 63e2a0f8eb - [bug] Improvements to joined/subquery eager
loading dealing with chains of subclass entities
    sharing a common base, with no specific "join depth"
    provided.  Will chain out to
    each subclass mapper individually before detecting
    a "cycle", rather than considering the base class
    to be the source of the "cycle".  [ticket:2481]
2012-08-06 11:36:57 -04:00
Mike Bayer 27913554a8 trailing whitespace bonanza 2012-07-28 15:50:05 -04:00
Mike Bayer 705b48aed3 fix tests here, mssql/mysql are mutually exclusive about x IN/= <subquery> at least when LIMIT is present 2011-09-24 11:16:54 -04:00
Mike Bayer c52e31b1e0 - The behavior of =/!= when comparing a scalar select
to a value will no longer produce IN/NOT IN as of 0.8;
    this behavior is a little too heavy handed (use in_() if
    you want to emit IN) and now emits a deprecation warning.
    To get the 0.8 behavior immediately and remove the warning,
    a compiler recipe is given at
    http://www.sqlalchemy.org/docs/07/dialects/mssql.html#scalar-select-comparisons
    to override the behavior of visit_binary().
    [ticket:2277]
2011-09-23 21:56:10 -04:00
Mike Bayer 8aa4136e8d fix a test 2011-08-06 15:23:46 -04:00
Mike Bayer 15cd4235b6 - Feature enhancement: joined and subquery
loading will now traverse already-present related
    objects and collections in search of unpopulated
    attributes throughout the scope of the eager load
    being defined, so that the eager loading that is
    specified via mappings or query options
    unconditionally takes place for the full depth,
    populating whatever is not already populated.
    Previously, this traversal would stop if a related
    object or collection were already present leading
    to inconsistent behavior (though would save on
    loads/cycles for an already-loaded graph). For a
    subqueryload, this means that the additional
    SELECT statements emitted by subqueryload will
    invoke unconditionally, no matter how much of the
    existing graph is already present (hence the
    controversy). The previous behavior of "stopping"
    is still in effect when a query is the result of
    an attribute-initiated lazyload, as otherwise an
    "N+1" style of collection iteration can become
    needlessly expensive when the same related object
    is encountered repeatedly. There's also an
    as-yet-not-public generative Query method
    _with_invoke_all_eagers()
    which selects old/new behavior [ticket:2213]
2011-07-17 15:14:03 -04:00
Mike Bayer 668991a7ed - Fixed subtle bug that caused SQL to blow
up if: column_property() against subquery +
joinedload + LIMIT + order by the column
property() occurred.  [ticket:2188].
Also in 0.6.9
2011-06-27 19:25:35 -04:00
Mike Bayer 7b24e458c7 - move all the comments that got shoved below the fixture grabs back up 2011-03-27 17:19:00 -04:00
Mike Bayer 68a350d462 - remove test.sql._base, test.engine._base, test.orm._base, move those classes to a new test.lib.fixtures module
- move testing.TestBase to test.lib.fixtures
- massive search and replace
2011-03-27 16:27:27 -04:00
Mike Bayer a3083eabf4 - move all the setup_classes(cls) and setup_mappers(cls) to use a
local cls.Basic, cls.Comparable base class so that there is no ambiguity
or hash identity behaviors getting in the way of class registration.
2011-03-27 15:04:06 -04:00
Mike Bayer 14a2fae239 - remove @testing.resolve_artifact_names, replace with direct attribute
access to the cls/self.tables/classes registries
- express orm/_base.py ORMTest in terms of engine/_base.py TablesTest,
factor out common steps into TablesTest, remove AltEngineTest as a
separate class.   will further consolidate these base classes
2011-03-26 19:03:11 -04:00
Mike Bayer cec64cf86d - 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.6 has a more conservative fix
to this.  [ticket:2098]
2011-03-17 16:22:25 -04:00