From 18507fb8361f3139ec0ab2d5a081dbcb5dc7f701 Mon Sep 17 00:00:00 2001 From: long <48313408+qq375251855@users.noreply.github.com> Date: Thu, 22 Dec 2022 17:00:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=B1=E4=BA=8E=20clickhouse=20=E7=9A=84=20p?= =?UTF-8?q?osition=E7=9A=84=E5=88=9D=E5=A7=8B=E5=80=BC=E4=B8=BA=201?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4gdb=5Fcore=5Futility.HasField=20?= =?UTF-8?q?=E4=B8=AD=E5=AF=B9=20fieldsArray=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E5=87=BA=E9=94=99=20(#2346)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 由于 clickhouse 的 position的初始值为 1,导致gdb_core_utility.HasField 中对 fieldsArray 初始化出错 * 修复单元测试 * 修复单元测试 * 补充单元测试 * 增加CK防御性代码 Co-authored-by: longl Co-authored-by: houseme --- contrib/drivers/clickhouse/clickhouse.go | 6 +++- contrib/drivers/clickhouse/clickhouse_test.go | 34 ++++++++++++------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/contrib/drivers/clickhouse/clickhouse.go b/contrib/drivers/clickhouse/clickhouse.go index 75f84f5c1..e4a987070 100644 --- a/contrib/drivers/clickhouse/clickhouse.go +++ b/contrib/drivers/clickhouse/clickhouse.go @@ -173,8 +173,12 @@ func (d *Driver) TableFields( isNull = true fieldType = fieldsResult[1] } + position := m["position"].Int() + if result[0]["position"].Int() != 0 { + position -= 1 + } fields[m["name"].String()] = &gdb.TableField{ - Index: m["position"].Int(), + Index: position, Name: m["name"].String(), Default: m["default_expression"].Val(), Comment: m["comment"].String(), diff --git a/contrib/drivers/clickhouse/clickhouse_test.go b/contrib/drivers/clickhouse/clickhouse_test.go index c78f18f25..d15bffdc5 100644 --- a/contrib/drivers/clickhouse/clickhouse_test.go +++ b/contrib/drivers/clickhouse/clickhouse_test.go @@ -533,18 +533,18 @@ func TestDriverClickhouse_TableFields(t *testing.T) { gtest.AssertNE(dataTypeTable, nil) var result = map[string][]interface{}{ - "Col1": {1, "Col1", "UInt8", false, "", "", "", "列1"}, - "Col2": {2, "Col2", "String", true, "", "", "", "列2"}, - "Col3": {3, "Col3", "FixedString(3)", false, "", "", "", "列3"}, - "Col4": {4, "Col4", "String", false, "", "", "", "列4"}, - "Col5": {5, "Col5", "Map(String, UInt8)", false, "", "", "", "列5"}, - "Col6": {6, "Col6", "Array(String)", false, "", "", "", "列6"}, - "Col7": {7, "Col7", "Tuple(String, UInt8, Array(Map(String, String)))", false, "", "", "", "列7"}, - "Col8": {8, "Col8", "DateTime", false, "", "", "", "列8"}, - "Col9": {9, "Col9", "UUID", false, "", "", "", "列9"}, - "Col10": {10, "Col10", "DateTime", false, "", "", "", "列10"}, - "Col11": {11, "Col11", "Decimal(9, 2)", false, "", "", "", "列11"}, - "Col12": {12, "Col12", "Decimal(9, 2)", false, "", "", "", "列12"}, + "Col1": {0, "Col1", "UInt8", false, "", "", "", "列1"}, + "Col2": {1, "Col2", "String", true, "", "", "", "列2"}, + "Col3": {2, "Col3", "FixedString(3)", false, "", "", "", "列3"}, + "Col4": {3, "Col4", "String", false, "", "", "", "列4"}, + "Col5": {4, "Col5", "Map(String, UInt8)", false, "", "", "", "列5"}, + "Col6": {5, "Col6", "Array(String)", false, "", "", "", "列6"}, + "Col7": {6, "Col7", "Tuple(String, UInt8, Array(Map(String, String)))", false, "", "", "", "列7"}, + "Col8": {7, "Col8", "DateTime", false, "", "", "", "列8"}, + "Col9": {8, "Col9", "UUID", false, "", "", "", "列9"}, + "Col10": {9, "Col10", "DateTime", false, "", "", "", "列10"}, + "Col11": {10, "Col11", "Decimal(9, 2)", false, "", "", "", "列11"}, + "Col12": {11, "Col12", "Decimal(9, 2)", false, "", "", "", "列12"}, } for k, v := range result { _, ok := dataTypeTable[k] @@ -558,3 +558,13 @@ func TestDriverClickhouse_TableFields(t *testing.T) { gtest.AssertEQ(dataTypeTable[k].Comment, v[7]) } } + +func TestDriverClickhouse_TableFields_HasField(t *testing.T) { + connect := clickhouseConfigDB() + gtest.AssertNil(createClickhouseExampleTable(connect)) + defer dropClickhouseExampleTable(connect) + // 未修复前:panic: runtime error: index out of range [12] with length 12 + b, err := connect.GetCore().HasField(context.Background(), "data_type", "Col1") + gtest.AssertNil(err) + gtest.AssertEQ(b, true) +}