diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-09-19 16:11:16 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-09-19 16:11:16 -0400 |
| commit | 90c8d8e0c9e2d0a9eeace7fa326df26a5f28465a (patch) | |
| tree | 48b1e7fa44d5368f56be00c78c0e3d647186c497 /lib/sqlalchemy/dialects | |
| parent | e4bc7d289477e22815f4c6ab86b3f0c1bf356e08 (diff) | |
| parent | c5c8cdf3b4d7dc456cfef29ea04b2b7300060c7a (diff) | |
| download | sqlalchemy-90c8d8e0c9e2d0a9eeace7fa326df26a5f28465a.tar.gz | |
merge tip
Diffstat (limited to 'lib/sqlalchemy/dialects')
| -rw-r--r-- | lib/sqlalchemy/dialects/firebird/base.py | 3 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/informix/base.py | 27 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/informix/informixdb.py | 11 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/mssql/base.py | 2 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/oracle/base.py | 35 |
5 files changed, 49 insertions, 29 deletions
diff --git a/lib/sqlalchemy/dialects/firebird/base.py b/lib/sqlalchemy/dialects/firebird/base.py index 04439afb9..1eb2549c9 100644 --- a/lib/sqlalchemy/dialects/firebird/base.py +++ b/lib/sqlalchemy/dialects/firebird/base.py @@ -571,9 +571,10 @@ class FBDialect(default.DefaultDialect): if row['fdefault'] is not None: # the value comes down as "DEFAULT 'value'": there may be # more than one whitespace around the "DEFAULT" keyword + # and it may also be lower case # (see also http://tracker.firebirdsql.org/browse/CORE-356) defexpr = row['fdefault'].lstrip() - assert defexpr[:8].rstrip() == \ + assert defexpr[:8].rstrip().upper() == \ 'DEFAULT', "Unrecognized default value: %s" % \ defexpr defvalue = defexpr[8:].strip() diff --git a/lib/sqlalchemy/dialects/informix/base.py b/lib/sqlalchemy/dialects/informix/base.py index bc7b6c3e7..242b8a328 100644 --- a/lib/sqlalchemy/dialects/informix/base.py +++ b/lib/sqlalchemy/dialects/informix/base.py @@ -105,29 +105,20 @@ class InfoSQLCompiler(compiler.SQLCompiler): s += "" return s - def visit_select(self, select): - # the column in order by clause must in select too - - def __label(c): - try: - return c._label.lower() - except: - return '' - - # TODO: dont modify the original select, generate a new one - a = [__label(c) for c in select._raw_columns] - for c in select._order_by_clause.clauses: - if __label(c) not in a: - select.append_column(c) - - return compiler.SQLCompiler.visit_select(self, select) + def visit_select(self, select, asfrom=False, parens=True, **kw): + text = compiler.SQLCompiler.visit_select(self, select, asfrom, parens, **kw) + if asfrom and parens and self.dialect.server_version_info < (11,): + #assuming that 11 version doesn't need this, not tested + return "table(multiset" + text + ")" + else: + return text def limit_clause(self, select): if select._offset is not None and select._offset > 0: raise NotImplementedError("Informix does not support OFFSET") return "" - def visit_function(self, func): + def visit_function(self, func, **kw): if func.name.lower() == 'current_date': return "today" elif func.name.lower() == 'current_time': @@ -135,7 +126,7 @@ class InfoSQLCompiler(compiler.SQLCompiler): elif func.name.lower() in ('current_timestamp', 'now'): return "CURRENT YEAR TO SECOND" else: - return compiler.SQLCompiler.visit_function(self, func) + return compiler.SQLCompiler.visit_function(self, func, **kw) class InfoDDLCompiler(compiler.DDLCompiler): diff --git a/lib/sqlalchemy/dialects/informix/informixdb.py b/lib/sqlalchemy/dialects/informix/informixdb.py index 54e5a994a..8edcc953b 100644 --- a/lib/sqlalchemy/dialects/informix/informixdb.py +++ b/lib/sqlalchemy/dialects/informix/informixdb.py @@ -31,10 +31,13 @@ class InformixDialect_informixdb(InformixDialect): def _get_server_version_info(self, connection): # http://informixdb.sourceforge.net/manual.html#inspecting-version-numbers - vers = connection.dbms_version - - # TODO: not tested - return tuple([int(x) for x in vers.split('.')]) + version = [] + for n in connection.connection.dbms_version.split('.'): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) def is_disconnect(self, e): if isinstance(e, self.dbapi.OperationalError): diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index 089d2f71d..a17b2484d 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -104,7 +104,7 @@ Compatibility Levels MSSQL supports the notion of setting compatibility levels at the database level. This allows, for instance, to run a database that is compatibile with SQL2000 while running on a SQL2005 database -server. ``server_version_info`` will always retrun the database +server. ``server_version_info`` will always return the database server version information (in this case SQL2005) and not the compatibiility level information. Because of this, if running under a backwards compatibility mode SQAlchemy may attempt to use T-SQL diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index 4c153dac2..0aa348953 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -899,11 +899,22 @@ class OracleDialect(default.DefaultDialect): uniqueness = dict(NONUNIQUE=False, UNIQUE=True) oracle_sys_col = re.compile(r'SYS_NC\d+\$', re.IGNORECASE) + + def upper_name_set(names): + return set([i.upper() for i in names]) + + pk_names = upper_name_set(pkeys) + + def remove_if_primary_key(index): + # don't include the primary key index + if index is not None and \ + upper_name_set(index['column_names']) == pk_names: + indexes.pop() + + index = None for rset in rp: - # don't include the primary key columns - if rset.column_name in [s.upper() for s in pkeys]: - continue if rset.index_name != last_index_name: + remove_if_primary_key(index) index = dict(name=self.normalize_name(rset.index_name), column_names=[]) indexes.append(index) index['unique'] = uniqueness.get(rset.uniqueness, False) @@ -913,6 +924,7 @@ class OracleDialect(default.DefaultDialect): if not oracle_sys_col.match(rset.column_name): index['column_names'].append(self.normalize_name(rset.column_name)) last_index_name = rset.index_name + remove_if_primary_key(index) return indexes @reflection.cache @@ -945,7 +957,6 @@ class OracleDialect(default.DefaultDialect): constraint_data = rp.fetchall() return constraint_data - @reflection.cache def get_primary_keys(self, connection, table_name, schema=None, **kw): """ @@ -956,7 +967,10 @@ class OracleDialect(default.DefaultDialect): dblink """ + return self._get_primary_keys(connection, table_name, schema, **kw)[0] + @reflection.cache + def _get_primary_keys(self, connection, table_name, schema=None, **kw): resolve_synonyms = kw.get('oracle_resolve_synonyms', False) dblink = kw.get('dblink', '') info_cache = kw.get('info_cache') @@ -966,6 +980,7 @@ class OracleDialect(default.DefaultDialect): resolve_synonyms, dblink, info_cache=info_cache) pkeys = [] + constraint_name = None constraint_data = self._get_constraint_data(connection, table_name, schema, dblink, info_cache=kw.get('info_cache')) @@ -975,8 +990,18 @@ class OracleDialect(default.DefaultDialect): (cons_name, cons_type, local_column, remote_table, remote_column, remote_owner) = \ row[0:2] + tuple([self.normalize_name(x) for x in row[2:6]]) if cons_type == 'P': + if constraint_name is None: + constraint_name = self.normalize_name(cons_name) pkeys.append(local_column) - return pkeys + return pkeys, constraint_name + + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + cols, name = self._get_primary_keys(connection, table_name, schema=schema, **kw) + + return { + 'constrained_columns':cols, + 'name':name + } @reflection.cache def get_foreign_keys(self, connection, table_name, schema=None, **kw): |
