Skip to content

Conversation

@eldenmoon
Copy link
Member

@eldenmoon eldenmoon commented Sep 10, 2025

What problem does this PR solve?

Issue Number: close #xxx

Related PR: #xxx

Problem Summary:

Problem:
When Variant data is NULL or its root is empty, serializing it
to JSON would incorrectly produce '\N' or other unexpected
results. The standard JSON format expects a 'null' literal or
an empty object '{}' for such cases.

Solution:
This commit addresses the issue with the following changes:
1. In HierarchicalDataIterator, when a Variant's root data
is empty, it is now explicitly marked as NULL in the null map.
2. The JSON serialization logic in
ColumnVariant::serialize_text_json is modified to serialize a
NULL sub-column as an empty JSON object '{}' instead of '\N'.
3. The logic in is_visible_root_value is updated to rely on
the null flag rather than checking if the data content is
empty, providing a more accurate reflection of the value's
existence.

These changes ensure that the Variant type produces correct and
expected JSON output when serializing null or empty data.
Corresponding regression tests have also been added to cover
scenarios involving NULL and empty JSON objects.

Release note

None

Check List (For Author)

  • Test

    • Regression test
    • Unit Test
    • Manual test (add detailed scripts or steps below)
    • No need to test or manual test. Explain why:
      • This is a refactor/code format and no logic has been changed.
      • Previous test can cover this change.
      • No code files have been changed.
      • Other reason
  • Behavior changed:

    • No.
    • Yes.
  • Does this need documentation?

    • No.
    • Yes.

Check List (For Reviewer who merge this PR)

  • Confirm the release note
  • Confirm test cases
  • Confirm document
  • Add branch pick label

@Thearas
Copy link
Contributor

Thearas commented Sep 10, 2025

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@eldenmoon
Copy link
Member Author

run buildall

@eldenmoon
Copy link
Member Author

run buildall

@doris-robot
Copy link

TPC-H: Total hot run time: 34569 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit f5ffb253cd70a779a4e9eb4959bd9c39c6412e28, data reload: false

------ Round 1 ----------------------------------
q1	17655	5223	5044	5044
q2	2005	336	225	225
q3	10225	1295	698	698
q4	10251	1042	525	525
q5	7543	2461	2318	2318
q6	188	173	138	138
q7	986	759	638	638
q8	9357	1296	1131	1131
q9	7007	5150	5103	5103
q10	6956	2375	1977	1977
q11	498	305	289	289
q12	359	356	224	224
q13	17782	3683	3021	3021
q14	237	250	214	214
q15	575	494	491	491
q16	1009	994	963	963
q17	602	864	377	377
q18	7468	7071	7020	7020
q19	1513	964	576	576
q20	354	339	239	239
q21	3640	3170	2354	2354
q22	1069	1025	1004	1004
Total cold run time: 107279 ms
Total hot run time: 34569 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5205	5116	5082	5082
q2	245	331	235	235
q3	2191	2695	2336	2336
q4	1298	1788	1348	1348
q5	4231	4519	4599	4519
q6	227	175	138	138
q7	2035	2033	1855	1855
q8	2614	2636	2680	2636
q9	7474	7409	7279	7279
q10	3171	3345	2911	2911
q11	600	513	495	495
q12	725	787	614	614
q13	3821	3832	3438	3438
q14	301	318	286	286
q15	531	492	481	481
q16	1077	1128	1068	1068
q17	1177	1549	1400	1400
q18	8004	7797	7678	7678
q19	882	856	1048	856
q20	1998	2141	1806	1806
q21	4664	4219	4234	4219
q22	1092	1042	1005	1005
Total cold run time: 53563 ms
Total hot run time: 51685 ms

@doris-robot
Copy link

TPC-DS: Total hot run time: 189453 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit f5ffb253cd70a779a4e9eb4959bd9c39c6412e28, data reload: false

