summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES3
-rw-r--r--lib/sqlalchemy/schema.py2
-rw-r--r--test/dialect/postgres.py21
3 files changed, 25 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 81dd74e1a..3f7f8ed31 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
- sql
- got connection-bound metadata to work with implicit execution
- cleanup to connection-bound sessions, SessionTransaction
+ - foreign key specs can have any chararcter in their identifiers
+ [ticket:667]
+
- postgres
- fixed max identifier length (63) [ticket:571]
diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py
index a6e3f5f29..f6ad52adc 100644
--- a/lib/sqlalchemy/schema.py
+++ b/lib/sqlalchemy/schema.py
@@ -727,7 +727,7 @@ class ForeignKey(SchemaItem):
break
else:
raise exceptions.ArgumentError("Parent column '%s' does not descend from a table-attached Column" % str(self.parent))
- m = re.match(r"^([\w_-]+)(?:\.([\w_-]+))?(?:\.([\w_-]+))?$", self._colspec, re.UNICODE)
+ m = re.match(r"^(.+?)(?:\.(.+?))?(?:\.(.+?))?$", self._colspec, re.UNICODE)
if m is None:
raise exceptions.ArgumentError("Invalid foreign key column specification: " + self._colspec)
if m.group(3) is None:
diff --git a/test/dialect/postgres.py b/test/dialect/postgres.py
index 8d62625c9..0507b7c5b 100644
--- a/test/dialect/postgres.py
+++ b/test/dialect/postgres.py
@@ -79,6 +79,27 @@ class MiscTest(AssertMixin):
m1.drop_all()
@testbase.supported('postgres')
+ def test_pg_weirdchar_reflection(self):
+ meta1 = MetaData(testbase.db)
+ subject = Table("subject", meta1,
+ Column("id$", Integer, primary_key=True),
+ )
+
+ referer = Table("referer", meta1,
+ Column("id", Integer, primary_key=True),
+ Column("ref", Integer, ForeignKey('subject.id$')),
+ )
+ meta1.create_all()
+ try:
+ meta2 = MetaData(testbase.db)
+ subject = Table("subject", meta2, autoload=True)
+ referer = Table("referer", meta2, autoload=True)
+ print str(subject.join(referer).onclause)
+ self.assert_((subject.c['id$']==referer.c.ref).compare(subject.join(referer).onclause))
+ finally:
+ meta1.drop_all()
+
+ @testbase.supported('postgres')
def test_checksfor_sequence(self):
meta1 = MetaData(testbase.db)
t = Table('mytable', meta1,