@@ -392,6 +392,92 @@ pgroup:add('test_upsert', function(g)
392392 t .assert_equals (result .rows , {{67 , 1143 , ' Mikhail Saltykov-Shchedrin' , 63 }})
393393end )
394394
395+ pgroup :add (' test_intermediate_nullable_fields_update' , function (g )
396+ local result , err = g .cluster .main_server .net_box :call (
397+ ' crud.insert' , {' developers' , {1 , box .NULL }})
398+ t .assert_equals (err , nil )
399+
400+ local objects = crud .unflatten_rows (result .rows , result .metadata )
401+ t .assert_equals (objects , {
402+ {
403+ id = 1 ,
404+ bucket_id = 477
405+ }
406+ })
407+
408+ helpers .call_on_servers (g .cluster , {' s1-master' , ' s2-master' }, function (server )
409+ for i = 1 , 12 do
410+ server .net_box :call (' add_extra_field' , {' extra_' .. tostring (i )})
411+ end
412+ end )
413+
414+ local result , err = g .cluster .main_server .net_box :call (' crud.update' ,
415+ {' developers' , 1 , {{' =' , ' extra_3' , { a = { b = {} } } }}})
416+ t .assert_equals (err , nil )
417+ objects = crud .unflatten_rows (result .rows , result .metadata )
418+ t .assert_equals (objects , {
419+ {
420+ id = 1 ,
421+ bucket_id = 477 ,
422+ extra_1 = box .NULL ,
423+ extra_2 = box .NULL ,
424+ extra_3 = {a = {b = {}}},
425+ }
426+ })
427+
428+ -- This tests use jsonpath updates.
429+ if _TARANTOOL >= " 2.3" then
430+ local _ , err = g .cluster .main_server .net_box :call (' crud.update' ,
431+ {' developers' , 1 , {{' =' , ' [5].a.b[1]' , 3 }, {' =' , ' extra_5' , ' extra_value_5' }}})
432+ t .assert_equals (err .err , " Failed to update: Field ''extra_5'' was not found in the tuple" )
433+ end
434+
435+ result , err = g .cluster .main_server .net_box :call (' crud.update' ,
436+ {' developers' , 1 , {{' =' , 5 , ' extra_value_3' }, {' =' , 7 , ' extra_value_5' }}})
437+ t .assert_equals (err , nil )
438+ objects = crud .unflatten_rows (result .rows , result .metadata )
439+ t .assert_equals (objects , {
440+ {
441+ id = 1 ,
442+ bucket_id = 477 ,
443+ extra_1 = box .NULL ,
444+ extra_2 = box .NULL ,
445+ extra_3 = ' extra_value_3' ,
446+ extra_4 = box .NULL ,
447+ extra_5 = ' extra_value_5' ,
448+ }
449+ })
450+
451+ result , err = g .cluster .main_server .net_box :call (' crud.update' ,
452+ {' developers' , 1 , {
453+ {' =' , 14 , ' extra_value_12' },
454+ {' =' , ' extra_9' , ' extra_value_9' },
455+ {' =' , ' extra_3' , ' updated_extra_value_3' }
456+ }
457+ })
458+
459+ t .assert_equals (err , nil )
460+ objects = crud .unflatten_rows (result .rows , result .metadata )
461+ t .assert_equals (objects , {
462+ {
463+ id = 1 ,
464+ bucket_id = 477 ,
465+ extra_1 = box .NULL ,
466+ extra_2 = box .NULL ,
467+ extra_3 = ' updated_extra_value_3' ,
468+ extra_4 = box .NULL ,
469+ extra_5 = ' extra_value_5' ,
470+ extra_6 = box .NULL ,
471+ extra_7 = box .NULL ,
472+ extra_8 = box .NULL ,
473+ extra_9 = ' extra_value_9' ,
474+ extra_10 = box .NULL ,
475+ extra_11 = box .NULL ,
476+ extra_12 = ' extra_value_12'
477+ }
478+ })
479+ end )
480+
395481pgroup :add (' test_object_with_nullable_fields' , function (g )
396482 -- Insert
397483 local result , err = g .cluster .main_server .net_box :call (
0 commit comments