query1	1035	500	421	421
query2	6557	1709	1756	1709
query3	6762	225	223	223
query4	26593	23700	23133	23133
query5	4452	651	517	517
query6	358	250	249	249
query7	4665	534	312	312
query8	317	264	259	259
query9	8654	2930	2951	2930
query10	474	347	303	303
query11	15630	15067	15094	15067
query12	190	128	124	124
query13	1692	581	472	472
query14	11689	9457	9458	9457
query15	219	189	180	180
query16	7701	667	479	479
query17	1249	797	670	670
query18	2050	430	338	338
query19	203	201	180	180
query20	137	127	128	127
query21	219	139	135	135
query22	4050	4146	4279	4146
query23	33851	33254	32943	32943
query24	8095	2403	2453	2403
query25	559	524	466	466
query26	936	279	168	168
query27	2677	523	364	364
query28	4379	2273	2252	2252
query29	720	631	503	503
query30	298	223	197	197
query31	906	827	741	741
query32	98	82	77	77
query33	626	395	361	361
query34	825	870	542	542
query35	833	823	755	755
query36	974	1016	935	935
query37	131	116	91	91
query38	3579	3622	3450	3450
query39	1481	1428	1415	1415
query40	225	146	133	133
query41	67	68	59	59
query42	134	121	133	121
query43	520	505	463	463
query44	1421	891	873	873
query45	186	175	175	175
query46	876	1009	664	664
query47	1775	1779	1722	1722
query48	390	440	317	317
query49	715	531	402	402
query50	670	690	413	413
query51	3958	3934	3966	3934
query52	117	119	112	112
query53	254	278	203	203
query54	621	617	549	549
query55	130	97	87	87
query56	361	337	324	324
query57	1184	1205	1125	1125
query58	291	283	294	283
query59	2580	2612	2625	2612
query60	373	366	350	350
query61	163	161	179	161
query62	823	734	685	685
query63	230	197	204	197
query64	3661	1194	834	834
query65	4071	3981	4011	3981
query66	899	455	367	367
query67	15422	15296	14977	14977
query68	8291	963	585	585
query69	555	333	323	323
query70	1363	1344	1259	1259
query71	574	361	345	345
query72	5818	4929	5037	4929
query73	750	656	367	367
query74	8938	9458	8606	8606
query75	3990	3232	2808	2808
query76	3595	1159	768	768
query77	804	418	344	344
query78	9716	9599	8840	8840
query79	2395	855	594	594
query80	643	573	512	512
query81	513	267	315	267
query82	507	159	138	138
query83	266	263	245	245
query84	256	116	111	111
query85	901	460	418	418
query86	391	339	300	300
query87	3861	3808	3632	3632
query88	3460	2243	2248	2243
query89	409	335	291	291
query90	1894	235	222	222
query91	165	184	135	135
query92	95	78	69	69
query93	1672	997	637	637
query94	705	441	314	314
query95	417	329	322	322
query96	484	573	278	278
query97	2940	2978	2834	2834
query98	255	233	216	216
query99	1660	1458	1284	1284
Total cold run time: 276264 ms
Total hot run time: 189453 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 30.11 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit f5ffb253cd70a779a4e9eb4959bd9c39c6412e28, data reload: false

query1	0.06	0.06	0.05
query2	0.10	0.06	0.06
query3	0.25	0.08	0.08
query4	1.61	0.12	0.12
query5	0.27	0.26	0.26
query6	1.20	0.66	0.64
query7	0.03	0.03	0.03
query8	0.05	0.04	0.04
query9	0.64	0.53	0.52
query10	0.58	0.58	0.58
query11	0.16	0.11	0.12
query12	0.15	0.12	0.13
query13	0.62	0.64	0.61
query14	1.05	1.03	1.03
query15	0.86	0.86	0.87
query16	0.41	0.40	0.41
query17	1.05	1.02	1.04
query18	0.22	0.21	0.21
query19	1.96	1.84	1.89
query20	0.02	0.01	0.01
query21	15.45	1.00	0.58
query22	0.80	1.07	0.65
query23	15.03	1.43	0.63
query24	6.66	0.88	1.42
query25	0.46	0.13	0.30
query26	0.68	0.17	0.14
query27	0.07	0.06	0.06
query28	10.28	0.97	0.44
query29	12.58	3.92	3.24
query30	0.30	0.13	0.11
query31	2.83	0.58	0.39
query32	3.24	0.56	0.51
query33	3.10	3.10	3.08
query34	16.05	5.46	4.90
query35	4.92	4.90	4.92
query36	0.69	0.51	0.50
query37	0.11	0.08	0.08
query38	0.07	0.05	0.04
query39	0.04	0.02	0.02
query40	0.18	0.15	0.15
query41	0.09	0.03	0.03
query42	0.03	0.04	0.03
query43	0.05	0.03	0.03
Total cold run time: 105 s
Total hot run time: 30.11 s

