Skip to content

Commit 4a1f35b

Browse files
authored
Fix empty LUA table reply (#3924)
* Fix empty LUA table reply * processMapKeyValueReply returns List<KeyValue> * make PROTOCOL_EMPTY_MAP unmodifiable
1 parent cd9a1ab commit 4a1f35b

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

Diff for: src/main/java/redis/clients/jedis/BuilderFactory.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,9 @@ public Object build(Object data) {
385385

386386
if (data instanceof List) {
387387
final List list = (List) data;
388-
if (list.isEmpty()) return Collections.emptyMap();
388+
if (list.isEmpty()) {
389+
return list == Protocol.PROTOCOL_EMPTY_MAP ? Collections.emptyMap() : Collections.emptyList();
390+
}
389391

390392
if (list.get(0) instanceof KeyValue) {
391393
return ((List<KeyValue>) data).stream()
@@ -397,8 +399,9 @@ public Object build(Object data) {
397399
}
398400
} else if (data instanceof byte[]) {
399401
return STRING.build(data);
402+
} else {
403+
return data;
400404
}
401-
return data;
402405
}
403406
};
404407

Diff for: src/main/java/redis/clients/jedis/Protocol.java

+14-8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.nio.charset.Charset;
55
import java.nio.charset.StandardCharsets;
66
import java.util.ArrayList;
7+
import java.util.Collections;
78
import java.util.List;
89
import java.util.Locale;
910

@@ -49,6 +50,8 @@ public final class Protocol {
4950
public static final byte[] POSITIVE_INFINITY_BYTES = "+inf".getBytes();
5051
public static final byte[] NEGATIVE_INFINITY_BYTES = "-inf".getBytes();
5152

53+
static final List<KeyValue> PROTOCOL_EMPTY_MAP = Collections.unmodifiableList(new ArrayList<>(0));
54+
5255
private static final String ASK_PREFIX = "ASK ";
5356
private static final String MOVED_PREFIX = "MOVED ";
5457
private static final String CLUSTERDOWN_PREFIX = "CLUSTERDOWN ";
@@ -192,7 +195,6 @@ private static byte[] processBulkReply(final RedisInputStream is) {
192195
}
193196

194197
private static List<Object> processMultiBulkReply(final RedisInputStream is) {
195-
// private static List<Object> processMultiBulkReply(final int num, final RedisInputStream is) {
196198
final int num = is.readIntCrLf();
197199
if (num == -1) return null;
198200
final List<Object> ret = new ArrayList<>(num);
@@ -206,16 +208,20 @@ private static List<Object> processMultiBulkReply(final RedisInputStream is) {
206208
return ret;
207209
}
208210

209-
// private static List<Object> processMultiBulkReply(final RedisInputStream is) {
210-
// private static List<Object> processMultiBulkReply(final int num, final RedisInputStream is) {
211211
private static List<KeyValue> processMapKeyValueReply(final RedisInputStream is) {
212212
final int num = is.readIntCrLf();
213-
if (num == -1) return null;
214-
final List<KeyValue> ret = new ArrayList<>(num);
215-
for (int i = 0; i < num; i++) {
216-
ret.add(new KeyValue(process(is), process(is)));
213+
switch (num) {
214+
case -1:
215+
return null;
216+
case 0:
217+
return PROTOCOL_EMPTY_MAP;
218+
default:
219+
final List<KeyValue> ret = new ArrayList<>(num);
220+
for (int i = 0; i < num; i++) {
221+
ret.add(new KeyValue(process(is), process(is)));
222+
}
223+
return ret;
217224
}
218-
return ret;
219225
}
220226

221227
public static Object read(final RedisInputStream is) {

Diff for: src/test/java/redis/clients/jedis/commands/jedis/ScriptingCommandsTest.java

+6
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,12 @@ public void scriptExistsWithBrokenConnection() {
328328
deadClient.close();
329329
}
330330

331+
@Test
332+
public void emptyLuaTableReply() {
333+
Object reply = jedis.eval("return {}");
334+
assertEquals(Collections.emptyList(), reply);
335+
}
336+
331337
@Test
332338
public void functionLoadAndDelete() {
333339
String engine = "Lua";

0 commit comments

Comments
 (0)