Skip to content

Commit af35c4b

Browse files
authored
Merge pull request #75 from dev-menon/fix/PS-json-empty-string-fix
Fix(Fivetran): Json conversion empty string to null
2 parents baeaad4 + c4a3ec1 commit af35c4b

2 files changed

Lines changed: 52 additions & 1 deletion

File tree

cmd/internal/server/handlers/fivetran_value_converters.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,20 @@ var converters = map[fivetransdk.DataType]ConverterFunc{
212212
Inner: &fivetransdk.ValueType_Json{Json: CleanStringValue(string(geoJson))},
213213
}, nil
214214
}
215+
216+
// Empty strings are not valid JSON per RFC 8259. PlanetScale databases
217+
// (MySQL-compatible) allow empty strings in JSON columns, but destinations
218+
// like BigQuery reject them with "attempting to parse an empty input" errors.
219+
// Convert empty strings to NULL for destination compatibility.
220+
jsonString := CleanStringValue(value.ToString())
221+
if jsonString == "" {
222+
return &fivetransdk.ValueType{
223+
Inner: &fivetransdk.ValueType_Null{},
224+
}, nil
225+
}
226+
215227
return &fivetransdk.ValueType{
216-
Inner: &fivetransdk.ValueType_Json{Json: CleanStringValue(value.ToString())},
228+
Inner: &fivetransdk.ValueType_Json{Json: jsonString},
217229
}, nil
218230
},
219231
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package handlers
2+
3+
import (
4+
"testing"
5+
6+
fivetransdk "github.com/planetscale/fivetran-source/fivetran_sdk.v2"
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
"vitess.io/vitess/go/sqltypes"
10+
)
11+
12+
func TestJSONConverter_EmptyString(t *testing.T) {
13+
converter, err := GetConverter(fivetransdk.DataType_JSON)
14+
require.NoError(t, err)
15+
16+
// Empty string should convert to NULL for BigQuery compatibility
17+
emptyValue := sqltypes.NewVarChar("")
18+
result, err := converter(emptyValue)
19+
require.NoError(t, err)
20+
require.NotNil(t, result)
21+
22+
_, ok := result.Inner.(*fivetransdk.ValueType_Null)
23+
assert.True(t, ok, "empty JSON string should convert to NULL")
24+
}
25+
26+
func TestJSONConverter_ValidJSON(t *testing.T) {
27+
converter, err := GetConverter(fivetransdk.DataType_JSON)
28+
require.NoError(t, err)
29+
30+
// Valid JSON should pass through
31+
jsonValue := sqltypes.NewVarChar(`{"key": "value"}`)
32+
result, err := converter(jsonValue)
33+
require.NoError(t, err)
34+
require.NotNil(t, result)
35+
36+
json, ok := result.Inner.(*fivetransdk.ValueType_Json)
37+
require.True(t, ok)
38+
assert.Equal(t, `{"key": "value"}`, json.Json)
39+
}

0 commit comments

Comments
 (0)