@eldenmoon
Copy link
Member Author

run buildall

@doris-robot
Copy link

TPC-H: Total hot run time: 34713 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 5a78c903cf6090ae836133eccb2cb6c58d507449, data reload: false

------ Round 1 ----------------------------------
q1	17641	5210	5046	5046
q2	2011	325	204	204
q3	10270	1341	716	716
q4	10214	1048	527	527
q5	7505	2411	2347	2347
q6	187	168	136	136
q7	928	783	642	642
q8	9339	1468	1095	1095
q9	7159	5165	5210	5165
q10	6963	2414	1970	1970
q11	486	302	280	280
q12	370	370	230	230
q13	17789	3668	3044	3044
q14	246	242	224	224
q15	571	503	476	476
q16	1044	1019	956	956
q17	610	869	373	373
q18	7952	7266	7125	7125
q19	1101	945	568	568
q20	364	344	244	244
q21	3736	2571	2345	2345
q22	1079	1032	1000	1000
Total cold run time: 107565 ms
Total hot run time: 34713 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5077	5070	5071	5070
q2	247	355	223	223
q3	2150	2707	2272	2272
q4	1377	1811	1380	1380
q5	4237	4491	4624	4491
q6	222	178	134	134
q7	2057	2009	1830	1830
q8	2683	2627	2744	2627
q9	7280	7377	7424	7377
q10	3089	3327	2867	2867
q11	594	500	510	500
q12	696	810	616	616
q13	3457	3834	3405	3405
q14	286	317	277	277
q15	506	470	471	470
q16	1096	1115	1069	1069
q17	1224	1615	1414	1414
q18	7958	7843	7397	7397
q19	859	833	898	833
q20	2031	2020	1810	1810
q21	4776	4358	4398	4358
q22	1105	1079	1008	1008
Total cold run time: 53007 ms
Total hot run time: 51428 ms

@doris-robot
Copy link

TPC-DS: Total hot run time: 189454 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 5a78c903cf6090ae836133eccb2cb6c58d507449, data reload: false

query1	1060	435	406	406
query2	6553	1727	1685	1685
query3	6747	229	232	229
query4	26300	23552	23601	23552
query5	5018	621	520	520
query6	349	256	237	237
query7	4666	500	302	302
query8	317	268	261	261
query9	8649	2914	2899	2899
query10	535	348	326	326
query11	15938	14913	14829	14829
query12	186	127	119	119
query13	1692	563	438	438
query14	11097	9289	9221	9221
query15	217	196	177	177
query16	7683	657	534	534
query17	1389	771	657	657
query18	2093	441	353	353
query19	255	196	175	175
query20	131	129	123	123
query21	212	133	116	116
query22	4127	4265	3975	3975
query23	33972	33102	33007	33007
query24	8172	2357	2387	2357
query25	612	509	442	442
query26	1234	277	171	171
query27	2689	501	363	363
query28	4374	2250	2237	2237
query29	783	632	484	484
query30	302	230	199	199
query31	920	806	733	733
query32	92	81	77	77
query33	566	392	389	389
query34	810	864	512	512
query35	802	835	740	740
query36	991	1059	914	914
query37	126	119	95	95
query38	3548	3495	3430	3430
query39	1506	1455	1450	1450
query40	225	142	128	128
query41	65	61	62	61
query42	136	122	126	122
query43	519	513	453	453
query44	1346	860	865	860
query45	181	173	173	173
query46	851	1015	646	646
query47	1794	1835	1779	1779
query48	416	442	320	320
query49	761	516	439	439
query50	647	691	402	402
query51	3910	3989	3823	3823
query52	117	115	110	110
query53	241	284	198	198
query54	613	607	547	547
query55	101	94	93	93
query56	322	346	320	320
query57	1216	1207	1145	1145
query58	304	283	281	281
query59	2665	2736	2650	2650
query60	363	359	363	359
query61	171	161	182	161
query62	805	719	676	676
query63	233	201	194	194
query64	4471	1198	847	847
query65	4041	3993	4020	3993
query66	1104	457	357	357
query67	15474	15164	15502	15164
query68	8741	950	588	588
query69	494	331	353	331
query70	1366	1311	1307	1307
query71	579	347	326	326
query72	5975	4893	5033	4893
query73	747	630	361	361
query74	8989	9100	8719	8719
query75	4033	3250	2895	2895
query76	3665	1156	723	723
query77	803	402	333	333
query78	9568	9770	8843	8843
query79	4215	830	562	562
query80	715	583	519	519
query81	472	257	226	226
query82	574	168	130	130
query83	301	274	265	265
query84	303	116	101	101
query85	878	460	434	434
query86	343	334	313	313
query87	3718	3664	3659	3659
query88	2914	2257	2217	2217
query89	452	336	292	292
query90	1957	222	225	222
query91	163	165	135	135
query92	97	76	72	72
query93	2131	998	647	647
query94	700	431	328	328
query95	413	336	326	326
query96	481	590	279	279
query97	2956	3023	2867	2867
query98	244	229	215	215
query99	1467	1403	1291	1291
Total cold run time: 280259 ms
Total hot run time: 189454 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 29.78 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 5a78c903cf6090ae836133eccb2cb6c58d507449, data reload: false

