summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bitops.c2
-rw-r--r--src/geo.c4
-rw-r--r--src/object.c3
-rw-r--r--src/t_hash.c12
-rw-r--r--src/t_list.c21
-rw-r--r--src/t_set.c9
-rw-r--r--src/t_stream.c10
-rw-r--r--src/t_string.c13
-rw-r--r--src/t_zset.c28
9 files changed, 38 insertions, 64 deletions
diff --git a/src/bitops.c b/src/bitops.c
index 4b1a09aa4..37fb13f0c 100644
--- a/src/bitops.c
+++ b/src/bitops.c
@@ -480,12 +480,12 @@ int getBitfieldTypeFromArgument(client *c, robj *o, int *sign, int *bits) {
robj *lookupStringForBitCommand(client *c, size_t maxbit) {
size_t byte = maxbit >> 3;
robj *o = lookupKeyWrite(c->db,c->argv[1]);
+ if (checkType(c,o,OBJ_STRING)) return NULL;
if (o == NULL) {
o = createObject(OBJ_STRING,sdsnewlen(NULL, byte+1));
dbAdd(c->db,c->argv[1],o);
} else {
- if (checkType(c,o,OBJ_STRING)) return NULL;
o = dbUnshareStringValue(c->db,c->argv[1],o);
o->ptr = sdsgrowzero(o->ptr,byte+1);
}
diff --git a/src/geo.c b/src/geo.c
index 3e5d5f606..77f07637a 100644
--- a/src/geo.c
+++ b/src/geo.c
@@ -702,7 +702,7 @@ void geohashCommand(client *c) {
/* Look up the requested zset */
robj *zobj = lookupKeyRead(c->db, c->argv[1]);
- if (zobj && checkType(c, zobj, OBJ_ZSET)) return;
+ if (checkType(c, zobj, OBJ_ZSET)) return;
/* Geohash elements one after the other, using a null bulk reply for
* missing elements. */
@@ -763,7 +763,7 @@ void geoposCommand(client *c) {
/* Look up the requested zset */
robj *zobj = lookupKeyRead(c->db, c->argv[1]);
- if (zobj && checkType(c, zobj, OBJ_ZSET)) return;
+ if (checkType(c, zobj, OBJ_ZSET)) return;
/* Report elements one after the other, using a null bulk reply for
* missing elements. */
diff --git a/src/object.c b/src/object.c
index 6ba18d6a5..184e5ffc0 100644
--- a/src/object.c
+++ b/src/object.c
@@ -402,7 +402,8 @@ robj *resetRefCount(robj *obj) {
}
int checkType(client *c, robj *o, int type) {
- if (o->type != type) {
+ /* A NULL is considered an empty key */
+ if (o && o->type != type) {
addReply(c,shared.wrongtypeerr);
return 1;
}
diff --git a/src/t_hash.c b/src/t_hash.c
index 866bcd25b..5dacd735b 100644
--- a/src/t_hash.c
+++ b/src/t_hash.c
@@ -450,14 +450,11 @@ sds hashTypeCurrentObjectNewSds(hashTypeIterator *hi, int what) {
robj *hashTypeLookupWriteOrCreate(client *c, robj *key) {
robj *o = lookupKeyWrite(c->db,key);
+ if (checkType(c,o,OBJ_HASH)) return NULL;
+
if (o == NULL) {
o = createHashObject();
dbAdd(c->db,key,o);
- } else {
- if (o->type != OBJ_HASH) {
- addReply(c,shared.wrongtypeerr);
- return NULL;
- }
}
return o;
}
@@ -692,10 +689,7 @@ void hmgetCommand(client *c) {
/* Don't abort when the key cannot be found. Non-existing keys are empty
* hashes, where HMGET should respond with a series of null bulks. */
o = lookupKeyRead(c->db, c->argv[1]);
- if (o != NULL && o->type != OBJ_HASH) {
- addReply(c, shared.wrongtypeerr);
- return;
- }
+ if (checkType(c,o,OBJ_HASH)) return;
addReplyArrayLen(c, c->argc-2);
for (i = 2; i < c->argc; i++) {
diff --git a/src/t_list.c b/src/t_list.c
index 2c339888d..7737da771 100644
--- a/src/t_list.c
+++ b/src/t_list.c
@@ -198,8 +198,7 @@ void pushGenericCommand(client *c, int where) {
int j, pushed = 0;
robj *lobj = lookupKeyWrite(c->db,c->argv[1]);
- if (lobj && lobj->type != OBJ_LIST) {
- addReply(c,shared.wrongtypeerr);
+ if (checkType(c,lobj,OBJ_LIST)) {
return;
}
@@ -691,7 +690,7 @@ void rpoplpushCommand(client *c) {
robj *dobj = lookupKeyWrite(c->db,c->argv[2]);
robj *touchedkey = c->argv[1];
- if (dobj && checkType(c,dobj,OBJ_LIST)) return;
+ if (checkType(c,dobj,OBJ_LIST)) return;
value = listTypePop(sobj,LIST_TAIL);
/* We saved touched key, and protect it, since rpoplpushHandlePush
* may change the client command argument vector (it does not
@@ -803,8 +802,7 @@ void blockingPopGenericCommand(client *c, int where) {
for (j = 1; j < c->argc-1; j++) {
o = lookupKeyWrite(c->db,c->argv[j]);
if (o != NULL) {
- if (o->type != OBJ_LIST) {
- addReply(c,shared.wrongtypeerr);
+ if (checkType(c,o,OBJ_LIST)) {
return;
} else {
if (listTypeLength(o) != 0) {
@@ -863,6 +861,7 @@ void brpoplpushCommand(client *c) {
!= C_OK) return;
robj *key = lookupKeyWrite(c->db, c->argv[1]);
+ if (checkType(c,key,OBJ_LIST)) return;
if (key == NULL) {
if (c->flags & CLIENT_MULTI) {
@@ -874,13 +873,9 @@ void brpoplpushCommand(client *c) {
blockForKeys(c,BLOCKED_LIST,c->argv + 1,1,timeout,c->argv[2],NULL);
}
} else {
- if (key->type != OBJ_LIST) {
- addReply(c, shared.wrongtypeerr);
- } else {
- /* The list exists and has elements, so
- * the regular rpoplpushCommand is executed. */
- serverAssertWithInfo(c,key,listTypeLength(key) > 0);
- rpoplpushCommand(c);
- }
+ /* The list exists and has elements, so
+ * the regular rpoplpushCommand is executed. */
+ serverAssertWithInfo(c,key,listTypeLength(key) > 0);
+ rpoplpushCommand(c);
}
}
diff --git a/src/t_set.c b/src/t_set.c
index f474c2b56..9166e2b9a 100644
--- a/src/t_set.c
+++ b/src/t_set.c
@@ -266,14 +266,11 @@ void saddCommand(client *c) {
int j, added = 0;
set = lookupKeyWrite(c->db,c->argv[1]);
+ if (checkType(c,set,OBJ_SET)) return;
+
if (set == NULL) {
set = setTypeCreate(c->argv[2]->ptr);
dbAdd(c->db,c->argv[1],set);
- } else {
- if (set->type != OBJ_SET) {
- addReply(c,shared.wrongtypeerr);
- return;
- }
}
for (j = 2; j < c->argc; j++) {
@@ -330,7 +327,7 @@ void smoveCommand(client *c) {
/* If the source key has the wrong type, or the destination key
* is set and has the wrong type, return with an error. */
if (checkType(c,srcset,OBJ_SET) ||
- (dstset && checkType(c,dstset,OBJ_SET))) return;
+ checkType(c,dstset,OBJ_SET)) return;
/* If srcset and dstset are equal, SMOVE is a no-op */
if (srcset == dstset) {
diff --git a/src/t_stream.c b/src/t_stream.c
index fc5c4c99e..1ab85a3b1 100644
--- a/src/t_stream.c
+++ b/src/t_stream.c
@@ -1108,14 +1108,10 @@ size_t streamReplyWithRangeFromConsumerPEL(client *c, stream *s, streamID *start
* The function creates a key setting it to an empty stream if needed. */
robj *streamTypeLookupWriteOrCreate(client *c, robj *key) {
robj *o = lookupKeyWrite(c->db,key);
+ if (checkType(c,o,OBJ_STREAM)) return NULL;
if (o == NULL) {
o = createStreamObject();
dbAdd(c->db,key,o);
- } else {
- if (o->type != OBJ_STREAM) {
- addReply(c,shared.wrongtypeerr);
- return NULL;
- }
}
return o;
}
@@ -1460,7 +1456,7 @@ void xreadCommand(client *c) {
int id_idx = i - streams_arg - streams_count;
robj *key = c->argv[i-streams_count];
robj *o = lookupKeyRead(c->db,key);
- if (o && checkType(c,o,OBJ_STREAM)) goto cleanup;
+ if (checkType(c,o,OBJ_STREAM)) goto cleanup;
streamCG *group = NULL;
/* If a group was specified, than we need to be sure that the
@@ -2022,7 +2018,7 @@ void xpendingCommand(client *c) {
robj *o = lookupKeyRead(c->db,c->argv[1]);
streamCG *group;
- if (o && checkType(c,o,OBJ_STREAM)) return;
+ if (checkType(c,o,OBJ_STREAM)) return;
if (o == NULL ||
(group = streamLookupCG(o->ptr,groupname->ptr)) == NULL)
{
diff --git a/src/t_string.c b/src/t_string.c
index 4be758e65..93910e5a9 100644
--- a/src/t_string.c
+++ b/src/t_string.c
@@ -167,13 +167,12 @@ int getGenericCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.null[c->resp])) == NULL)
return C_OK;
- if (o->type != OBJ_STRING) {
- addReply(c,shared.wrongtypeerr);
+ if (checkType(c,o,OBJ_STRING)) {
return C_ERR;
- } else {
- addReplyBulk(c,o);
- return C_OK;
}
+
+ addReplyBulk(c,o);
+ return C_OK;
}
void getCommand(client *c) {
@@ -348,7 +347,7 @@ void incrDecrCommand(client *c, long long incr) {
robj *o, *new;
o = lookupKeyWrite(c->db,c->argv[1]);
- if (o != NULL && checkType(c,o,OBJ_STRING)) return;
+ if (checkType(c,o,OBJ_STRING)) return;
if (getLongLongFromObjectOrReply(c,o,&value,NULL) != C_OK) return;
oldvalue = value;
@@ -408,7 +407,7 @@ void incrbyfloatCommand(client *c) {
robj *o, *new, *aux1, *aux2;
o = lookupKeyWrite(c->db,c->argv[1]);
- if (o != NULL && checkType(c,o,OBJ_STRING)) return;
+ if (checkType(c,o,OBJ_STRING)) return;
if (getLongDoubleFromObjectOrReply(c,o,&value,NULL) != C_OK ||
getLongDoubleFromObjectOrReply(c,c->argv[2],&incr,NULL) != C_OK)
return;
diff --git a/src/t_zset.c b/src/t_zset.c
index 87a5a882e..3b716bb99 100644
--- a/src/t_zset.c
+++ b/src/t_zset.c
@@ -1598,6 +1598,7 @@ void zaddGenericCommand(client *c, int flags) {
/* Lookup the key and create the sorted set if does not exist. */
zobj = lookupKeyWrite(c->db,key);
+ if (checkType(c,zobj,OBJ_ZSET)) goto cleanup;
if (zobj == NULL) {
if (xx) goto reply_to_client; /* No key + XX option: nothing to do. */
if (server.zset_max_ziplist_entries == 0 ||
@@ -1608,11 +1609,6 @@ void zaddGenericCommand(client *c, int flags) {
zobj = createZsetZiplistObject();
}
dbAdd(c->db,key,zobj);
- } else {
- if (zobj->type != OBJ_ZSET) {
- addReply(c,shared.wrongtypeerr);
- goto cleanup;
- }
}
for (j = 0; j < elements; j++) {
@@ -3087,7 +3083,7 @@ void zmscoreCommand(client *c) {
robj *zobj;
double score;
zobj = lookupKeyRead(c->db,key);
- if (zobj != NULL && checkType(c,zobj,OBJ_ZSET)) return;
+ if (checkType(c,zobj,OBJ_ZSET)) return;
addReplyArrayLen(c,c->argc - 2);
for (int j = 2; j < c->argc; j++) {
@@ -3280,20 +3276,16 @@ void blockingGenericZpopCommand(client *c, int where) {
for (j = 1; j < c->argc-1; j++) {
o = lookupKeyWrite(c->db,c->argv[j]);
+ if (checkType(c,o,OBJ_ZSET)) return;
if (o != NULL) {
- if (o->type != OBJ_ZSET) {
- addReply(c,shared.wrongtypeerr);
+ if (zsetLength(o) != 0) {
+ /* Non empty zset, this is like a normal ZPOP[MIN|MAX]. */
+ genericZpopCommand(c,&c->argv[j],1,where,1,NULL);
+ /* Replicate it as an ZPOP[MIN|MAX] instead of BZPOP[MIN|MAX]. */
+ rewriteClientCommandVector(c,2,
+ where == ZSET_MAX ? shared.zpopmax : shared.zpopmin,
+ c->argv[j]);
return;
- } else {
- if (zsetLength(o) != 0) {
- /* Non empty zset, this is like a normal ZPOP[MIN|MAX]. */
- genericZpopCommand(c,&c->argv[j],1,where,1,NULL);
- /* Replicate it as an ZPOP[MIN|MAX] instead of BZPOP[MIN|MAX]. */
- rewriteClientCommandVector(c,2,
- where == ZSET_MAX ? shared.zpopmax : shared.zpopmin,
- c->argv[j]);
- return;
- }
}
}
}