amount of risk to compatibility w/ older or alternate Postgresql
databases.
+ .. change:: 4006
+ :tags: bug, postgresql
+ :tickets: 4006
+ :versions: 1.2.0b1
+
+ Fixed bug where using :class:`.ARRAY` with a string type that
+ features a collation would fail to produce the correct syntax
+ within CREATE TABLE.
+
.. change:: 3994
:tags: bug, mssql
:tickets: 3994
return "BYTEA"
def visit_ARRAY(self, type_, **kw):
- return self.process(type_.item_type) + ('[]' * (type_.dimensions
- if type_.dimensions
- is not None else 1))
+
+ # TODO: pass **kw?
+ inner = self.process(type_.item_type)
+ return re.sub(
+ r'((?: COLLATE.*)?)$',
+ (r'[]\1' *
+ (type_.dimensions if type_.dimensions is not None else 1)),
+ inner
+ )
class PGIdentifierPreparer(compiler.IdentifierPreparer):
class ArrayTest(AssertsCompiledSQL, fixtures.TestBase):
__dialect__ = 'postgresql'
+ def test_array_type_render_str(self):
+ self.assert_compile(
+ postgresql.ARRAY(Unicode(30)),
+ "VARCHAR(30)[]"
+ )
+
+ def test_array_type_render_str_collate(self):
+ self.assert_compile(
+ postgresql.ARRAY(Unicode(30, collation="en_US")),
+ 'VARCHAR(30)[] COLLATE "en_US"'
+ )
+
def test_array_int_index(self):
col = column('x', postgresql.ARRAY(Integer))
self.assert_compile(
assert isinstance(tbl.c.intarr.type.item_type, Integer)
assert isinstance(tbl.c.strarr.type.item_type, String)
+ @testing.provide_metadata
+ def test_array_str_collation(self):
+ m = self.metadata
+
+ t = Table(
+ 't', m, Column('data',
+ sqltypes.ARRAY(String(50, collation="en_US")))
+ )
+
+ t.create()
+
@testing.provide_metadata
def test_array_agg(self):
values_table = Table('values', self.metadata, Column('value', Integer))