query1	0.05	0.05	0.05
query2	0.09	0.05	0.06
query3	0.25	0.08	0.09
query4	1.60	0.12	0.11
query5	0.28	0.26	0.25
query6	1.18	0.66	0.64
query7	0.03	0.03	0.03
query8	0.05	0.04	0.05
query9	0.63	0.52	0.52
query10	0.58	0.57	0.56
query11	0.15	0.11	0.12
query12	0.15	0.13	0.12
query13	0.63	0.63	0.62
query14	1.04	1.05	1.02
query15	0.85	0.84	0.86
query16	0.41	0.39	0.42
query17	1.05	1.06	1.03
query18	0.22	0.21	0.21
query19	1.89	1.86	1.86
query20	0.01	0.01	0.01
query21	15.39	0.91	0.60
query22	0.77	1.19	0.68
query23	14.89	1.35	0.65
query24	6.92	0.69	0.92
query25	0.50	0.28	0.07
query26	0.58	0.17	0.13
query27	0.05	0.06	0.05
query28	9.79	0.90	0.42
query29	12.56	3.91	3.22
query30	0.28	0.13	0.12
query31	2.83	0.59	0.38
query32	3.23	0.56	0.48
query33	3.03	3.17	3.08
query34	16.02	5.50	4.90
query35	4.92	4.89	4.96
query36	0.69	0.52	0.50
query37	0.11	0.07	0.07
query38	0.06	0.05	0.04
query39	0.04	0.03	0.03
query40	0.18	0.16	0.15
query41	0.08	0.04	0.03
query42	0.04	0.03	0.03
query43	0.04	0.03	0.04
Total cold run time: 104.14 s
Total hot run time: 29.78 s

@eldenmoon
Copy link
Member Author

run buildall

@doris-robot
Copy link

TPC-H: Total hot run time: 34603 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 83b0cfd13b0379efcfc227f145a485d344ffc3ef, data reload: false

------ Round 1 ----------------------------------
q1	17588	5235	4991	4991
q2	2010	331	206	206
q3	10256	1335	717	717
q4	10224	1019	511	511
q5	7552	2368	2371	2368
q6	179	165	136	136
q7	927	791	633	633
q8	9340	1356	1105	1105
q9	6843	5139	5123	5123
q10	6933	2399	2000	2000
q11	511	310	282	282
q12	355	363	222	222
q13	17762	3617	3167	3167
q14	230	241	215	215
q15	579	502	486	486
q16	984	1001	938	938
q17	616	848	356	356
q18	7407	7089	7051	7051
q19	1466	934	541	541
q20	343	342	234	234
q21	3708	3179	2338	2338
q22	1067	1039	983	983
Total cold run time: 106880 ms
Total hot run time: 34603 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5218	5057	5072	5057
q2	256	323	235	235
q3	2219	2654	2308	2308
q4	1339	1751	1335	1335
q5	4208	4478	4546	4478
q6	219	173	130	130
q7	2037	1933	1787	1787
q8	2683	2635	2572	2572
q9	7586	7359	7301	7301
q10	3075	3290	2942	2942
q11	585	524	501	501
q12	710	1008	609	609
q13	3423	3845	3345	3345
q14	296	328	303	303
q15	528	492	494	492
q16	1074	1118	1056	1056
q17	1177	1537	1413	1413
q18	7785	7771	7742	7742
q19	794	797	999	797
q20	1975	2021	1917	1917
q21	4860	4343	4281	4281
q22	1072	1086	1009	1009
Total cold run time: 53119 ms
Total hot run time: 51610 ms

