# this can be "NULL" in the case of TIMESTAMP
if spec.get("notnull", False) == "NOT NULL":
col_kw["nullable"] = False
+ # For generated columns, the nullability is marked in a different place
+ if spec.get("notnull_generated", False) == "NOT NULL":
+ col_kw["nullable"] = False
# AUTO_INCREMENT
if spec.get("autoincr", False):
r"(?: +ON UPDATE [\-\w\.\(\)]+)?)"
r"))?"
r"(?: +(?:GENERATED ALWAYS)? ?AS +(?P<generated>\("
- r".*\))? ?(?P<persistence>VIRTUAL|STORED)?)?"
+ r".*\))? ?(?P<persistence>VIRTUAL|STORED)?"
+ r"(?: +(?P<notnull_generated>(?:NOT )?NULL))?"
+ r")?"
r"(?: +(?P<autoincr>AUTO_INCREMENT))?"
r"(?: +COMMENT +'(?P<comment>(?:''|[^'])*)')?"
r"(?: +COLUMN_FORMAT +(?P<colfmt>\w+))?"
["s TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"],
["t TIMESTAMP"],
["u TIMESTAMP DEFAULT CURRENT_TIMESTAMP"],
+ ["v INTEGER GENERATED ALWAYS AS (4711) VIRTUAL NOT NULL"],
]
):
Table("nn_t%d" % idx, meta) # to allow DROP
else False,
"default": current_timestamp,
},
+ {"name": "v", "nullable": False, "default": None},
],
)