Skip to content

Commit 1c28c97

Browse files
authored
Merge pull request #720 from Altinity/less_strict_check_parts_columns
fix too strict `system.parts_columns` check when backup create,
2 parents 0a2c71a + 6a223a0 commit 1c28c97

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ IMPROVEMENTS
1010

1111
BUG FIXES
1212
- fix possible create backup failures during UNFREEZE not exists tables, affected 2.2.7+ version, fix [704](https://github.com/Altinity/clickhouse-backup/issues/704)
13+
- fix too strict `system.parts_columns` check when backup create, exclude Enum and Tuple (JSON) and Nullable(Type) vs Type corner cases, fix [685](https://github.com/Altinity/clickhouse-backup/issues/685), fix [699](https://github.com/Altinity/clickhouse-backup/issues/699)
1314

1415
# v2.3.2
1516
BUG FIXES

pkg/clickhouse/clickhouse.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,22 +1161,37 @@ func (ch *ClickHouse) CheckSystemPartsColumns(ctx context.Context, table *Table)
11611161
}
11621162
}
11631163
ch.isPartsColumnPresent = 1
1164-
isPartsColumnsInconsistent := make([]struct {
1164+
partColumnsDataTypes := make([]struct {
11651165
Column string `ch:"column"`
11661166
Types []string `ch:"uniq_types"`
11671167
}, 0)
11681168
partsColumnsSQL := "SELECT column, groupUniqArray(type) AS uniq_types " +
11691169
"FROM system.parts_columns " +
1170-
"WHERE active AND database=? AND table=? " +
1170+
"WHERE active AND database=? AND table=? AND type NOT LIKE 'Enum%' AND type NOT LIKE 'Tuple(%' " +
11711171
"GROUP BY column HAVING length(uniq_types) > 1"
1172-
if err := ch.SelectContext(ctx, &isPartsColumnsInconsistent, partsColumnsSQL, table.Database, table.Name); err != nil {
1172+
if err := ch.SelectContext(ctx, &partColumnsDataTypes, partsColumnsSQL, table.Database, table.Name); err != nil {
11731173
return err
11741174
}
1175-
if len(isPartsColumnsInconsistent) > 0 {
1176-
for i := range isPartsColumnsInconsistent {
1177-
ch.Log.Errorf("`%s`.`%s` have inconsistent data types %#v for \"%s\" column", table.Database, table.Name, isPartsColumnsInconsistent[i].Types, isPartsColumnsInconsistent[i].Column)
1175+
isPartColumnsInconsistentDataTypes := false
1176+
if len(partColumnsDataTypes) > 0 {
1177+
for i := range partColumnsDataTypes {
1178+
isNullablePresent := false
1179+
isNotNullablePresent := false
1180+
for _, dataType := range partColumnsDataTypes[i].Types {
1181+
if strings.Contains(dataType, "Nullable") {
1182+
isNullablePresent = true
1183+
} else {
1184+
isNotNullablePresent = true
1185+
}
1186+
}
1187+
if !isNullablePresent && isNotNullablePresent {
1188+
ch.Log.Errorf("`%s`.`%s` have inconsistent data types %#v for \"%s\" column", table.Database, table.Name, partColumnsDataTypes[i].Types, partColumnsDataTypes[i].Column)
1189+
isPartColumnsInconsistentDataTypes = true
1190+
}
1191+
}
1192+
if isPartColumnsInconsistentDataTypes {
1193+
return fmt.Errorf("`%s`.`%s` have inconsistent data types for active data part in system.parts_columns", table.Database, table.Name)
11781194
}
1179-
return fmt.Errorf("`%s`.`%s` have inconsistent data types for active data part in system.parts_columns", table.Database, table.Name)
11801195
}
11811196
return nil
11821197
}

0 commit comments

Comments
 (0)