@doris-robot
Copy link

TPC-DS: Total hot run time: 189490 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 83b0cfd13b0379efcfc227f145a485d344ffc3ef, data reload: false

query1	1059	477	427	427
query2	6572	1669	1670	1669
query3	6750	228	238	228
query4	26335	23455	23270	23270
query5	4394	653	513	513
query6	350	281	236	236
query7	4667	512	303	303
query8	307	259	253	253
query9	8650	2915	2914	2914
query10	519	358	308	308
query11	16227	15203	15082	15082
query12	190	128	124	124
query13	1722	565	447	447
query14	12019	9419	9350	9350
query15	218	205	189	189
query16	7995	633	502	502
query17	1250	745	631	631
query18	2408	427	334	334
query19	204	194	170	170
query20	134	131	125	125
query21	215	139	120	120
query22	4020	4251	4159	4159
query23	33791	33010	32970	32970
query24	8194	2351	2377	2351
query25	571	503	456	456
query26	1232	288	163	163
query27	2710	511	375	375
query28	4347	2230	2203	2203
query29	801	617	498	498
query30	287	230	197	197
query31	900	780	730	730
query32	94	82	82	82
query33	592	399	348	348
query34	780	857	533	533
query35	831	827	774	774
query36	984	1050	939	939
query37	132	116	94	94
query38	3529	3581	3510	3510
query39	1512	1437	1415	1415
query40	234	144	129	129
query41	72	70	108	70
query42	126	121	124	121
query43	536	500	470	470
query44	1325	864	862	862
query45	189	178	175	175
query46	866	1024	658	658
query47	1779	1807	1742	1742
query48	401	425	320	320
query49	749	537	417	417
query50	657	693	407	407
query51	3879	3935	3970	3935
query52	116	117	107	107
query53	249	262	191	191
query54	615	604	544	544
query55	107	94	92	92
query56	355	330	342	330
query57	1199	1176	1133	1133
query58	299	286	283	283
query59	2568	2617	2568	2568
query60	363	367	347	347
query61	170	163	160	160
query62	840	717	672	672
query63	230	200	192	192
query64	4433	1144	843	843
query65	4053	3969	3943	3943
query66	1086	462	357	357
query67	15301	15159	14996	14996
query68	8059	974	586	586
query69	509	338	302	302
query70	1311	1323	1309	1309
query71	602	361	332	332
query72	5979	4972	4966	4966
query73	699	585	362	362
query74	9484	9080	8580	8580
query75	3887	3237	2855	2855
query76	3635	1147	741	741
query77	801	410	333	333
query78	9548	9728	8872	8872
query79	2535	856	602	602
query80	665	585	513	513
query81	478	270	225	225
query82	424	172	150	150
query83	302	258	250	250
query84	301	120	93	93
query85	892	459	449	449
query86	347	334	299	299
query87	3723	3799	3614	3614
query88	3198	2238	2229	2229
query89	387	331	302	302
query90	1916	230	226	226
query91	159	169	136	136
query92	93	77	120	77
query93	1206	968	658	658
query94	694	417	305	305
query95	408	334	332	332
query96	479	587	285	285
query97	2948	2976	2906	2906
query98	260	224	229	224
query99	1485	1414	1321	1321
Total cold run time: 277703 ms
Total hot run time: 189490 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 30.04 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 83b0cfd13b0379efcfc227f145a485d344ffc3ef, data reload: false

