summaryrefslogtreecommitdiff
path: root/test/sql
diff options
context:
space:
mode:
authorGord Thompson <gord@gordthompson.com>2021-01-25 11:24:25 -0700
committerMike Bayer <mike_mp@zzzcomputing.com>2021-01-29 16:48:00 -0500
commit09e999808a5272a1426a7c00e3a4f27b2e27b8d7 (patch)
treecdc8f16b86d19fdc2c95496c8ad12e8f226ecb03 /test/sql
parentbead576769e655481cddb4623fad4bfa0aaccdda (diff)
downloadsqlalchemy-09e999808a5272a1426a7c00e3a4f27b2e27b8d7.tar.gz
Use schema._copy_expression() fully in column collection constraints
Fixed issue where using :meth:`_schema.Table.to_metadata` (called :meth:`_schema.Table.tometadata` in 1.3) in conjunction with a PostgreSQL :class:`_postgresql.ExcludeConstraint` that made use of ad-hoc column expressions would fail to copy correctly. Fixes: #5850 Change-Id: I062480afb23f6f60962b7b55bc93f5e4e6ff05e4
Diffstat (limited to 'test/sql')
-rw-r--r--test/sql/test_metadata.py50
1 files changed, 49 insertions, 1 deletions
diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py
index 17228dad6..4a592a476 100644
--- a/test/sql/test_metadata.py
+++ b/test/sql/test_metadata.py
@@ -40,6 +40,7 @@ from sqlalchemy.schema import DropIndex
from sqlalchemy.sql import naming
from sqlalchemy.sql import operators
from sqlalchemy.sql.elements import _NONE_NAME
+from sqlalchemy.sql.elements import literal_column
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
from sqlalchemy.testing import AssertsCompiledSQL
@@ -762,7 +763,7 @@ class MetaDataTest(fixtures.TestBase, ComparesTables):
eq_(repr(const), exp)
-class ToMetaDataTest(fixtures.TestBase, ComparesTables):
+class ToMetaDataTest(fixtures.TestBase, AssertsCompiledSQL, ComparesTables):
@testing.requires.check_constraints
def test_copy(self):
# TODO: modernize this test for 2.0
@@ -915,6 +916,53 @@ class ToMetaDataTest(fixtures.TestBase, ComparesTables):
a2 = a.to_metadata(m2)
assert b2.c.y.references(a2.c.x)
+ def test_column_collection_constraint_w_ad_hoc_columns(self):
+ """Test ColumnCollectionConstraint that has columns that aren't
+ part of the Table.
+
+ """
+ meta = MetaData()
+
+ uq1 = UniqueConstraint(literal_column("some_name"))
+ cc1 = CheckConstraint(literal_column("some_name") > 5)
+ table = Table(
+ "mytable",
+ meta,
+ Column("myid", Integer, primary_key=True),
+ Column("name", String(40), nullable=True),
+ uq1,
+ cc1,
+ )
+
+ self.assert_compile(
+ schema.AddConstraint(uq1),
+ "ALTER TABLE mytable ADD UNIQUE (some_name)",
+ dialect="default",
+ )
+ self.assert_compile(
+ schema.AddConstraint(cc1),
+ "ALTER TABLE mytable ADD CHECK (some_name > 5)",
+ dialect="default",
+ )
+ meta2 = MetaData()
+ table2 = table.to_metadata(meta2)
+ uq2 = [
+ c for c in table2.constraints if isinstance(c, UniqueConstraint)
+ ][0]
+ cc2 = [
+ c for c in table2.constraints if isinstance(c, CheckConstraint)
+ ][0]
+ self.assert_compile(
+ schema.AddConstraint(uq2),
+ "ALTER TABLE mytable ADD UNIQUE (some_name)",
+ dialect="default",
+ )
+ self.assert_compile(
+ schema.AddConstraint(cc2),
+ "ALTER TABLE mytable ADD CHECK (some_name > 5)",
+ dialect="default",
+ )
+
def test_change_schema(self):
meta = MetaData()