| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
`alter()` renames an attribute whose new comment opens with `{old_name}`. It looked for that marker in the compiled column SQL, where it is not always found. A core type or codec writes its `:type:` marker in front of the comment (`COMMENT ":float32:{value} ..."`), and PostgreSQL keeps comments out of the column SQL altogether. In both cases the rename went unnoticed: `alter()` dropped the old attribute and added the new one, and every value was lost. On MySQL, renaming `value : float32` to `reading : float32 # {value}` left `reading` at 0.0 in every row; on PostgreSQL, renaming a nullable attribute left it NULL. A required attribute on PostgreSQL failed with a NOT NULL error instead.
The marker is now read from the comment as declared, after any `:type:` marker. On MySQL the rename becomes a CHANGE, which keeps the values. PostgreSQL has no CHANGE, so `alter()` now refuses a rename there with a DataJointError before running anything, instead of dropping the attribute.
The new tests rename a required and a nullable core-type attribute of a table holding rows. On MySQL they check that the values survive; on PostgreSQL that the rename is refused and the table keeps its values. All four fail before this change.
(cherry picked from commit 6657b23)
|
Merging on the strength of #1634's review: this is the same commit, cherry-picked to maint/2.3 for v2.3.5, and its CI passes. |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Backport of #1634 to maint/2.3 for v2.3.5, cherry-picked unchanged.
alter() renames an attribute whose new comment opens with {old_name}. It looked for that marker in the compiled column SQL, where it is not always found. A core type or codec writes its :type: marker in front of the comment (COMMENT ":float32:{value} ..."), and PostgreSQL keeps comments out of the column SQL altogether. In both cases the rename went unnoticed: alter() dropped the old attribute and added the new one, and every value was lost. On MySQL, renaming value : float32 to reading : float32 # {value} left reading at 0.0 in every row; on PostgreSQL, renaming a nullable attribute left it NULL. A required attribute on PostgreSQL failed with a NOT NULL error instead.
The marker is now read from the comment as declared, after any :type: marker. On MySQL the rename becomes a CHANGE, which keeps the values. PostgreSQL has no CHANGE, so alter() now refuses a rename there with a DataJointError before running anything, instead of dropping the attribute.
The new tests rename a required and a nullable core-type attribute of a table holding rows. On MySQL they check that the values survive; on PostgreSQL that the rename is refused and the table keeps its values. All four fail before this change.
Fixes #1631.