From c4199178cac96fb8f4d899d6cc5866444e92d189 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 24 Jan 2007 03:21:26 +0000 Subject: [PATCH] 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] --- lib/sqlalchemy/ansisql.py | 2 +- lib/sqlalchemy/databases/oracle.py | 7 +++++-- lib/sqlalchemy/databases/postgres.py | 2 +- lib/sqlalchemy/databases/sqlite.py | 2 +- lib/sqlalchemy/engine/base.py | 9 +++++++-- 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 69b082e414..803cba6d32 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 6008ae61c9..b5bd72e8f2 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 e3ac3ae2c6..7eee35320f 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 6d1e56a7c7..dda488f9c0 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 77ab866c71..c7b5d93fe6 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 94c01f3249..06409377cd 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 -- 2.47.2