diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-01-24 03:21:26 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-01-24 03:21:26 +0000 |
commit | c4199178cac96fb8f4d899d6cc5866444e92d189 (patch) | |
tree | 009ed92f74ac8ed59441a72e7d05ccbde54091c2 /lib/sqlalchemy | |
parent | 4e9aaff50ff679fc51c4d799b000c2fcfc70a999 (diff) | |
download | sqlalchemy-c4199178cac96fb8f4d899d6cc5866444e92d189.tar.gz |
oracle can conditionally decide if it wants to say "use rowid" in a select statement.
needs to be tweaked vs. when ROW NUMBER OVER ORDER BY is being used, but currently
fixes [ticket:436]
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r-- | lib/sqlalchemy/ansisql.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/databases/oracle.py | 7 | ||||
-rw-r--r-- | lib/sqlalchemy/databases/postgres.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/databases/sqlite.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 9 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/default.py | 2 |
6 files changed, 16 insertions, 8 deletions
diff --git a/lib/sqlalchemy/ansisql.py b/lib/sqlalchemy/ansisql.py index 69b082e41..803cba6d3 100644 --- a/lib/sqlalchemy/ansisql.py +++ b/lib/sqlalchemy/ansisql.py @@ -215,7 +215,7 @@ class ANSICompiler(sql.Compiled): self.strings[column] = self.preparer.format_column(column) else: if column.table.oid_column is column: - n = self.dialect.oid_column_name() + n = self.dialect.oid_column_name(column) if n is not None: self.strings[column] = "%s.%s" % (self.preparer.format_table(column.table, use_schema=False), n) elif len(column.table.primary_key) != 0: diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index 6008ae61c..b5bd72e8f 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -192,8 +192,11 @@ class OracleDialect(ansisql.ANSIDialect): def type_descriptor(self, typeobj): return sqltypes.adapt_type(typeobj, colspecs) - def oid_column_name(self): - return "rowid" + def oid_column_name(self, column): + if not isinstance(column.table, sql.TableClause) and not isinstance(column.table, sql.Select): + return None + else: + return "rowid" def create_execution_context(self): return OracleExecutionContext(self) diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py index e3ac3ae2c..7eee35320 100644 --- a/lib/sqlalchemy/databases/postgres.py +++ b/lib/sqlalchemy/databases/postgres.py @@ -279,7 +279,7 @@ class PGDialect(ansisql.ANSIDialect): else: return self.context.last_inserted_ids - def oid_column_name(self): + def oid_column_name(self, column): if self.use_oids: return "oid" else: diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py index 6d1e56a7c..dda488f9c 100644 --- a/lib/sqlalchemy/databases/sqlite.py +++ b/lib/sqlalchemy/databases/sqlite.py @@ -165,7 +165,7 @@ class SQLiteDialect(ansisql.ANSIDialect): def last_inserted_ids(self): return self.context.last_inserted_ids - def oid_column_name(self): + def oid_column_name(self, column): return "oid" def dbapi(self): diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 77ab866c7..c7b5d93fe 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -52,8 +52,13 @@ class Dialect(sql.AbstractDialect): which comes from the types module. Subclasses will usually use the adapt_type() method in the types module to make this job easy.""" raise NotImplementedError() - def oid_column_name(self): - """returns the oid column name for this dialect, or None if the dialect cant/wont support OID/ROWID.""" + def oid_column_name(self, column): + """return the oid column name for this dialect, or None if the dialect cant/wont support OID/ROWID. + + the Column instance which represents OID for the query being compiled is passed, so that the dialect + can inspect the column and its parent selectable to determine if OID/ROWID is not selected for a particular + selectable (i.e. oracle doesnt support ROWID for UNION, GROUP BY, DISTINCT, etc.) + """ raise NotImplementedError() def supports_sane_rowcount(self): """Provided to indicate when MySQL is being used, which does not have standard behavior diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index 94c01f324..06409377c 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -41,7 +41,7 @@ class DefaultDialect(base.Dialect): if type(typeobj) is type: typeobj = typeobj() return typeobj - def oid_column_name(self): + def oid_column_name(self, column): return None def supports_sane_rowcount(self): return True |