@@ -1016,7 +1016,7 @@ TEST_F(JsonCastTest, toRow) {
10161016 auto map = makeNullableFlatVector<JsonNativeType>(
10171017 {R"( {"c0":123,"c1":"abc","c2":true})" _sv,
10181018 R"( {"c1":"abc","c2":true,"c0":123})" _sv,
1019- R"( {"c0 ":123,"c2":true,"c0":456})" _sv,
1019+ R"( {"c10 ":123,"c2":true,"c0":456})" _sv,
10201020 R"( {"c3":123,"c4":"abc","c2":false})" _sv,
10211021 R"( {"c0":null,"c2":false})" _sv,
10221022 R"( {"c0":null,"c2":null,"c1":null})" _sv},
@@ -1037,17 +1037,17 @@ TEST_F(JsonCastTest, toRow) {
10371037
10381038 // Use a mix of lower case and upper case JSON keys.
10391039 map = makeNullableFlatVector<JsonNativeType>(
1040- {R"( {"c0 ":123,"c1 ":"abc","c2 ":true})" _sv,
1041- R"( {"c1":"abc","c2 ":true,"c0":123})" _sv,
1042- R"( {"c0 ":123,"c2 ":true,"c0":456})" _sv,
1043- R"( {"c3":123,"c4 ":"abc","c2":false})" _sv,
1040+ {R"( {"C0 ":123,"C1 ":"abc","C2 ":true})" _sv,
1041+ R"( {"c1":"abc","C2 ":true,"c0":123})" _sv,
1042+ R"( {"C10 ":123,"C2 ":true,"c0":456})" _sv,
1043+ R"( {"c3":123,"C4 ":"abc","c2":false})" _sv,
10441044 R"( {"c0":null,"c2":false})" _sv,
1045- R"( {"c0":null,"c2":null,"c1 ":null})" _sv},
1045+ R"( {"c0":null,"c2":null,"C1 ":null})" _sv},
10461046 JSON ());
10471047 testCast (map, makeRowVector ({child4, child5, child6}));
10481048
10491049 // Use a mix of lower case and upper case field names in target ROW type.
1050- testCast (map, makeRowVector ({child4, child5, child6}));
1050+ testCast (map, makeRowVector ({" c0 " , " C1 " , " C2 " }, { child4, child5, child6}));
10511051
10521052 // Test casting to ROW from JSON null.
10531053 auto null = makeNullableFlatVector<JsonNativeType>({" null" _sv}, JSON ());
@@ -1308,3 +1308,35 @@ TEST_F(JsonCastTest, tryCastFromJson) {
13081308 evaluateAndVerify (
13091309 JSON (), ROW ({REAL ()}), makeRowVector ({data}), expectedRow, true );
13101310}
1311+
1312+ TEST_F (JsonCastTest, duplicateCaseInsensitiveFields) {
1313+ auto input = makeFlatVector<JsonNativeType>(
1314+ {R"( {"Name":"first","name":"second"})" _sv}, JSON ());
1315+
1316+ BOLT_ASSERT_USER_THROW (
1317+ evaluateCast (JSON (), ROW ({" name" }, {VARCHAR ()}), makeRowVector ({input})),
1318+ " Duplicate field: name" );
1319+ }
1320+
1321+ TEST_F (JsonCastTest, fromJsonIgnoresDuplicateCaseInsensitiveFields) {
1322+ auto input = makeFlatVector<StringView>(
1323+ {R"( {"FieldA":["READ","BLUE"],"Foo":"Bar","fieldA":["red","blue"],"foo":"bar"})" },
1324+ JSON ());
1325+ auto resultType = ROW ({" FieldA" , " Foo" }, {ARRAY (VARCHAR ()), VARCHAR ()});
1326+ auto inputRow = makeRowVector ({input});
1327+ SelectivityVector rows (input->size ());
1328+ exec::ExprSet exprSet ({}, &execCtx_);
1329+ exec::EvalCtx context (&execCtx_, &exprSet, inputRow.get ());
1330+ VectorPtr result;
1331+
1332+ auto * jsonCast =
1333+ dynamic_cast <const JsonCastOperator*>(JsonCastOperator::get ().get ());
1334+ ASSERT_NE (jsonCast, nullptr );
1335+ jsonCast->castFrom (
1336+ *input, context, rows, resultType, result, /* isFromJson=*/ true );
1337+
1338+ auto fieldA = makeArrayVector<std::string>({{" READ" , " BLUE" }});
1339+ auto foo = makeFlatVector<StringView>({" Bar" });
1340+ auto expected = makeRowVector ({" FieldA" , " Foo" }, {fieldA, foo});
1341+ bytedance::bolt::test::assertEqualVectors (expected, result);
1342+ }
0 commit comments