@@ -540,3 +540,203 @@ cache_group.test_update_cache_with_incorrect_func = function(g)
540540 cache_size = helpers .get_sharding_func_cache_size (g .cluster )
541541 t .assert_equals (cache_size , 1 )
542542end
543+
544+
545+ local known_bucket_id_key = {1 , ' Emma' }
546+ local known_bucket_id_tuple = {
547+ known_bucket_id_key [1 ],
548+ box .NULL ,
549+ known_bucket_id_key [2 ],
550+ 22
551+ }
552+ local known_bucket_id_object = {
553+ id = known_bucket_id_key [1 ],
554+ bucket_id = box .NULL ,
555+ name = known_bucket_id_key [2 ],
556+ age = 22
557+ }
558+ local known_bucket_id = 1111
559+ local known_bucket_id_result_tuple = {
560+ known_bucket_id_key [1 ],
561+ known_bucket_id ,
562+ known_bucket_id_key [2 ],
563+ 22
564+ }
565+ local known_bucket_id_result = {
566+ s1 = nil ,
567+ s2 = known_bucket_id_result_tuple ,
568+ }
569+ local known_bucket_id_update = {{' +' , ' age' , 1 }}
570+ local known_bucket_id_updated_result = {
571+ s1 = nil ,
572+ s2 = {known_bucket_id_key [1 ], known_bucket_id , known_bucket_id_key [2 ], 23 },
573+ }
574+ local prepare_known_bucket_id_data = function (g )
575+ if known_bucket_id_result .s1 ~= nil then
576+ local conn_s1 = g .cluster :server (' s1-master' ).net_box
577+ local result = conn_s1 .space [g .params .space_name ]:insert (known_bucket_id_result .s1 )
578+ t .assert_equals (result , known_bucket_id_result .s1 )
579+ end
580+
581+ if known_bucket_id_result .s2 ~= nil then
582+ local conn_s2 = g .cluster :server (' s2-master' ).net_box
583+ local result = conn_s2 .space [g .params .space_name ]:insert (known_bucket_id_result .s2 )
584+ t .assert_equals (result , known_bucket_id_result .s2 )
585+ end
586+ end
587+
588+ local known_bucket_id_write_cases = {
589+ insert = {
590+ func = ' crud.insert' ,
591+ input_2 = known_bucket_id_tuple ,
592+ input_3 = {bucket_id = known_bucket_id },
593+ result = known_bucket_id_result ,
594+ },
595+ insert_object = {
596+ func = ' crud.insert_object' ,
597+ input_2 = known_bucket_id_object ,
598+ input_3 = {bucket_id = known_bucket_id },
599+ result = known_bucket_id_result ,
600+ },
601+ replace = {
602+ func = ' crud.replace' ,
603+ input_2 = known_bucket_id_tuple ,
604+ input_3 = {bucket_id = known_bucket_id },
605+ result = known_bucket_id_result ,
606+ },
607+ replace_object = {
608+ func = ' crud.replace_object' ,
609+ input_2 = known_bucket_id_object ,
610+ input_3 = {bucket_id = known_bucket_id },
611+ result = known_bucket_id_result ,
612+ },
613+ upsert = {
614+ func = ' crud.upsert' ,
615+ input_2 = known_bucket_id_tuple ,
616+ input_3 = {},
617+ input_4 = {bucket_id = known_bucket_id },
618+ result = known_bucket_id_result ,
619+ },
620+ upsert_object = {
621+ func = ' crud.upsert_object' ,
622+ input_2 = known_bucket_id_object ,
623+ input_3 = {},
624+ input_4 = {bucket_id = known_bucket_id },
625+ result = known_bucket_id_result ,
626+ },
627+ update = {
628+ before_test = prepare_known_bucket_id_data ,
629+ func = ' crud.update' ,
630+ input_2 = known_bucket_id_key ,
631+ input_3 = known_bucket_id_update ,
632+ input_4 = {bucket_id = known_bucket_id },
633+ result = known_bucket_id_updated_result ,
634+ },
635+ delete = {
636+ before_test = prepare_known_bucket_id_data ,
637+ func = ' crud.delete' ,
638+ input_2 = known_bucket_id_key ,
639+ input_3 = {bucket_id = known_bucket_id },
640+ result = {},
641+ },
642+ }
643+
644+ for name , case in pairs (known_bucket_id_write_cases ) do
645+ local test_name = (' test_gh_278_%s_with_explicit_bucket_id_and_ddl' ):format (name )
646+
647+ if case .before_test ~= nil then
648+ pgroup .before_test (test_name , case .before_test )
649+ end
650+
651+ pgroup [test_name ] = function (g )
652+ local obj , err = g .cluster .main_server .net_box :call (
653+ case .func , {
654+ g .params .space_name ,
655+ case .input_2 ,
656+ case .input_3 ,
657+ case .input_4 ,
658+ })
659+ t .assert_equals (err , nil )
660+ t .assert_is_not (obj , nil )
661+
662+ local conn_s1 = g .cluster :server (' s1-master' ).net_box
663+ local result = conn_s1 .space [g .params .space_name ]:get (known_bucket_id_key )
664+ t .assert_equals (result , case .result .s1 )
665+
666+ local conn_s2 = g .cluster :server (' s2-master' ).net_box
667+ local result = conn_s2 .space [g .params .space_name ]:get (known_bucket_id_key )
668+ t .assert_equals (result , case .result .s2 )
669+ end
670+ end
671+
672+ local known_bucket_id_read_cases = {
673+ get = {
674+ func = ' crud.get' ,
675+ input_2 = known_bucket_id_key ,
676+ input_3 = {bucket_id = known_bucket_id },
677+ },
678+ select = {
679+ func = ' crud.select' ,
680+ input_2 = {{ ' ==' , ' id' , known_bucket_id_key }},
681+ input_3 = {bucket_id = known_bucket_id },
682+ },
683+ }
684+
685+ for name , case in pairs (known_bucket_id_read_cases ) do
686+ local test_name = (' test_gh_278_%s_with_explicit_bucket_id_and_ddl' ):format (name )
687+
688+ pgroup .before_test (test_name , prepare_known_bucket_id_data )
689+
690+ pgroup [test_name ] = function (g )
691+ local obj , err = g .cluster .main_server .net_box :call (
692+ case .func , {
693+ g .params .space_name ,
694+ case .input_2 ,
695+ case .input_3 ,
696+ })
697+ t .assert_equals (err , nil )
698+ t .assert_is_not (obj , nil )
699+ t .assert_equals (obj .rows , {known_bucket_id_result_tuple })
700+ end
701+ end
702+
703+ pgroup .before_test (
704+ ' test_gh_278_pairs_with_explicit_bucket_id_and_ddl' ,
705+ prepare_known_bucket_id_data )
706+
707+ pgroup .test_gh_278_pairs_with_explicit_bucket_id_and_ddl = function (g )
708+ local obj , err = g .cluster .main_server .net_box :eval ([[
709+ local res = {}
710+ for _, row in crud.pairs(...) do
711+ table.insert(res, row)
712+ end
713+
714+ return res
715+ ]] , {
716+ g .params .space_name ,
717+ {{ ' ==' , ' id' , known_bucket_id_key }},
718+ {bucket_id = known_bucket_id }
719+ })
720+
721+ t .assert_equals (err , nil )
722+ t .assert_is_not (obj , nil )
723+ t .assert_equals (obj , {known_bucket_id_result_tuple })
724+ end
725+
726+ pgroup .before_test (
727+ ' test_gh_278_count_with_explicit_bucket_id_and_ddl' ,
728+ prepare_known_bucket_id_data )
729+
730+ pgroup .test_gh_278_count_with_explicit_bucket_id_and_ddl = function (g )
731+ local obj , err = g .cluster .main_server .net_box :call (
732+ ' crud.count' ,
733+ {
734+ g .params .space_name ,
735+ {{ ' ==' , ' id' , known_bucket_id_key }},
736+ {bucket_id = known_bucket_id }
737+ })
738+
739+ t .assert_equals (err , nil )
740+ t .assert_is_not (obj , nil )
741+ t .assert_equals (obj , 1 )
742+ end
0 commit comments