Skip to content

Commit e69d5d3

Browse files
committed
Allow multiple rows to be returned for each element in the IN() clause.
1 parent 1c6b760 commit e69d5d3

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

handlersocket/database.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -796,18 +796,23 @@ dbcontext::cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst,
796796
size_t modified_count = 0;
797797
int r = 0;
798798
bool is_first = true;
799+
bool in_loop = false;
799800
for (uint32_t cnt = 0; cnt < limit + skip;) {
800801
if (is_first) {
801802
is_first = false;
802803
const key_part_map kpm = (1U << args.kvalslen) - 1;
803804
r = hnd->index_read_map(table->record[0], key_buf, kpm, find_flag);
804-
} else if (args.invalues_keypart >= 0) {
805+
if (args.invalues_keypart >= 0) {
806+
in_loop = true;
807+
}
808+
} else if (!in_loop && args.invalues_keypart >= 0) {
805809
if (++invalues_idx >= args.invalueslen) {
806810
break;
807811
}
808812
kplen_sum = prepare_keybuf(args, key_buf, table, kinfo, invalues_idx);
809813
const key_part_map kpm = (1U << args.kvalslen) - 1;
810814
r = hnd->index_read_map(table->record[0], key_buf, kpm, find_flag);
815+
in_loop = true;
811816
} else {
812817
switch (find_flag) {
813818
case HA_READ_BEFORE_KEY:
@@ -852,7 +857,8 @@ dbcontext::cmd_find_internal(dbcallback_i& cb, const prep_stmt& pst,
852857
}
853858
++cnt;
854859
}
855-
if (args.invalues_keypart >= 0 && r == HA_ERR_KEY_NOT_FOUND) {
860+
if (args.invalues_keypart >= 0 && r != 0 ) {
861+
in_loop = false;
856862
continue;
857863
}
858864
if (r != 0 && r != HA_ERR_RECORD_DELETED) {
@@ -1181,3 +1187,4 @@ dbcontext::set_statistics(size_t num_conns, size_t num_active)
11811187

11821188
};
11831189

1190+

0 commit comments

Comments
 (0)