summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES6
-rw-r--r--lib/sqlalchemy/databases/oracle.py13
-rw-r--r--lib/sqlalchemy/engine/default.py8
-rw-r--r--test/sql/defaults.py6
-rw-r--r--test/sql/testtypes.py8
-rw-r--r--test/testbase.py2
6 files changed, 24 insertions, 19 deletions
diff --git a/CHANGES b/CHANGES
index 799690921..d8d4f4e56 100644
--- a/CHANGES
+++ b/CHANGES
@@ -25,6 +25,12 @@
duplicate column names are present.
- fixed use_alter flag on ForeignKeyConstraint [ticket:503]
- fixed usage of 2.4-only "reversed" in topological.py [ticket:506]
+- oracle:
+ - got binary working for any size input ! cx_oracle works fine,
+ it was my fault as BINARY was being passed and not BLOB for
+ setinputsizes (also unit tests werent even setting input sizes).
+ - auto_setinputsizes defaults to True for Oracle, fixed cases where
+ it improperly propigated bad types.
- orm:
- the full featureset of the SelectResults extension has been merged
into a new set of methods available off of Query. These methods
diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py
index 8d112fc46..966834eb2 100644
--- a/lib/sqlalchemy/databases/oracle.py
+++ b/lib/sqlalchemy/databases/oracle.py
@@ -51,6 +51,9 @@ class OracleTimestamp(sqltypes.DateTime):
return dialect.TIMESTAMP
class OracleText(sqltypes.TEXT):
+ def get_dbapi_type(self, dbapi):
+ return dbapi.CLOB
+
def get_col_spec(self):
return "CLOB"
@@ -68,17 +71,13 @@ class OracleChar(sqltypes.CHAR):
class OracleBinary(sqltypes.Binary):
def get_dbapi_type(self, dbapi):
- return dbapi.BINARY
+ return dbapi.BLOB
def get_col_spec(self):
return "BLOB"
def convert_bind_param(self, value, dialect):
- if value is None:
- return None
- else:
- # this is RAWTOHEX
- return ''.join(["%.2X" % ord(c) for c in value])
+ return value
def convert_result_value(self, value, dialect):
if value is None:
@@ -149,7 +148,7 @@ class OracleExecutionContext(default.DefaultExecutionContext):
self.set_input_sizes(proxy(), parameters)
class OracleDialect(ansisql.ANSIDialect):
- def __init__(self, use_ansi=True, auto_setinputsizes=False, module=None, threaded=True, **kwargs):
+ def __init__(self, use_ansi=True, auto_setinputsizes=True, module=None, threaded=True, **kwargs):
self.use_ansi = use_ansi
self.threaded = threaded
if module is None:
diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py
index ef0a6cc57..c6e0d9dc4 100644
--- a/lib/sqlalchemy/engine/default.py
+++ b/lib/sqlalchemy/engine/default.py
@@ -193,14 +193,18 @@ class DefaultExecutionContext(base.ExecutionContext):
for params in plist[0:1]:
for key in params.positional:
typeengine = params.binds[key].type
- inputsizes.append(typeengine.get_dbapi_type(self.dialect.module))
+ dbtype = typeengine.dialect_impl(self.dialect).get_dbapi_type(self.dialect.module)
+ if dbtype is not None:
+ inputsizes.append(dbtype)
cursor.setinputsizes(*inputsizes)
else:
inputsizes = {}
for params in plist[0:1]:
for key in params.keys():
typeengine = params.binds[key].type
- inputsizes[key] = typeengine.get_dbapi_type(self.dialect.module)
+ dbtype = typeengine.dialect_impl(self.dialect).get_dbapi_type(self.dialect.module)
+ if dbtype is not None:
+ inputsizes[key] = dbtype
cursor.setinputsizes(**inputsizes)
def _process_defaults(self, engine, proxy, compiled, parameters):
diff --git a/test/sql/defaults.py b/test/sql/defaults.py
index f82ca7f5f..0bc1a6b2e 100644
--- a/test/sql/defaults.py
+++ b/test/sql/defaults.py
@@ -24,13 +24,13 @@ class DefaultTest(PersistTest):
# also correct for "current_date" compatible as column default, value differences
currenttime = func.current_date(type=Date, engine=db);
if is_oracle:
- ts = db.func.trunc(func.sysdate(), column("'DAY'")).scalar()
+ ts = db.func.trunc(func.sysdate(), literal_column("'DAY'")).scalar()
f = select([func.count(1) + 5], engine=db).scalar()
f2 = select([func.count(1) + 14], engine=db).scalar()
# TODO: engine propigation across nested functions not working
- currenttime = func.trunc(currenttime, column("'DAY'"), engine=db)
+ currenttime = func.trunc(currenttime, literal_column("'DAY'"), engine=db)
def1 = currenttime
- def2 = func.trunc(text("sysdate"), column("'DAY'"))
+ def2 = func.trunc(text("sysdate"), literal_column("'DAY'"))
deftype = Date
elif use_function_defaults:
f = select([func.count(1) + 5], engine=db).scalar()
diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py
index 411e39406..97e95d389 100644
--- a/test/sql/testtypes.py
+++ b/test/sql/testtypes.py
@@ -203,12 +203,8 @@ class BinaryTest(AssertMixin):
testobj1 = pickleable.Foo('im foo 1')
testobj2 = pickleable.Foo('im foo 2')
- if db.name == 'oracle':
- stream1 =self.load_stream('binary_data_one.dat', len=2000)
- stream2 =self.load_stream('binary_data_two.dat', len=2000)
- else:
- stream1 =self.load_stream('binary_data_one.dat')
- stream2 =self.load_stream('binary_data_two.dat')
+ stream1 =self.load_stream('binary_data_one.dat')
+ stream2 =self.load_stream('binary_data_two.dat')
binary_table.insert().execute(primary_id=1, misc='binary_data_one.dat', data=stream1, data_slice=stream1[0:100], pickled=testobj1)
binary_table.insert().execute(primary_id=2, misc='binary_data_two.dat', data=stream2, data_slice=stream2[0:99], pickled=testobj2)
binary_table.insert().execute(primary_id=3, misc='binary_data_two.dat', data=None, data_slice=stream2[0:99], pickled=None)
diff --git a/test/testbase.py b/test/testbase.py
index 1dbd654c7..47ddaec8b 100644
--- a/test/testbase.py
+++ b/test/testbase.py
@@ -75,7 +75,7 @@ def parse_argv():
db_uri = 'oracle://scott:tiger@127.0.0.1:1521'
elif DBTYPE == 'oracle8':
db_uri = 'oracle://scott:tiger@127.0.0.1:1521'
- opts = {'use_ansi':False, 'auto_setinputsizes':True}
+ opts = {'use_ansi':False}
elif DBTYPE == 'mssql':
db_uri = 'mssql://scott:tiger@SQUAWK\\SQLEXPRESS/test'
elif DBTYPE == 'firebird':