MM-39351: fixes LastRootPostAt being null (#19574)

* MM-39351: fixes LastRootPostAt being null

After upgrading to v6.1 there is a chance for LastRootPostAt to be NULL.
This might be due to a faulty migration when upgrading to v5.35.

v5.35 had `create_msg_root_count` where LastRootPostAt was used as a
temporary column which at the end was deleted.
Then on v6.1 we are adding that column again, this time to keep.

If the migration to v5.35 had failed and it didn't drop the column
the `upgrade_cte` (v6.1) migration would leave some channels with `LastRootPostAt`
being NULL.

This resulted in crashing the app.

This commit fixes that by running again a migration to again set
LastRootPostAt only when it's NULL this time and then set it to 0
for channels that might still have LastRootPostAt being NULL
(channels with no posts).

PS: the whole issue arose when upon creating the `upgrade_cte` migration
the create_msg_root_count migration was manually edited to change
the column name from LastRootPostAt to LastRootAt.

Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
This commit is contained in:
Kyriakos Z
2022-02-22 12:13:04 +02:00
committed by GitHub
parent dbf779b828
commit 501d454af5
6 changed files with 192 additions and 1 deletions

View File

@@ -8,7 +8,7 @@ insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
[*.go]
[*.{go,sql}]
indent_style = tab
[*.{js,jsx,json,html}]

View File

@@ -150,6 +150,8 @@
// mysql/000074_upgrade_users_v6.3.up.sql
// mysql/000075_alter_upload_sessions_index.down.sql
// mysql/000075_alter_upload_sessions_index.up.sql
// mysql/000076_upgrade_lastrootpostat.down.sql
// mysql/000076_upgrade_lastrootpostat.up.sql
// postgres/000001_create_teams.down.sql
// postgres/000001_create_teams.up.sql
// postgres/000002_create_team_members.down.sql
@@ -300,6 +302,8 @@
// postgres/000074_upgrade_users_v6.3.up.sql
// postgres/000075_alter_upload_sessions_index.down.sql
// postgres/000075_alter_upload_sessions_index.up.sql
// postgres/000076_upgrade_lastrootpostat.down.sql
// postgres/000076_upgrade_lastrootpostat.up.sql
package migrations
import (
@@ -3376,6 +3380,46 @@ func mysql000075_alter_upload_sessions_indexUpSql() (*asset, error) {
return a, nil
}
var _mysql000076_upgrade_lastrootpostatDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x04\xc0\x31\x0a\x02\x31\x10\x05\xd0\xde\x53\xfc\xce\x6a\xc3\xd8\xe8\x71\x42\x48\x3e\xd9\x01\xf9\xa3\x9b\x71\xc5\xdb\xfb\xb6\x0d\x0a\x88\x1c\xc8\x40\xdf\x9b\x26\xd1\xf4\xcb\xdd\x35\xb1\x5c\x9d\xf0\xbc\x2e\xf4\x38\x79\x70\xc0\x05\x33\xb3\x87\xd5\xcf\x6b\x1e\x6d\xb0\xf6\x64\x3d\xef\xe5\x56\x46\x7c\x55\xd6\xfb\x79\xf9\x07\x00\x00\xff\xff\xa9\xaa\xb3\x07\x55\x00\x00\x00")
func mysql000076_upgrade_lastrootpostatDownSqlBytes() ([]byte, error) {
return bindataRead(
_mysql000076_upgrade_lastrootpostatDownSql,
"mysql/000076_upgrade_lastrootpostat.down.sql",
)
}
func mysql000076_upgrade_lastrootpostatDownSql() (*asset, error) {
bytes, err := mysql000076_upgrade_lastrootpostatDownSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "mysql/000076_upgrade_lastrootpostat.down.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
var _mysql000076_upgrade_lastrootpostatUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x53\xc1\x6e\x9b\x40\x10\x3d\xef\x7e\xc5\xeb\xc9\x50\x25\x96\x7b\x46\x54\x5a\xc3\x90\x50\xc1\x62\xc1\xa2\xa6\x27\x84\x02\xa9\x91\x52\x93\x98\x4d\xeb\xcf\xaf\x96\x05\xd7\x76\xaa\xa6\xed\x0d\x76\x66\xde\xbc\x79\x6f\x26\xc8\x49\x28\xc2\x26\xcf\x02\x0a\xcb\x9c\x90\x76\x5f\xf7\xb5\x6e\xab\xa4\x1e\x74\xde\xf7\x7a\xd3\x0f\x5a\xe8\x2a\x6c\x1f\xea\x97\x47\x0d\xc7\xe5\x6b\xba\x89\x25\x67\x71\x04\x87\x33\xc6\x0a\x4a\x28\x50\x08\xb2\x52\x2a\xe7\xbd\x8b\x28\xcf\x52\xc4\x32\xca\xf2\x54\xa8\x38\x93\x55\x11\xdc\x52\x2a\x96\x41\x96\x94\xa9\x2c\x4c\xc9\xe7\x5b\xca\x09\x4a\xac\x13\xaa\xa4\x48\x09\x3e\x16\xc1\xb6\xde\xed\xda\xc7\x61\x61\x12\x84\x0c\xa7\xb0\x2d\x86\x8f\x50\x28\xb1\x16\x05\x39\xee\x9c\x60\x01\x8f\x00\xe7\x84\x8f\x30\xce\x94\x16\x52\x24\xca\x44\x21\x2e\x20\xcb\x24\x41\x96\xe3\x22\xf2\xce\xc7\xca\x80\xbb\xf0\xf1\x01\xea\x96\x24\x67\x4c\x24\x8a\x72\xcb\x05\x33\x45\xd8\x47\x5b\x8e\xf3\xbe\x28\x48\x61\x46\x5c\x79\x9c\x91\x0c\x11\x47\x1e\x27\x19\x7a\x9c\x05\x22\x49\xde\x96\xd8\xe3\x2c\xcc\xb3\xcd\x89\x2b\x71\x04\xba\x8b\x0b\x55\xbc\x51\xec\x71\xfe\xb7\x8e\x46\xdd\xe1\xb5\x9b\x17\x66\x72\xc6\x46\x3b\xe7\xc9\xf9\xec\xdd\xc5\xd0\x93\xa8\x9c\xb9\xf8\x88\xd5\xa4\xdd\xf5\x35\x1e\xba\x43\x3b\xe0\x9b\x25\x80\x7b\xdd\xa2\xde\x35\x18\x5a\x3d\x40\x6f\xdb\x4b\x94\x87\x7e\x8f\xfb\x59\x63\xbd\xad\x35\x9a\x7e\xb7\xd0\xd8\xd6\xdf\x5b\x74\xda\xd4\x71\xc6\xca\x4d\x28\x14\x19\x7b\x4f\x58\xb1\x58\x4a\xca\xf1\x29\x8b\xa5\xdd\xca\x69\x92\xf1\xf3\x98\xb8\x8c\x9b\xb9\x41\xd7\x5c\x4d\xb1\x4c\x24\x54\x04\xe4\xa4\xe2\xce\x31\x44\x86\x65\xb0\x6f\x6b\xdd\x0a\xed\x5e\x61\xe5\x42\x14\x78\xac\x07\xbd\xef\x7b\xfd\xd4\x0f\x7a\xac\x32\xa2\x9c\x43\xdb\xbf\x84\x22\x65\x49\x8c\x48\x88\xb2\x3c\x20\xc4\x32\xa4\x3b\x38\x5d\x73\xa8\x0c\xc2\x50\x4d\x1c\xaa\xae\xa9\x5e\x9e\x1a\xe3\x4d\xad\x5d\x64\x12\xa7\x44\x7d\x4c\x6c\xec\x5b\xdc\x8c\x2d\x46\xf9\x6d\x33\x1b\x36\xfa\x8d\xd9\x8b\x71\xe5\xd9\x4d\x9e\x95\x1b\xac\xbf\xbc\x9a\x7c\x9c\xe4\xd9\x74\x79\x5e\x1e\x45\x80\x7f\xda\x73\x12\x6e\x52\xed\xc2\x1d\xff\xb5\x0c\x27\x64\x7e\xbf\x10\x1e\xe7\xcc\xec\xc1\xe8\xf8\x45\x8a\xee\xb1\xba\x3a\xf7\xfc\x47\xa7\xb7\xd8\xf5\x18\x55\x3a\x5a\xfd\xeb\xee\xcc\x6d\x9d\xa3\xf8\x2b\xfc\x69\x21\xff\xe9\xfe\xec\x41\xfc\xc7\xed\x45\xdd\xc1\xe3\x3f\x03\x00\x00\xff\xff\x8e\x6b\x3e\x5f\x49\x05\x00\x00")
func mysql000076_upgrade_lastrootpostatUpSqlBytes() ([]byte, error) {
return bindataRead(
_mysql000076_upgrade_lastrootpostatUpSql,
"mysql/000076_upgrade_lastrootpostat.up.sql",
)
}
func mysql000076_upgrade_lastrootpostatUpSql() (*asset, error) {
bytes, err := mysql000076_upgrade_lastrootpostatUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "mysql/000076_upgrade_lastrootpostat.up.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
var _postgres000001_create_teamsDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x90\xc1\x6a\x04\x21\x10\x44\xef\x7e\x45\x1f\x93\x6f\xf0\x34\xd9\x35\x30\x30\x19\xc3\xac\x81\xbd\x89\x68\x93\x34\x38\x2a\xea\x26\xf9\xfc\x30\xe3\x92\x1c\x72\x58\xf7\xd8\xd4\xab\xa2\xab\x0e\x8b\x18\x94\x80\x71\x3e\x8a\x33\x8c\xcf\x30\x4b\x05\xe2\x3c\x9e\xd4\x09\xc8\x7d\xeb\x8a\x66\x2d\x3a\x98\x15\x41\xce\xb0\x5f\xf0\xb0\x9d\x8f\x9c\xb1\x61\x52\x62\x01\x35\x3c\x4d\xe2\x2a\x1d\x17\xf9\x0a\x07\x39\xbd\xbd\xcc\x5b\xd8\x35\xc8\x78\x1f\xbf\x62\xc2\x40\xe1\x93\x2a\xf2\x6e\xa3\x37\xa5\x6e\x3a\xd9\x18\x2e\xc9\x99\x7b\xbc\x0e\x8b\xcd\x94\x2a\xc5\xd0\x6f\x7a\xcf\xf1\x92\x6c\x0c\xa5\x66\x43\x01\x1d\x67\x6c\x07\x7f\xe7\xf9\x37\x4d\xab\xa4\xc9\xf1\x5b\x64\x2b\xa0\x4d\xbd\x49\xda\x8c\x9d\xa4\x43\x8f\x7d\x64\xb1\x1f\xb8\xb6\x3f\x1b\xda\xc6\xf8\x43\x77\x8c\xb3\x9f\x00\x00\x00\xff\xff\x9c\xf4\x8f\xc0\x10\x02\x00\x00")
func postgres000001_create_teamsDownSqlBytes() ([]byte, error) {
@@ -6376,6 +6420,46 @@ func postgres000075_alter_upload_sessions_indexUpSql() (*asset, error) {
return a, nil
}
var _postgres000076_upgrade_lastrootpostatDownSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x04\xc0\x31\x0a\x02\x31\x10\x05\xd0\xde\x53\xfc\xce\x6a\xc3\xd8\xe8\x71\x42\x48\x3e\xd9\x01\xf9\xa3\x9b\x71\xc5\xdb\xfb\xb6\x0d\x0a\x88\x1c\xc8\x40\xdf\x9b\x26\xd1\xf4\xcb\xdd\x35\xb1\x5c\x9d\xf0\xbc\x2e\xf4\x38\x79\x70\xc0\x05\x33\xb3\x87\xd5\xcf\x6b\x1e\x6d\xb0\xf6\x64\x3d\xef\xe5\x56\x46\x7c\x55\xd6\xfb\x79\xf9\x07\x00\x00\xff\xff\xa9\xaa\xb3\x07\x55\x00\x00\x00")
func postgres000076_upgrade_lastrootpostatDownSqlBytes() ([]byte, error) {
return bindataRead(
_postgres000076_upgrade_lastrootpostatDownSql,
"postgres/000076_upgrade_lastrootpostat.down.sql",
)
}
func postgres000076_upgrade_lastrootpostatDownSql() (*asset, error) {
bytes, err := postgres000076_upgrade_lastrootpostatDownSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "postgres/000076_upgrade_lastrootpostat.down.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
var _postgres000076_upgrade_lastrootpostatUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x52\x5d\xaf\x9a\x40\x10\x7d\xde\xfd\x15\xd3\xc4\x64\xb5\xf1\x12\xfa\x7a\x0d\x4d\x50\xd6\x2b\x0d\x82\x01\x4c\xdb\xa7\x66\x85\xf5\x42\x82\xac\xba\x63\xdb\x9f\xdf\x2c\x5f\x57\x69\xd3\xe4\xbe\xc1\xce\xcc\x99\x73\xce\x1c\x2f\x82\xc9\x84\x2e\xf9\x8b\x1f\x52\xe2\xaf\x61\x4a\x09\x49\x78\xc0\x57\x29\x64\xea\x56\xe3\xf4\xe3\x8c\x12\xb2\x8e\xa3\x2d\x94\xf5\x51\x5d\x4f\x02\x4b\x55\xff\xd0\x59\x21\x4f\xc2\xca\x54\x75\x3b\xd5\x9a\x12\xf2\x75\xc3\x63\x0e\x28\x0e\x95\xec\x8a\x0e\x3b\xdf\x0e\x55\x99\x31\x4a\x88\x1b\x7a\x5d\xad\x16\x27\xe9\xb0\xac\x10\x75\x2d\x2b\xdd\xd7\x5a\x9c\xae\x58\x09\x8d\x57\xa5\xf0\xac\x34\x0a\xec\x5b\xa6\x5d\x4f\x2e\x8f\xe2\x56\x21\xf8\x09\x84\xfb\x20\x80\x28\x86\x51\xe5\x83\x03\x8c\x31\x9b\xb1\xe7\xe7\x43\xf9\x5a\xd6\xc8\x66\x94\xcc\xc0\x81\x4f\x90\x6e\x78\x68\xf0\x82\x94\xc7\x90\xba\xcb\x80\x43\x4f\x05\xda\xc7\x55\x14\xec\xb7\x21\x3c\x72\x80\x84\xa7\xe0\xf1\xb5\xbb\x0f\x52\x60\xf6\x00\xbc\xa0\x84\x87\x1e\xf8\xeb\x05\xe5\xa1\x37\x99\x2c\x28\x7d\x87\x9f\xab\x6e\xf3\xe0\x5e\x20\x34\xc6\x4a\xe1\x4e\x69\x74\x07\x85\x86\xfb\x67\xb0\x7b\xee\x4f\x4f\x70\x2c\x7f\x4b\x0d\xa7\xf2\xf5\x2a\x50\x42\x86\x12\x44\x9d\x83\x96\xa8\x01\x0b\x39\x86\x39\xaa\xeb\x9b\x48\x2c\x04\x42\xae\x6a\x86\x50\x88\x9f\x12\x4a\x34\x73\x86\x81\x9f\x6e\xe0\x02\x6e\xd2\x30\xee\x28\x9b\x2f\xd2\xd3\xb4\xfc\xbc\xc7\x29\xf3\x79\x5b\x8a\xdc\x80\x27\x2b\x3e\xdd\xba\xdf\xa6\x66\x9d\xb6\x56\x57\x29\x50\xba\x38\x9b\x83\x3d\x33\x70\xf7\x4e\x9a\x21\x23\xfd\x01\xd7\xfc\x04\x7c\x9d\xc2\x97\xc8\x78\x46\x08\x69\x90\xcc\x57\x14\xfe\xc5\xc0\x81\x6e\x4f\xfb\xe6\xe7\xa6\xa3\xb1\xef\x6d\xd4\x32\xea\x9b\x5e\x66\xd2\x43\x5e\xe2\x68\xbf\x83\xe5\xf7\x31\x18\x25\xc4\x1c\x63\xbf\xf3\xdc\xb4\x19\xbf\xa3\x94\xf0\x46\xfd\xc8\x4b\x07\x2e\xd6\x48\x50\xaf\xe7\x42\xef\x78\x5c\xac\xc1\x29\x70\xe0\x9e\xbf\x89\xf2\xf0\xff\xef\x83\x2f\x68\x7b\xe6\xe6\xa0\xa3\x16\x54\x60\xcf\x1f\x4f\xfa\xab\xc4\x02\x6a\x05\xe7\xce\xb5\x56\xce\xb0\xa4\xc9\xee\x23\x8a\x63\xc3\xff\x02\xf7\x98\x6a\x30\xb1\xfe\x13\x00\x00\xff\xff\xa1\xa8\x3e\x66\x26\x04\x00\x00")
func postgres000076_upgrade_lastrootpostatUpSqlBytes() ([]byte, error) {
return bindataRead(
_postgres000076_upgrade_lastrootpostatUpSql,
"postgres/000076_upgrade_lastrootpostat.up.sql",
)
}
func postgres000076_upgrade_lastrootpostatUpSql() (*asset, error) {
bytes, err := postgres000076_upgrade_lastrootpostatUpSqlBytes()
if err != nil {
return nil, err
}
info := bindataFileInfo{name: "postgres/000076_upgrade_lastrootpostat.up.sql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
a := &asset{bytes: bytes, info: info}
return a, nil
}
// Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
@@ -6578,6 +6662,8 @@ var _bindata = map[string]func() (*asset, error){
"mysql/000074_upgrade_users_v6.3.up.sql": mysql000074_upgrade_users_v63UpSql,
"mysql/000075_alter_upload_sessions_index.down.sql": mysql000075_alter_upload_sessions_indexDownSql,
"mysql/000075_alter_upload_sessions_index.up.sql": mysql000075_alter_upload_sessions_indexUpSql,
"mysql/000076_upgrade_lastrootpostat.down.sql": mysql000076_upgrade_lastrootpostatDownSql,
"mysql/000076_upgrade_lastrootpostat.up.sql": mysql000076_upgrade_lastrootpostatUpSql,
"postgres/000001_create_teams.down.sql": postgres000001_create_teamsDownSql,
"postgres/000001_create_teams.up.sql": postgres000001_create_teamsUpSql,
"postgres/000002_create_team_members.down.sql": postgres000002_create_team_membersDownSql,
@@ -6728,6 +6814,8 @@ var _bindata = map[string]func() (*asset, error){
"postgres/000074_upgrade_users_v6.3.up.sql": postgres000074_upgrade_users_v63UpSql,
"postgres/000075_alter_upload_sessions_index.down.sql": postgres000075_alter_upload_sessions_indexDownSql,
"postgres/000075_alter_upload_sessions_index.up.sql": postgres000075_alter_upload_sessions_indexUpSql,
"postgres/000076_upgrade_lastrootpostat.down.sql": postgres000076_upgrade_lastrootpostatDownSql,
"postgres/000076_upgrade_lastrootpostat.up.sql": postgres000076_upgrade_lastrootpostatUpSql,
}
// AssetDir returns the file names below a certain
@@ -6922,6 +7010,8 @@ var _bintree = &bintree{nil, map[string]*bintree{
"000074_upgrade_users_v6.3.up.sql": &bintree{mysql000074_upgrade_users_v63UpSql, map[string]*bintree{}},
"000075_alter_upload_sessions_index.down.sql": &bintree{mysql000075_alter_upload_sessions_indexDownSql, map[string]*bintree{}},
"000075_alter_upload_sessions_index.up.sql": &bintree{mysql000075_alter_upload_sessions_indexUpSql, map[string]*bintree{}},
"000076_upgrade_lastrootpostat.down.sql": &bintree{mysql000076_upgrade_lastrootpostatDownSql, map[string]*bintree{}},
"000076_upgrade_lastrootpostat.up.sql": &bintree{mysql000076_upgrade_lastrootpostatUpSql, map[string]*bintree{}},
}},
"postgres": &bintree{nil, map[string]*bintree{
"000001_create_teams.down.sql": &bintree{postgres000001_create_teamsDownSql, map[string]*bintree{}},
@@ -7074,6 +7164,8 @@ var _bintree = &bintree{nil, map[string]*bintree{
"000074_upgrade_users_v6.3.up.sql": &bintree{postgres000074_upgrade_users_v63UpSql, map[string]*bintree{}},
"000075_alter_upload_sessions_index.down.sql": &bintree{postgres000075_alter_upload_sessions_indexDownSql, map[string]*bintree{}},
"000075_alter_upload_sessions_index.up.sql": &bintree{postgres000075_alter_upload_sessions_indexUpSql, map[string]*bintree{}},
"000076_upgrade_lastrootpostat.down.sql": &bintree{postgres000076_upgrade_lastrootpostatDownSql, map[string]*bintree{}},
"000076_upgrade_lastrootpostat.up.sql": &bintree{postgres000076_upgrade_lastrootpostatUpSql, map[string]*bintree{}},
}},
}}

View File

@@ -0,0 +1 @@
-- no need to change anything since it's covered in 000070_upgrade_cte_v6.1.down.sql

View File

@@ -0,0 +1,47 @@
CREATE PROCEDURE Migrate_LastRootPostAt_Default ()
BEGIN
IF (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Channels'
AND TABLE_SCHEMA = DATABASE()
AND COLUMN_NAME = 'LastRootPostAt'
AND (COLUMN_DEFAULT IS NULL OR COLUMN_DEFAULT != 0)
) = 1 THEN
ALTER TABLE Channels ALTER COLUMN LastRootPostAt SET DEFAULT 0;
END IF;
END;
CALL Migrate_LastRootPostAt_Default ();
DROP PROCEDURE IF EXISTS Migrate_LastRootPostAt_Default;
CREATE PROCEDURE Migrate_LastRootPostAt_Fix ()
BEGIN
IF (
SELECT COUNT(*)
FROM Channels
WHERE LastRootPostAt IS NULL
) > 0 THEN
-- fixes migrate cte and sets the LastRootPostAt for channels that don't have it set
UPDATE
Channels
INNER JOIN (
SELECT
Channels.Id channelid,
COALESCE(MAX(Posts.CreateAt), 0) AS lastrootpost
FROM
Channels
LEFT JOIN Posts FORCE INDEX (idx_posts_channel_id_update_at) ON Channels.Id = Posts.ChannelId
WHERE
Posts.RootId = ''
GROUP BY
Channels.Id) AS q ON q.channelid = Channels.Id
SET
LastRootPostAt = lastrootpost
WHERE
LastRootPostAt IS NULL;
-- sets LastRootPostAt to 0, for channels with no posts
UPDATE Channels SET LastRootPostAt=0 WHERE LastRootPostAt IS NULL;
END IF;
END;
CALL Migrate_LastRootPostAt_Fix ();
DROP PROCEDURE IF EXISTS Migrate_LastRootPostAt_Fix;

View File

@@ -0,0 +1 @@
-- no need to change anything since it's covered in 000070_upgrade_cte_v6.1.down.sql

View File

@@ -0,0 +1,50 @@
DO $$
BEGIN
IF (
SELECT count(*)
FROM information_schema.columns
WHERE table_schema='public'
AND table_name='channels'
AND column_name='lastrootpostat'
AND (column_default IS NULL OR column_default != '''0''::bigint')
) = 1 THEN
ALTER TABLE channels ALTER COLUMN lastrootpostat SET DEFAULT '0'::bigint;
END IF;
END$$;
DO $$
BEGIN
IF (
SELECT count(*)
FROM Channels
WHERE LastRootPostAt IS NULL
) > 0 THEN
-- fixes migrate cte and sets the LastRootPostAt for channels that don't have it set
WITH q AS (
SELECT
Channels.Id channelid,
COALESCE(MAX(Posts.CreateAt), 0) AS lastrootpost
FROM
Channels
LEFT JOIN
Posts
ON
Channels.Id = Posts.ChannelId
WHERE
Posts.RootId = ''
GROUP BY
Channels.Id
)
UPDATE
Channels
SET
LastRootPostAt = q.lastrootpost
FROM
q
WHERE
q.channelid = Channels.Id AND Channels.LastRootPostAt IS NULL;
-- sets LastRootPostAt to 0, for channels with no posts
UPDATE Channels SET LastRootPostAt=0 WHERE LastRootPostAt IS NULL;
END IF;
END $$;