diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-01-24 18:41:30 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-01-24 18:41:30 +0000 |
| commit | dd01f817b738a81bf9e5e4632387454f0f177dd6 (patch) | |
| tree | 4102b7da0d399469b0f0648f84ff2cfe5b558d43 /lib | |
| parent | 9806d81675ef62363753a028ada43bc460728cf5 (diff) | |
| download | sqlalchemy-dd01f817b738a81bf9e5e4632387454f0f177dd6.tar.gz | |
- oracle + firebird: "case sensitivity" feature will detect an all-lowercase
case-sensitive column name during reflect and add
"quote=True" to the generated Column, so that proper
quoting is maintained.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sqlalchemy/dialects/firebird/base.py | 6 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/oracle/base.py | 7 | ||||
| -rw-r--r-- | lib/sqlalchemy/engine/reflection.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/test/requires.py | 9 |
4 files changed, 21 insertions, 5 deletions
diff --git a/lib/sqlalchemy/dialects/firebird/base.py b/lib/sqlalchemy/dialects/firebird/base.py index aab217450..e4a2c568a 100644 --- a/lib/sqlalchemy/dialects/firebird/base.py +++ b/lib/sqlalchemy/dialects/firebird/base.py @@ -484,7 +484,8 @@ class FBDialect(default.DefaultDialect): if row is None: break name = self.normalize_name(row['fname']) - + orig_colname = row['fname'] + # get the data type colspec = row['ftype'].rstrip() coltype = self.ischema_names.get(colspec) @@ -523,6 +524,9 @@ class FBDialect(default.DefaultDialect): 'nullable' : not bool(row['null_flag']), 'default' : defvalue } + + if orig_colname.lower() == orig_colname: + col_d['quote'] = True # if the PK is a single field, try to see if its linked to # a sequence thru a trigger diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index 926796961..bb9ed3250 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -718,8 +718,8 @@ class OracleDialect(default.DefaultDialect): table_name=table_name, owner=schema) for row in c: - (colname, coltype, length, precision, scale, nullable, default) = \ - (self.normalize_name(row[0]), row[1], row[2], row[3], row[4], row[5]=='Y', row[6]) + (colname, orig_colname, coltype, length, precision, scale, nullable, default) = \ + (self.normalize_name(row[0]), row[0], row[1], row[2], row[3], row[4], row[5]=='Y', row[6]) if coltype == 'NUMBER' : coltype = NUMBER(precision, scale) @@ -740,6 +740,9 @@ class OracleDialect(default.DefaultDialect): 'nullable': nullable, 'default': default, } + if orig_colname.lower() == orig_colname: + cdict['quote'] = True + columns.append(cdict) return columns diff --git a/lib/sqlalchemy/engine/reflection.py b/lib/sqlalchemy/engine/reflection.py index 0d49b38bc..57f2205c1 100644 --- a/lib/sqlalchemy/engine/reflection.py +++ b/lib/sqlalchemy/engine/reflection.py @@ -292,7 +292,9 @@ class Inspector(object): } if 'autoincrement' in col_d: col_kw['autoincrement'] = col_d['autoincrement'] - + if 'quote' in col_d: + col_kw['quote'] = col_d['quote'] + colargs = [] if col_d.get('default') is not None: # the "default" value is assumed to be a literal SQL expression, diff --git a/lib/sqlalchemy/test/requires.py b/lib/sqlalchemy/test/requires.py index be6ae9594..4f6c81a20 100644 --- a/lib/sqlalchemy/test/requires.py +++ b/lib/sqlalchemy/test/requires.py @@ -9,8 +9,10 @@ from testing import \ _block_unconditionally as no_support, \ _chain_decorators_on, \ exclude, \ - emits_warning_on + emits_warning_on,\ + skip_if +import testing def deferrable_constraints(fn): """Target database must support derferable constraints.""" @@ -106,6 +108,11 @@ def savepoints(fn): exclude('mysql', '<', (5, 0, 3), 'not supported by database'), ) +def denormalized_names(fn): + """Target database must have 'denormalized', i.e. UPPERCASE as case insensitive names.""" + + return skip_if(lambda: not testing.db.dialect.requires_name_normalize)(fn) + def schemas(fn): """Target database must support external schemas, and have one named 'test_schema'.""" |
