diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bitops.c | 2 | ||||
-rw-r--r-- | src/geo.c | 4 | ||||
-rw-r--r-- | src/object.c | 3 | ||||
-rw-r--r-- | src/t_hash.c | 12 | ||||
-rw-r--r-- | src/t_list.c | 21 | ||||
-rw-r--r-- | src/t_set.c | 9 | ||||
-rw-r--r-- | src/t_stream.c | 10 | ||||
-rw-r--r-- | src/t_string.c | 13 | ||||
-rw-r--r-- | src/t_zset.c | 28 |
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); } @@ -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; - } } } } |