query1	0.05	0.05	0.05
query2	0.09	0.05	0.05
query3	0.26	0.08	0.08
query4	1.61	0.12	0.12
query5	0.28	0.26	0.28
query6	1.17	0.66	0.65
query7	0.03	0.03	0.03
query8	0.06	0.04	0.04
query9	0.62	0.52	0.51
query10	0.57	0.58	0.58
query11	0.16	0.12	0.11
query12	0.16	0.12	0.12
query13	0.62	0.63	0.63
query14	1.04	1.05	1.02
query15	0.88	0.88	0.87
query16	0.40	0.40	0.40
query17	1.04	1.05	1.02
query18	0.22	0.23	0.21
query19	1.94	1.87	1.85
query20	0.02	0.01	0.01
query21	15.42	0.97	0.61
query22	0.76	1.15	0.73
query23	14.90	1.39	0.67
query24	6.59	1.53	0.72
query25	0.51	0.11	0.21
query26	0.51	0.16	0.13
query27	0.07	0.06	0.06
query28	10.04	0.97	0.43
query29	12.59	3.97	3.27
query30	0.28	0.13	0.12
query31	2.83	0.60	0.39
query32	3.25	0.57	0.48
query33	3.08	3.16	3.06
query34	15.97	5.47	4.86
query35	4.92	4.91	4.90
query36	0.70	0.53	0.51
query37	0.11	0.08	0.07
query38	0.07	0.05	0.04
query39	0.04	0.03	0.03
query40	0.19	0.16	0.15
query41	0.09	0.03	0.03
query42	0.04	0.03	0.03
query43	0.04	0.04	0.03
Total cold run time: 104.22 s
Total hot run time: 30.04 s

@doris-robot
Copy link

BE UT Coverage Report

Increment line coverage 94.74% (18/19) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.21% (17422/33369)
Line Coverage 37.43% (158349/423047)
Region Coverage 32.00% (120725/377266)
Branch Coverage 33.38% (52986/158755)

Problem:
When Variant data is NULL or its root is empty, serializing it
to JSON would incorrectly produce '\N' or other unexpected
results. The standard JSON format expects a 'null' literal or
an empty object '{}' for such cases.

Solution:
This commit addresses the issue with the following changes:
1.  In `HierarchicalDataIterator`, when a Variant's root data
is empty, it is now explicitly marked as NULL in the null map.
2.  The JSON serialization logic in
`ColumnVariant::serialize_text_json` is modified to serialize a
NULL sub-column as an empty JSON object '{}' instead of '\N'.
3.  The logic in `is_visible_root_value` is updated to rely on
the null flag rather than checking if the data content is
empty, providing a more accurate reflection of the value's
existence.

These changes ensure that the Variant type produces correct and
expected JSON output when serializing null or empty data.
Corresponding regression tests have also been added to cover
scenarios involving NULL and empty JSON objects.
@eldenmoon
Copy link
Member Author

run buildall

@doris-robot
Copy link

TPC-H: Total hot run time: 34613 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit f0a6aaba47eae6a069bbb294951028b8cf5dbabf, data reload: false

------ Round 1 ----------------------------------
q1	17618	5299	5129	5129
q2	2014	313	207	207
q3	10274	1288	741	741
q4	10232	1010	536	536
q5	7530	2480	2305	2305
q6	189	172	139	139
q7	954	767	630	630
q8	9344	1357	1075	1075
q9	6884	5115	5101	5101
q10	6952	2385	1985	1985
q11	495	313	272	272
q12	352	368	221	221
q13	17776	3674	3062	3062
q14	231	245	216	216
q15	562	483	479	479
q16	1013	1007	953	953
q17	581	864	363	363
q18	7637	7048	7054	7048
q19	1305	974	566	566
q20	361	341	233	233
q21	3860	3200	2373	2373
q22	1066	1051	979	979
Total cold run time: 107230 ms
Total hot run time: 34613 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5220	5089	5143	5089
q2	263	336	233	233
q3	2191	2687	2292	2292
q4	1384	1791	1359	1359
q5	4218	4535	4569	4535
q6	221	179	148	148
q7	2041	2042	1856	1856
q8	2728	2573	2562	2562
q9	7495	7448	7319	7319
q10	3098	3323	2836	2836
q11	579	529	510	510
q12	723	833	645	645
q13	3605	3926	3359	3359
q14	295	327	265	265
q15	532	465	498	465
q16	1054	1250	1087	1087
q17	1174	1555	1411	1411
q18	7957	7783	7597	7597
q19	837	774	808	774
q20	1895	2001	1874	1874
q21	4758	4435	4324	4324
q22	1071	1057	987	987
Total cold run time: 53339 ms
Total hot run time: 51527 ms

