From 85c6cc49a9cbe71270ad6d663f9da635cc788ce1 Mon Sep 17 00:00:00 2001 From: Joseph Totin Date: Mon, 29 Sep 2025 16:01:46 -0500 Subject: [PATCH] Logic change to getFivetranDataType function to extend treat-as-bool to not read additional schema data --- .../server/handlers/schema_builder.go | 14 +++++++++- .../server/handlers/schema_builder_test.go | 26 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/cmd/internal/server/handlers/schema_builder.go b/cmd/internal/server/handlers/schema_builder.go index 3228609..ae48755 100644 --- a/cmd/internal/server/handlers/schema_builder.go +++ b/cmd/internal/server/handlers/schema_builder.go @@ -230,8 +230,20 @@ func parseEnumOrSetValues(mType string) ValueMap { // Convert columnType to fivetran type func getFivetranDataType(mType string, treatTinyIntAsBoolean bool) (fivetransdk.DataType, *fivetransdk.DecimalParams) { mysqlType := strings.ToLower(mType) + // only interested in first part of the schema output to avoid issues with NOT NULL + parts := strings.Fields(mysqlType) + + // empty schema condition + if len(parts) == 0 { + return fivetransdk.DataType_UNSPECIFIED, nil + } + + // get first entry from non zero length slice of column type definition + baseType := parts[0] + + // modified conditional to include baseType to only accept tinyint(1) if strings.HasPrefix(mysqlType, "tinyint") { - if treatTinyIntAsBoolean && mysqlType == "tinyint(1)" { + if treatTinyIntAsBoolean && baseType == "tinyint(1)" { return fivetransdk.DataType_BOOLEAN, nil } diff --git a/cmd/internal/server/handlers/schema_builder_test.go b/cmd/internal/server/handlers/schema_builder_test.go index c928aea..7bd6e6d 100644 --- a/cmd/internal/server/handlers/schema_builder_test.go +++ b/cmd/internal/server/handlers/schema_builder_test.go @@ -256,3 +256,29 @@ func TestCanDetectDecimalPrecision(t *testing.T) { }) } } + +// Adding an additional unit test for the tinyint(1) as bool handling since the orginals were not wide enough +func TestGetFivetranDataType_TinyintBooleanHandling(t *testing.T) { + tests := []struct { + mysqlType string + treatTinyIntAsBoolean bool + expected fivetransdk.DataType + }{ + {"tinyint(1)", true, fivetransdk.DataType_BOOLEAN}, + {"tinyint(1) NOT NULL", true, fivetransdk.DataType_BOOLEAN}, + {"tinyint(1) unsigned", true, fivetransdk.DataType_BOOLEAN}, + {"tinyint(2)", true, fivetransdk.DataType_INT}, + {"tinyint", true, fivetransdk.DataType_INT}, + {"TINYINT(1)", true, fivetransdk.DataType_BOOLEAN}, + {"tinyint(1)", false, fivetransdk.DataType_INT}, + } + + for _, tt := range tests { + t.Run(fmt.Sprintf("%s_bool_%t", tt.mysqlType, tt.treatTinyIntAsBoolean), func(t *testing.T) { + got, _ := getFivetranDataType(tt.mysqlType, tt.treatTinyIntAsBoolean) + if got != tt.expected { + t.Errorf("For input '%s', expected %s but got %s", tt.mysqlType, tt.expected, got) + } + }) + } +}