summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/dialects/firebird/base.py4
-rw-r--r--lib/sqlalchemy/sql/expression.py2
-rw-r--r--test/dialect/test_firebird.py40
4 files changed, 45 insertions, 5 deletions
diff --git a/CHANGES b/CHANGES
index c68278436..860057db2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -629,6 +629,10 @@ underneath "0.7.xx".
as "NOT STARTING WITH", using FB's more efficient
operator. [ticket:2470]
+ - [bug] CompileError is raised when VARCHAR with
+ no length is attempted to be emitted, same
+ way as MySQL. [ticket:2505]
+
- mysql
- [bug] Dialect no longer emits expensive server
collations query, as well as server casing,
diff --git a/lib/sqlalchemy/dialects/firebird/base.py b/lib/sqlalchemy/dialects/firebird/base.py
index b4b856804..e8e60da2b 100644
--- a/lib/sqlalchemy/dialects/firebird/base.py
+++ b/lib/sqlalchemy/dialects/firebird/base.py
@@ -192,6 +192,10 @@ class FBTypeCompiler(compiler.GenericTypeCompiler):
return self._extend_string(type_, basic)
def visit_VARCHAR(self, type_):
+ if not type_.length:
+ raise exc.CompileError(
+ "VARCHAR requires a length on dialect %s" %
+ self.dialect.name)
basic = super(FBTypeCompiler, self).visit_VARCHAR(type_)
return self._extend_string(type_, basic)
diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py
index a817a2e5b..6b8010601 100644
--- a/lib/sqlalchemy/sql/expression.py
+++ b/lib/sqlalchemy/sql/expression.py
@@ -26,6 +26,7 @@ to stay the same in future releases.
"""
+
import itertools
import re
from operator import attrgetter
@@ -553,7 +554,6 @@ def between(ctest, cleft, cright):
ctest = _literal_as_binds(ctest)
return ctest.between(cleft, cright)
-
def case(whens, value=None, else_=None):
"""Produce a ``CASE`` statement.
diff --git a/test/dialect/test_firebird.py b/test/dialect/test_firebird.py
index 41533dbbd..aa57711e4 100644
--- a/test/dialect/test_firebird.py
+++ b/test/dialect/test_firebird.py
@@ -1,10 +1,15 @@
-from test.lib.testing import eq_, assert_raises
-from sqlalchemy import *
+from test.lib.testing import eq_, assert_raises_message
+from sqlalchemy import exc
from sqlalchemy.databases import firebird
from sqlalchemy.exc import ProgrammingError
from sqlalchemy.sql import table, column
-from test.lib import *
-
+from sqlalchemy import types as sqltypes
+from test.lib import fixtures, AssertsExecutionResults, AssertsCompiledSQL
+from test.lib import testing, engines
+from sqlalchemy import String, VARCHAR, NVARCHAR, Unicode, Integer,\
+ func, insert, update, MetaData, select, Table, Column, text,\
+ Sequence, Float
+from sqlalchemy import schema
class DomainReflectionTest(fixtures.TestBase, AssertsExecutionResults):
"Test Firebird domains"
@@ -248,6 +253,33 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL):
'FROM sometable sometable_1',
dialect=dialect)
+ def test_varchar_raise(self):
+ for type_ in (
+ String,
+ VARCHAR,
+ String(),
+ VARCHAR(),
+ Unicode,
+ Unicode(),
+ ):
+ type_ = sqltypes.to_instance(type_)
+ assert_raises_message(
+ exc.CompileError,
+ "VARCHAR requires a length on dialect firebird",
+ type_.compile,
+ dialect=firebird.dialect())
+
+ t1 = Table('sometable', MetaData(),
+ Column('somecolumn', type_)
+ )
+ assert_raises_message(
+ exc.CompileError,
+ r"\(in table 'sometable', column 'somecolumn'\)\: "
+ r"(?:N)?VARCHAR requires a length on dialect firebird",
+ schema.CreateTable(t1).compile,
+ dialect=firebird.dialect()
+ )
+
def test_function(self):
self.assert_compile(func.foo(1, 2), 'foo(:foo_1, :foo_2)')
self.assert_compile(func.current_time(), 'CURRENT_TIME')