diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-06-08 12:55:23 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-06-08 17:06:53 -0400 |
commit | ec422fb70e0044ed42dcfda5fb1a7a65db322cf1 (patch) | |
tree | c8b2f949883eb31d12511ac9d3c5c565afc73017 /lib/sqlalchemy/dialects/postgresql/base.py | |
parent | b6d3f60791834ead92564fc58afebc2c3eb4a2ff (diff) | |
download | sqlalchemy-ec422fb70e0044ed42dcfda5fb1a7a65db322cf1.tar.gz |
Render ARRAY index embedded between type and COLLATE
Fixed bug where using :class:`.ARRAY` with a string type that
features a collation would fail to produce the correct syntax
within CREATE TABLE.
The "COLLATE" must appear to the right of the array dimensions,
so we are using regexp substitution to insert the brackets in the
appropriate place. A more heavyweight solution would be that datatypes
know how to split up their base type vs. modifiers, but as this is
so specific to Postgresql ARRAY it's better to handle these cases
more locally.
Change-Id: I394c3c673eb60689e51b5301e51651972cfdb4c0
Fixes: #4006
Diffstat (limited to 'lib/sqlalchemy/dialects/postgresql/base.py')
-rw-r--r-- | lib/sqlalchemy/dialects/postgresql/base.py | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index e583bd5cf..b56ac5b10 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -1873,9 +1873,15 @@ class PGTypeCompiler(compiler.GenericTypeCompiler): 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): |