@@ -694,6 +694,35 @@ dbcontext::cmd_sql_internal(dbcallback_i& cb, const prep_stmt& pst,
694694 return cb.dbcb_resp_short (2 , " notimpl" );
695695}
696696
697+ static size_t
698+ prepare_keybuf (const cmd_exec_args& args, uchar *key_buf, TABLE *table,
699+ KEY& kinfo, size_t invalues_index)
700+ {
701+ size_t kplen_sum = 0 ;
702+ DBG_KEY (fprintf (stderr, " SLOW\n " ));
703+ for (size_t i = 0 ; i < args.kvalslen ; ++i) {
704+ const KEY_PART_INFO & kpt = kinfo.key_part [i];
705+ string_ref kval = args.kvals [i];
706+ if (args.invalues_keypart >= 0 &&
707+ static_cast <size_t >(args.invalues_keypart ) == i) {
708+ kval = args.invalues [invalues_index];
709+ }
710+ if (kval.begin () == 0 ) {
711+ kpt.field ->set_null ();
712+ } else {
713+ kpt.field ->set_notnull ();
714+ }
715+ kpt.field ->store (kval.begin (), kval.size (), &my_charset_bin);
716+ kplen_sum += kpt.store_length ;
717+ DBG_KEYLEN (fprintf (stderr, " l=%u sl=%zu\n " , kpt.length ,
718+ kpt.store_length ));
719+ }
720+ key_copy (key_buf, table->record [0 ], &kinfo, kplen_sum);
721+ DBG_KEYLEN (fprintf (stderr, " sum=%zu flen=%u\n " , kplen_sum,
722+ kinfo.key_length ));
723+ return kplen_sum;
724+ }
725+
697726void
698727dbcontext::cmd_find_internal (dbcallback_i& cb, const prep_stmt& pst,
699728 ha_rkey_function find_flag, const cmd_exec_args& args)
@@ -738,26 +767,8 @@ dbcontext::cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst,
738767 return cb.dbcb_resp_short (2 , " kpnum" );
739768 }
740769 uchar *const key_buf = DENA_ALLOCA_ALLOCATE (uchar, kinfo.key_length );
741- size_t kplen_sum = 0 ;
742- {
743- DBG_KEY (fprintf (stderr, " SLOW\n " ));
744- for (size_t i = 0 ; i < args.kvalslen ; ++i) {
745- const KEY_PART_INFO & kpt = kinfo.key_part [i];
746- const string_ref& kval = args.kvals [i];
747- if (kval.begin () == 0 ) {
748- kpt.field ->set_null ();
749- } else {
750- kpt.field ->set_notnull ();
751- }
752- kpt.field ->store (kval.begin (), kval.size (), &my_charset_bin);
753- kplen_sum += kpt.store_length ;
754- DBG_KEYLEN (fprintf (stderr, " l=%u sl=%zu\n " , kpt.length ,
755- kpt.store_length ));
756- }
757- key_copy (key_buf, table->record [0 ], &kinfo, kplen_sum);
758- DBG_KEYLEN (fprintf (stderr, " sum=%zu flen=%u\n " , kplen_sum,
759- kinfo.key_length ));
760- }
770+ size_t invalues_idx = 0 ;
771+ size_t kplen_sum = prepare_keybuf (args, key_buf, table, kinfo, invalues_idx);
761772 /* filters */
762773 uchar *filter_buf = 0 ;
763774 if (args.filters != 0 ) {
@@ -787,8 +798,17 @@ dbcontext::cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst,
787798 uint32_t skip = args.skip ;
788799 size_t modified_count = 0 ;
789800 int r = 0 ;
790- for (uint32_t i = 0 ; i < limit + skip; ++i) {
791- if (i == 0 ) {
801+ bool is_first = true ;
802+ for (uint32_t cnt = 0 ; cnt < limit + skip;) {
803+ if (is_first) {
804+ is_first = false ;
805+ const key_part_map kpm = (1U << args.kvalslen ) - 1 ;
806+ r = hnd->index_read_map (table->record [0 ], key_buf, kpm, find_flag);
807+ } else if (args.invalues_keypart >= 0 ) {
808+ if (++invalues_idx >= args.invalueslen ) {
809+ break ;
810+ }
811+ kplen_sum = prepare_keybuf (args, key_buf, table, kinfo, invalues_idx);
792812 const key_part_map kpm = (1U << args.kvalslen ) - 1 ;
793813 r = hnd->index_read_map (table->record [0 ], key_buf, kpm, find_flag);
794814 } else {
@@ -826,12 +846,17 @@ dbcontext::cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst,
826846 } else if (skip > 0 ) {
827847 --skip;
828848 } else {
849+ /* hit */
829850 if (need_resp_record) {
830851 resp_record (cb, table, pst);
831852 }
832853 if (mod_op != 0 ) {
833854 r = modify_record (cb, table, pst, args, mod_op, modified_count);
834855 }
856+ ++cnt;
857+ }
858+ if (args.invalues_keypart >= 0 && r == HA_ERR_KEY_NOT_FOUND) {
859+ continue ;
835860 }
836861 if (r != 0 && r != HA_ERR_RECORD_DELETED) {
837862 break ;
0 commit comments