# "CHECK (((a > 1) AND (a < 5)))"
# "CHECK (((a = 1) OR ((a > 2) AND (a < 5))))"
# "CHECK (((a > 1) AND (a < 5))) NOT VALID"
- m = re.match(r"^CHECK *\(\((.+)\)\)( NOT VALID)?$", src)
+ # "CHECK (some_boolean_function(a))"
+ m = re.match(r"^CHECK *\((.+)\)( NOT VALID)?$", src)
if not m:
util.warn("Could not parse CHECK constraint text: %r" % src)
sqltext = ""
else:
- sqltext = m.group(1)
+ sqltext = re.sub(r'^\((.+)\)$', r'\1', m.group(1))
entry = {"name": name, "sqltext": sqltext}
if m and m.group(2):
entry["dialect_options"] = {"not_valid": True}
def test_reflect_check_constraint(self):
meta = self.metadata
- cc_table = Table(
+ udf_create = """\
+ CREATE OR REPLACE FUNCTION is_positive(
+ x integer DEFAULT '-1'::integer)
+ RETURNS boolean
+ LANGUAGE 'plpgsql'
+ COST 100
+ VOLATILE
+ AS $BODY$BEGIN
+ RETURN x > 0;
+ END;$BODY$;
+ """
+ sa.event.listen(meta, "before_create",
+ sa.DDL(udf_create))
+ sa.event.listen(meta, "after_drop",
+ sa.DDL("DROP FUNCTION is_positive(integer)"))
+
+ Table(
"pgsql_cc",
meta,
Column("a", Integer()),
CheckConstraint("a > 1 AND a < 5", name="cc1"),
CheckConstraint("a = 1 OR (a > 2 AND a < 5)", name="cc2"),
+ CheckConstraint("is_positive(a)", name="cc3"),
)
- cc_table.create()
+ meta.create_all()
- reflected = Table("pgsql_cc", MetaData(testing.db), autoload=True)
+ reflected = Table("pgsql_cc", MetaData(), autoload_with=testing.db)
check_constraints = dict(
(uc.name, uc.sqltext.text)
{
u"cc1": u"(a > 1) AND (a < 5)",
u"cc2": u"(a = 1) OR ((a > 2) AND (a < 5))",
+ u"cc3": u"is_positive(a)",
},
)