Skip to content

Commit e15c1a9

Browse files
authored
Fix adding variant column with properties (#643)
1 parent ed04c3e commit e15c1a9

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

pkg/ccr/base/spec.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,6 +1708,14 @@ func HandleSchemaChangeDefaultValue(sql string, lightningSchemaChange *record.Mo
17081708
return sql
17091709
}
17101710

1711+
func HandleSchemaChangeVariantProperties(sql string, lightningSchemaChange *record.ModifyTableAddOrDropColumns) string {
1712+
re := regexp.MustCompile(`variant<.*PROPERTIES\s*\(.*,\)>|VARIANT<.*PROPERTIES\s*\(.*,\)>`)
1713+
replaceFn := func(match string) string {
1714+
return strings.ReplaceAll(match, ",)>", ")>")
1715+
}
1716+
return re.ReplaceAllStringFunc(sql, replaceFn)
1717+
}
1718+
17111719
func NormalizeCreateViewSql(destDatabase string, srcDatabase string, createSql string) string {
17121720
log.Tracef("create view, use dest db name to replace source db name")
17131721
originSql := createSql

pkg/ccr/base/spec_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package base_test
1818

1919
import (
20+
"fmt"
2021
"reflect"
2122
"testing"
2223

@@ -225,3 +226,62 @@ func TestNormalizeCreateTableSql(t *testing.T) {
225226
}
226227
}
227228
}
229+
230+
func TestHandleSchemaChangeVariantProperties(t *testing.T) {
231+
data := `{
232+
"dbId":1759183589184,
233+
"tableId":1759183589229,
234+
"baseIndexId":1759183589230,
235+
"indexSchemaMap": {
236+
"1759183589230":[{
237+
"name":"id",
238+
"type":{"clazz":"ScalarType","type":"INT","len":-1,"precision":0,"scale":0},
239+
"isAggregationTypeImplicit":false,
240+
"isKey":true,"isAllowNull":true,
241+
"isAutoInc":false,
242+
"autoIncInitValue":-1,
243+
"comment":"",
244+
"stats":{"avgSerializedSize":-1.0,"maxSize":-1,"numDistinctValues":-1,"numNulls":-1},
245+
"children":[],"visible":true,"uniqueId":0,"clusterKeyId":-1,"hasOnUpdateDefaultValue":false,"gctt":[]
246+
}, {
247+
"name":"j","type":{"clazz":"ScalarType","type":"JSONB","len":-1,"precision":0,"scale":0},
248+
"aggregationType":"NONE","isAggregationTypeImplicit":true,"isKey":false,"isAllowNull":true,
249+
"isAutoInc":false,"autoIncInitValue":0,"comment":"",
250+
"stats":{"avgSerializedSize":-1.0,"maxSize":-1,"numDistinctValues":-1,"numNulls":-1},
251+
"children":[],"visible":true,"uniqueId":1,"clusterKeyId":-1,"hasOnUpdateDefaultValue":false,"gctt":[]
252+
},{
253+
"name":"v",
254+
"type":{"clazz":"VariantType","fieldMap":{},"fields":[],"variantMaxSubcolumnsCount":2,"enableTypedPathsToSparse":false,
255+
"variantMaxSparseColumnStatisticsSize":10000,"type":"VARIANT","len":-1,"precision":0,"scale":0},
256+
"aggregationType":"NONE","isAggregationTypeImplicit":true,"isKey":false,"isAllowNull":true,"isAutoInc":false,"autoIncInitValue":0,
257+
"comment":"",
258+
"stats":{"avgSerializedSize":-1.0,"maxSize":-1,"numDistinctValues":-1,"numNulls":-1},
259+
"children":[],"visible":true,"uniqueId":2,"clusterKeyId":-1,"hasOnUpdateDefaultValue":false,"gctt":[]
260+
}]},
261+
"oldIndexSchemaMap":{
262+
"1759183589230":[
263+
{"name":"id","type":{"clazz":"ScalarType","type":"INT","len":-1,"precision":0,"scale":0},
264+
"isAggregationTypeImplicit":false,"isKey":true,"isAllowNull":true,"isAutoInc":false,"autoIncInitValue":-1,"comment":"",
265+
"stats":{"avgSerializedSize":-1.0,"maxSize":-1,"numDistinctValues":-1,"numNulls":-1},
266+
"children":[],"visible":true,"uniqueId":0,"clusterKeyId":-1,"hasOnUpdateDefaultValue":false,"gctt":[]},
267+
{"name":"j","type":{"clazz":"ScalarType","type":"JSONB","len":-1,"precision":0,"scale":0},
268+
"aggregationType":"NONE","isAggregationTypeImplicit":true,"isKey":false,"isAllowNull":true,"isAutoInc":false,
269+
"autoIncInitValue":0,"comment":"","stats":{"avgSerializedSize":-1.0,"maxSize":-1,"numDistinctValues":-1,"numNulls":-1},
270+
"children":[],"visible":true,"uniqueId":1,"clusterKeyId":-1,"hasOnUpdateDefaultValue":false,"gctt":[]}
271+
]},"indexNameToId":{"tbl_332464610":1759183589230},
272+
"indexes":[],"jobId":1759183590091,
273+
"rawSql":"%s"}`
274+
275+
raw := "ALTER TABLE `regression_test_db_sync_cdt_column_add`.`tbl_332464610` ADD COLUMN `v` variant\\u003cPROPERTIES (\\\"variant_max_subcolumns_count\\\" \\u003d \\\"2\\\",)\u003e NULL COMMENT \\\"\\\""
276+
expect := "ALTER TABLE `regression_test_db_sync_cdt_column_add`.`tbl_332464610` ADD COLUMN `v` variant<PROPERTIES (\"variant_max_subcolumns_count\" = \"2\")> NULL COMMENT \"\""
277+
278+
data = fmt.Sprintf(data, raw)
279+
origin, err := record.NewModifyTableAddOrDropColumnsFromJson(data)
280+
if err != nil {
281+
t.Errorf("unmarshal json failed, err: %v", err)
282+
return
283+
}
284+
if actual := base.HandleSchemaChangeVariantProperties(origin.RawSql, origin); actual != expect {
285+
t.Errorf("case failed, expect %s, but got %s", expect, actual)
286+
}
287+
}

0 commit comments

Comments
 (0)