summaryrefslogtreecommitdiff
path: root/test/sql
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2018-07-10 09:41:21 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2018-07-10 22:38:52 -0400
commit532566ba1f28ff8a6afa6eacc10c59eb918501f6 (patch)
treec3b2d7ef4e07ca1b5919cfe0aa6415b64bfb3aec /test/sql
parentf7076ecf361f276f5ddb81f80931e5c88215e8ca (diff)
downloadsqlalchemy-532566ba1f28ff8a6afa6eacc10c59eb918501f6.tar.gz
Drop default-related structures after the Table is dropped.
Fixed bug where a :class:`.Sequence` would be dropped explicitly before any :class:`.Table` that refers to it, which breaks in the case when the sequence is also involved in a server-side default for that table, when using :meth:`.MetaData.drop_all`. The step which processes sequences to be dropped via non server-side column default functions is now invoked after the table itself is dropped. Change-Id: I185f2cc76d2011ad4dd3ba9bde5d8aef0ec335ae Fixes: #4300
Diffstat (limited to 'test/sql')
-rw-r--r--test/sql/test_defaults.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/test/sql/test_defaults.py b/test/sql/test_defaults.py
index 0d4eecf6a..42514a927 100644
--- a/test/sql/test_defaults.py
+++ b/test/sql/test_defaults.py
@@ -17,6 +17,7 @@ from sqlalchemy.util import u, b
from sqlalchemy import util
from sqlalchemy.testing import mock
import itertools
+from sqlalchemy.testing.assertsql import CompiledSQL, AllOf, EachOf
t = f = f2 = ts = currenttime = metadata = default_generator = None
@@ -1312,6 +1313,85 @@ class TableBoundSequenceTest(fixtures.TestBase):
(4, "name4", 4)])
+class SequenceAsServerDefaultTest(
+ testing.AssertsExecutionResults, fixtures.TablesTest):
+ __requires__ = ('sequences_as_server_defaults',)
+ __backend__ = True
+
+ run_create_tables = 'each'
+
+ @classmethod
+ def define_tables(cls, metadata):
+ m = metadata
+
+ s = Sequence("t_seq", metadata=m)
+ Table(
+ "t_seq_test", m,
+ Column("id", Integer, s, server_default=s.next_value()),
+ Column("data", String(50))
+ )
+
+ s2 = Sequence("t_seq_2", metadata=m)
+ Table(
+ "t_seq_test_2", m,
+ Column("id", Integer, server_default=s2.next_value()),
+ Column("data", String(50))
+ )
+
+ def test_default_textual_w_default(self):
+ with testing.db.connect() as conn:
+ conn.execute("insert into t_seq_test (data) values ('some data')")
+
+ eq_(conn.scalar("select id from t_seq_test"), 1)
+
+ def test_default_core_w_default(self):
+ t_seq_test = self.tables.t_seq_test
+ with testing.db.connect() as conn:
+ conn.execute(t_seq_test.insert().values(data="some data"))
+
+ eq_(conn.scalar(select([t_seq_test.c.id])), 1)
+
+ def test_default_textual_server_only(self):
+ with testing.db.connect() as conn:
+ conn.execute(
+ "insert into t_seq_test_2 (data) values ('some data')")
+
+ eq_(conn.scalar("select id from t_seq_test_2"), 1)
+
+ def test_default_core_server_only(self):
+ t_seq_test = self.tables.t_seq_test_2
+ with testing.db.connect() as conn:
+ conn.execute(t_seq_test.insert().values(data="some data"))
+
+ eq_(conn.scalar(select([t_seq_test.c.id])), 1)
+
+ def test_drop_ordering(self):
+ self.assert_sql_execution(
+ testing.db,
+ lambda: self.metadata.drop_all(checkfirst=False),
+ AllOf(
+ CompiledSQL(
+ "DROP TABLE t_seq_test_2",
+ {}
+ ),
+ EachOf(
+ CompiledSQL(
+ "DROP TABLE t_seq_test",
+ {}
+ ),
+ CompiledSQL(
+ "DROP SEQUENCE t_seq", # dropped as part of t_seq_test
+ {}
+ ),
+ ),
+ ),
+ CompiledSQL(
+ "DROP SEQUENCE t_seq_2", # dropped as part of metadata level
+ {}
+ ),
+ )
+
+
class SpecialTypePKTest(fixtures.TestBase):
"""test process_result_value in conjunction with primary key columns.