@doris-robot
Copy link

TPC-DS: Total hot run time: 190068 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit f0a6aaba47eae6a069bbb294951028b8cf5dbabf, data reload: false

query1	1044	438	448	438
query2	6593	1750	1743	1743
query3	6754	234	222	222
query4	26674	23633	23182	23182
query5	4406	637	531	531
query6	345	244	230	230
query7	4709	553	318	318
query8	304	265	251	251
query9	8659	2865	2886	2865
query10	507	367	308	308
query11	15830	14974	14899	14899
query12	170	120	116	116
query13	1666	579	442	442
query14	10654	9350	9392	9350
query15	212	199	173	173
query16	7442	700	523	523
query17	1250	793	629	629
query18	2022	427	339	339
query19	208	195	186	186
query20	143	130	126	126
query21	214	133	119	119
query22	4147	4252	4070	4070
query23	33793	33000	33150	33000
query24	8183	2421	2391	2391
query25	569	517	461	461
query26	1244	286	166	166
query27	2721	538	354	354
query28	4366	2228	2217	2217
query29	830	635	493	493
query30	302	230	199	199
query31	920	830	735	735
query32	93	83	79	79
query33	588	386	376	376
query34	820	878	554	554
query35	820	830	767	767
query36	971	1046	922	922
query37	135	117	97	97
query38	3504	3520	3453	3453
query39	1502	1435	1426	1426
query40	216	143	133	133
query41	70	63	63	63
query42	131	118	126	118
query43	539	517	467	467
query44	1397	888	879	879
query45	187	184	169	169
query46	879	1034	669	669
query47	1755	1791	1723	1723
query48	413	435	333	333
query49	766	543	418	418
query50	683	694	411	411
query51	3896	3932	3926	3926
query52	118	114	106	106
query53	254	274	201	201
query54	626	611	558	558
query55	102	89	95	89
query56	359	344	331	331
query57	1221	1208	1133	1133
query58	296	287	284	284
query59	2522	2559	2616	2559
query60	362	358	362	358
query61	163	152	187	152
query62	860	736	690	690
query63	237	201	199	199
query64	4506	1204	853	853
query65	4057	3985	4028	3985
query66	1175	442	349	349
query67	15355	15051	15050	15050
query68	6765	941	586	586
query69	506	339	301	301
query70	1367	1209	1298	1209
query71	550	354	338	338
query72	5863	5102	5165	5102
query73	647	606	366	366
query74	9112	9145	8957	8957
query75	3301	3265	2934	2934
query76	3217	1143	737	737
query77	490	414	334	334
query78	9532	9771	9022	9022
query79	3041	819	597	597
query80	755	672	533	533
query81	508	256	232	232
query82	719	168	154	154
query83	267	262	260	260
query84	262	122	105	105
query85	873	465	424	424
query86	415	324	305	305
query87	3669	3744	3650	3650
query88	3767	2242	2236	2236
query89	405	329	293	293
query90	1872	252	238	238
query91	182	173	140	140
query92	95	75	72	72
query93	2630	999	659	659
query94	737	430	330	330
query95	417	337	332	332
query96	483	583	281	281
query97	2953	3008	2860	2860
query98	254	218	213	213
query99	1452	1412	1312	1312
Total cold run time: 275565 ms
Total hot run time: 190068 ms

@doris-robot
Copy link

ClickBench: Total hot run time: 29.54 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit f0a6aaba47eae6a069bbb294951028b8cf5dbabf, data reload: false

