column_reflect can't allow non textual default parameter

Issue #3905 resolved
Mike Bayer repo owner created an issue
diff --git a/test/engine/test_reflection.py b/test/engine/test_reflection.py
index 0bc5b11..0e02d85 100644
--- a/test/engine/test_reflection.py
+++ b/test/engine/test_reflection.py
@@ -1,13 +1,14 @@
 import unicodedata
 import sqlalchemy as sa
-from sqlalchemy import schema, inspect
+from sqlalchemy import schema, inspect, sql
 from sqlalchemy import MetaData, Integer, String, Index, ForeignKey, \
-    UniqueConstraint
+    UniqueConstraint, FetchedValue, DefaultClause
 from sqlalchemy.testing import (
     ComparesTables, engines, AssertsCompiledSQL,
     fixtures, skip)
 from sqlalchemy.testing.schema import Table, Column
-from sqlalchemy.testing import eq_, assert_raises, assert_raises_message
+from sqlalchemy.testing import eq_, is_true, assert_raises, \
+    assert_raises_message
 from sqlalchemy import testing
 from sqlalchemy.util import ue
 from sqlalchemy.testing import config
@@ -1770,3 +1771,33 @@ class ColumnEventsTest(fixtures.RemovesEvents, fixtures.TestBase):
             "x", {"info": {"a": "b"}},
             lambda table: eq_(table.c.x.info, {"a": "b"})
         )
+
+    def test_override_server_default_fetchedvalue(self):
+        my_default = FetchedValue()
+        self._do_test(
+            "x", {"default": my_default},
+            lambda table: eq_(table.c.x.server_default, my_default)
+        )
+
+    def test_override_server_default_default_clause(self):
+        my_default = DefaultClause("1")
+        self._do_test(
+            "x", {"default": my_default},
+            lambda table: eq_(table.c.x.server_default, my_default)
+        )
+
+    def test_override_server_default_plain_text(self):
+        my_default = "1"
+
+        def assert_text_of_one(table):
+            is_true(
+                isinstance(
+                    table.c.x.server_default.arg, sql.elements.TextClause)
+            )
+            eq_(
+                str(table.c.x.server_default.arg), "1"
+            )
+        self._do_test(
+            "x", {"default": my_default},
+            assert_text_of_one
+        )

Comments (1)

  1. Mike Bayer reporter

    Accept FetchedValue, text() for column "default" value

    Fixed bug whereby the :meth:.DDLEvents.column_reflect event would not allow a non-textual expression to be passed as the value of the "default" for the new column, such as a :class:.FetchedValue object to indicate a generic triggered default or a :func:.sql.expression.text construct. Clarified the documentation in this regard as well.

    Fixes: #3905

    Change-Id: I829796c3e9f87f375149bebee7eef133a6876d4d

    → <<cset 388d8db68d0d>>

  2. Log in to comment