query1	0.06	0.06	0.05
query2	0.10	0.05	0.06
query3	0.26	0.09	0.09
query4	1.60	0.12	0.12
query5	0.29	0.26	0.26
query6	1.18	0.66	0.64
query7	0.03	0.03	0.03
query8	0.06	0.05	0.04
query9	0.62	0.52	0.52
query10	0.59	0.59	0.57
query11	0.16	0.11	0.12
query12	0.15	0.13	0.12
query13	0.63	0.63	0.60
query14	1.07	1.04	1.04
query15	0.86	0.87	0.86
query16	0.40	0.39	0.40
query17	1.03	1.05	1.05
query18	0.21	0.20	0.20
query19	1.90	1.81	1.88
query20	0.02	0.01	0.01
query21	15.39	0.95	0.59
query22	0.78	1.13	0.84
query23	14.77	1.38	0.62
query24	7.00	1.12	0.32
query25	0.30	0.22	0.10
query26	0.64	0.18	0.13
query27	0.06	0.06	0.06
query28	8.71	0.93	0.44
query29	12.56	3.88	3.24
query30	0.28	0.14	0.11
query31	2.82	0.59	0.38
query32	3.26	0.56	0.48
query33	3.05	3.15	3.09
query34	16.10	5.48	4.82
query35	4.89	4.87	4.93
query36	0.68	0.51	0.52
query37	0.11	0.08	0.07
query38	0.06	0.05	0.04
query39	0.04	0.03	0.03
query40	0.18	0.15	0.15
query41	0.08	0.03	0.04
query42	0.04	0.03	0.04
query43	0.05	0.04	0.03
Total cold run time: 103.07 s
Total hot run time: 29.54 s

@doris-robot
Copy link

BE UT Coverage Report

Increment line coverage 91.43% (32/35) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.21% (17422/33369)
Line Coverage 37.43% (158365/423045)
Region Coverage 32.02% (120802/377266)
Branch Coverage 33.38% (52998/158755)

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (35/35) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 70.72% (23075/32628)
Line Coverage 57.12% (241068/422031)
Region Coverage 52.55% (200864/382257)
Branch Coverage 54.17% (86380/159456)

@eldenmoon eldenmoon changed the title [Fix](Json) fix serialize_one_cell_to_json should result 'null' instead of '\\N' when cell is empty Fix(Variant) Fix null value handling when serializing to JSON Sep 12, 2025
@eldenmoon eldenmoon changed the title Fix(Variant) Fix null value handling when serializing to JSON Fix(Variant) Fix null value handling when serializing to JSON string Sep 12, 2025
@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (35/35) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 70.72% (23074/32628)
Line Coverage 57.12% (241058/422031)
Region Coverage 52.55% (200871/382257)
Branch Coverage 54.17% (86376/159456)

@eldenmoon
Copy link
Member Author

run p0 10

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (35/35) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 70.72% (23074/32628)
Line Coverage 57.12% (241063/422031)
Region Coverage 52.54% (200836/382257)
Branch Coverage 54.17% (86380/159456)

Copy link
Contributor

@csun5285 csun5285 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actions
Copy link
Contributor

PR approved by anyone and no changes requested.

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (35/35) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 70.73% (23078/32628)
Line Coverage 57.14% (241147/422031)
Region Coverage 52.55% (200874/382257)
Branch Coverage 54.19% (86409/159456)

@hello-stephen
Copy link
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (35/35) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 70.72% (23074/32628)
Line Coverage 57.12% (241060/422031)
Region Coverage 52.54% (200851/382257)
Branch Coverage 54.17% (86383/159456)

Copy link
Member

@airborne12 airborne12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actions
Copy link
Contributor

PR approved by at least one committer and no changes requested.

@github-actions github-actions bot added the approved Indicates a PR has been approved by one committer. label Sep 15, 2025
@eldenmoon eldenmoon merged commit 5843f96 into apache:master Sep 15, 2025
26 of 32 checks passed
eldenmoon added a commit to eldenmoon/incubator-doris that referenced this pull request Sep 17, 2025
eldenmoon added a commit to eldenmoon/incubator-doris that referenced this pull request Sep 17, 2025
eldenmoon added a commit to eldenmoon/incubator-doris that referenced this pull request Sep 17, 2025
eldenmoon added a commit to eldenmoon/incubator-doris that referenced this pull request Sep 17, 2025
morrySnow pushed a commit that referenced this pull request Sep 19, 2025
@morrySnow morrySnow mentioned this pull request Sep 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by one committer. dev/3.1.1-merged reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants