redis-server 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +38 -0
- data/README.md +33 -0
- data/bin/redis +114 -0
- data/redis/Makefile +5 -0
- data/redis/extconf.rb +3 -0
- data/redis/redis-2.2.11/00-RELEASENOTES +199 -0
- data/redis/redis-2.2.11/BUGS +1 -0
- data/redis/redis-2.2.11/CONTRIBUTING +13 -0
- data/redis/redis-2.2.11/COPYING +10 -0
- data/redis/redis-2.2.11/Changelog +1032 -0
- data/redis/redis-2.2.11/INSTALL +30 -0
- data/redis/redis-2.2.11/Makefile +22 -0
- data/redis/redis-2.2.11/README +83 -0
- data/redis/redis-2.2.11/TODO +4 -0
- data/redis/redis-2.2.11/client-libraries/README +11 -0
- data/redis/redis-2.2.11/deps/hiredis/COPYING +10 -0
- data/redis/redis-2.2.11/deps/hiredis/Makefile +115 -0
- data/redis/redis-2.2.11/deps/hiredis/README.md +311 -0
- data/redis/redis-2.2.11/deps/hiredis/TODO +2 -0
- data/redis/redis-2.2.11/deps/hiredis/adapters/ae.h +95 -0
- data/redis/redis-2.2.11/deps/hiredis/adapters/libev.h +113 -0
- data/redis/redis-2.2.11/deps/hiredis/adapters/libevent.h +76 -0
- data/redis/redis-2.2.11/deps/hiredis/async.c +321 -0
- data/redis/redis-2.2.11/deps/hiredis/async.h +112 -0
- data/redis/redis-2.2.11/deps/hiredis/example-ae.c +53 -0
- data/redis/redis-2.2.11/deps/hiredis/example-libev.c +47 -0
- data/redis/redis-2.2.11/deps/hiredis/example-libevent.c +48 -0
- data/redis/redis-2.2.11/deps/hiredis/example.c +67 -0
- data/redis/redis-2.2.11/deps/hiredis/fmacros.h +15 -0
- data/redis/redis-2.2.11/deps/hiredis/hiredis.c +1058 -0
- data/redis/redis-2.2.11/deps/hiredis/hiredis.h +170 -0
- data/redis/redis-2.2.11/deps/hiredis/net.c +170 -0
- data/redis/redis-2.2.11/deps/hiredis/net.h +43 -0
- data/redis/redis-2.2.11/deps/hiredis/sds.c +479 -0
- data/redis/redis-2.2.11/deps/hiredis/sds.h +77 -0
- data/redis/redis-2.2.11/deps/hiredis/test.c +479 -0
- data/redis/redis-2.2.11/deps/hiredis/util.h +40 -0
- data/redis/redis-2.2.11/deps/linenoise/Makefile +10 -0
- data/redis/redis-2.2.11/deps/linenoise/README.markdown +45 -0
- data/redis/redis-2.2.11/deps/linenoise/example.c +27 -0
- data/redis/redis-2.2.11/deps/linenoise/linenoise.c +609 -0
- data/redis/redis-2.2.11/deps/linenoise/linenoise.h +55 -0
- data/redis/redis-2.2.11/design-documents/REDIS-CLUSTER +214 -0
- data/redis/redis-2.2.11/design-documents/REDIS-CLUSTER-2 +343 -0
- data/redis/redis-2.2.11/doc/AppendCommand.html +48 -0
- data/redis/redis-2.2.11/doc/AppendOnlyFileHowto.html +41 -0
- data/redis/redis-2.2.11/doc/AuthCommand.html +39 -0
- data/redis/redis-2.2.11/doc/Benchmarks.html +129 -0
- data/redis/redis-2.2.11/doc/BgrewriteaofCommand.html +41 -0
- data/redis/redis-2.2.11/doc/BgsaveCommand.html +39 -0
- data/redis/redis-2.2.11/doc/BlpopCommand.html +51 -0
- data/redis/redis-2.2.11/doc/BrpoplpushCommand.html +39 -0
- data/redis/redis-2.2.11/doc/CommandReference.html +47 -0
- data/redis/redis-2.2.11/doc/Comparisons.html +42 -0
- data/redis/redis-2.2.11/doc/ConfigCommand.html +76 -0
- data/redis/redis-2.2.11/doc/Configuration.html +38 -0
- data/redis/redis-2.2.11/doc/ConnectionHandlingSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/ControlCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/Credits.html +38 -0
- data/redis/redis-2.2.11/doc/DbsizeCommand.html +38 -0
- data/redis/redis-2.2.11/doc/DelCommand.html +41 -0
- data/redis/redis-2.2.11/doc/DesignPatterns.html +37 -0
- data/redis/redis-2.2.11/doc/EventLibray.html +44 -0
- data/redis/redis-2.2.11/doc/ExistsCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ExpireCommand.html +96 -0
- data/redis/redis-2.2.11/doc/FAQ.html +70 -0
- data/redis/redis-2.2.11/doc/Features.html +38 -0
- data/redis/redis-2.2.11/doc/FlushallCommand.html +39 -0
- data/redis/redis-2.2.11/doc/FlushdbCommand.html +39 -0
- data/redis/redis-2.2.11/doc/FromSqlToDataStructures.html +37 -0
- data/redis/redis-2.2.11/doc/GenericCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/GetCommand.html +39 -0
- data/redis/redis-2.2.11/doc/GetbitCommand.html +39 -0
- data/redis/redis-2.2.11/doc/GetsetCommand.html +38 -0
- data/redis/redis-2.2.11/doc/HackingStrings.html +83 -0
- data/redis/redis-2.2.11/doc/HashCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/Hashes.html +37 -0
- data/redis/redis-2.2.11/doc/HdelCommand.html +39 -0
- data/redis/redis-2.2.11/doc/HexistsCommand.html +39 -0
- data/redis/redis-2.2.11/doc/HgetCommand.html +39 -0
- data/redis/redis-2.2.11/doc/HgetallCommand.html +40 -0
- data/redis/redis-2.2.11/doc/HincrbyCommand.html +45 -0
- data/redis/redis-2.2.11/doc/HlenCommand.html +38 -0
- data/redis/redis-2.2.11/doc/HmgetCommand.html +40 -0
- data/redis/redis-2.2.11/doc/HmsetCommand.html +40 -0
- data/redis/redis-2.2.11/doc/HsetCommand.html +40 -0
- data/redis/redis-2.2.11/doc/HsetnxCommand.html +41 -0
- data/redis/redis-2.2.11/doc/IncrCommand.html +43 -0
- data/redis/redis-2.2.11/doc/InfoCommand.html +48 -0
- data/redis/redis-2.2.11/doc/IntroductionToRedisDataTypes.html +152 -0
- data/redis/redis-2.2.11/doc/KeysCommand.html +43 -0
- data/redis/redis-2.2.11/doc/LastsaveCommand.html +39 -0
- data/redis/redis-2.2.11/doc/LindexCommand.html +40 -0
- data/redis/redis-2.2.11/doc/ListCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/Lists.html +42 -0
- data/redis/redis-2.2.11/doc/LlenCommand.html +41 -0
- data/redis/redis-2.2.11/doc/LpopCommand.html +41 -0
- data/redis/redis-2.2.11/doc/LrangeCommand.html +47 -0
- data/redis/redis-2.2.11/doc/LremCommand.html +41 -0
- data/redis/redis-2.2.11/doc/LsetCommand.html +38 -0
- data/redis/redis-2.2.11/doc/LtrimCommand.html +47 -0
- data/redis/redis-2.2.11/doc/MgetCommand.html +52 -0
- data/redis/redis-2.2.11/doc/MonitorCommand.html +63 -0
- data/redis/redis-2.2.11/doc/MoveCommand.html +42 -0
- data/redis/redis-2.2.11/doc/MsetCommand.html +44 -0
- data/redis/redis-2.2.11/doc/MultiExecCommand.html +166 -0
- data/redis/redis-2.2.11/doc/NonexistentCommands.html +51 -0
- data/redis/redis-2.2.11/doc/ObjectHashMappers.html +39 -0
- data/redis/redis-2.2.11/doc/Pipelining.html +36 -0
- data/redis/redis-2.2.11/doc/ProgrammingExamples.html +38 -0
- data/redis/redis-2.2.11/doc/ProtocolSpecification.html +137 -0
- data/redis/redis-2.2.11/doc/PublishSubscribe.html +115 -0
- data/redis/redis-2.2.11/doc/QuickStart.html +68 -0
- data/redis/redis-2.2.11/doc/QuitCommand.html +38 -0
- data/redis/redis-2.2.11/doc/README.html +119 -0
- data/redis/redis-2.2.11/doc/RandomkeyCommand.html +39 -0
- data/redis/redis-2.2.11/doc/Redis0100ChangeLog.html +67 -0
- data/redis/redis-2.2.11/doc/Redis0900ChangeLog.html +56 -0
- data/redis/redis-2.2.11/doc/RedisBigData.html +61 -0
- data/redis/redis-2.2.11/doc/RedisCLI.html +37 -0
- data/redis/redis-2.2.11/doc/RedisEventLibrary.html +70 -0
- data/redis/redis-2.2.11/doc/RedisGuides.html +37 -0
- data/redis/redis-2.2.11/doc/RedisInternals.html +38 -0
- data/redis/redis-2.2.11/doc/RedisPipelining.html +93 -0
- data/redis/redis-2.2.11/doc/RedisStatus.html +56 -0
- data/redis/redis-2.2.11/doc/Redis_1_2_0_Changelog.html +40 -0
- data/redis/redis-2.2.11/doc/Redis_2_0_0_Changelog.html +62 -0
- data/redis/redis-2.2.11/doc/Redis_2_0_Whats_new.html +59 -0
- data/redis/redis-2.2.11/doc/RenameCommand.html +39 -0
- data/redis/redis-2.2.11/doc/RenamenxCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ReplicationHowto.html +43 -0
- data/redis/redis-2.2.11/doc/ReplyTypes.html +42 -0
- data/redis/redis-2.2.11/doc/RoadMap.html +38 -0
- data/redis/redis-2.2.11/doc/RpoplpushCommand.html +44 -0
- data/redis/redis-2.2.11/doc/RpushCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SaddCommand.html +41 -0
- data/redis/redis-2.2.11/doc/SaveCommand.html +39 -0
- data/redis/redis-2.2.11/doc/ScardCommand.html +41 -0
- data/redis/redis-2.2.11/doc/SdiffCommand.html +45 -0
- data/redis/redis-2.2.11/doc/SdiffstoreCommand.html +38 -0
- data/redis/redis-2.2.11/doc/SelectCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SetCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SetCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/SetbitCommand.html +45 -0
- data/redis/redis-2.2.11/doc/SetexCommand.html +42 -0
- data/redis/redis-2.2.11/doc/SetnxCommand.html +51 -0
- data/redis/redis-2.2.11/doc/SetrangeCommand.html +58 -0
- data/redis/redis-2.2.11/doc/Sets.html +36 -0
- data/redis/redis-2.2.11/doc/ShutdownCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SideBar.html +36 -0
- data/redis/redis-2.2.11/doc/SinterCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SinterstoreCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SismemberCommand.html +42 -0
- data/redis/redis-2.2.11/doc/SlaveofCommand.html +41 -0
- data/redis/redis-2.2.11/doc/SmembersCommand.html +38 -0
- data/redis/redis-2.2.11/doc/SmoveCommand.html +44 -0
- data/redis/redis-2.2.11/doc/SortCommand.html +75 -0
- data/redis/redis-2.2.11/doc/SortedSetCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/SortedSets.html +36 -0
- data/redis/redis-2.2.11/doc/Speed.html +38 -0
- data/redis/redis-2.2.11/doc/SponsorshipHistory.html +38 -0
- data/redis/redis-2.2.11/doc/SpopCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SrandmemberCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SremCommand.html +42 -0
- data/redis/redis-2.2.11/doc/StringCommandsSidebar.html +36 -0
- data/redis/redis-2.2.11/doc/Strings.html +37 -0
- data/redis/redis-2.2.11/doc/StrlenCommand.html +39 -0
- data/redis/redis-2.2.11/doc/SubstrCommand.html +52 -0
- data/redis/redis-2.2.11/doc/SunionCommand.html +40 -0
- data/redis/redis-2.2.11/doc/SunionstoreCommand.html +38 -0
- data/redis/redis-2.2.11/doc/SupportedLanguages.html +60 -0
- data/redis/redis-2.2.11/doc/SupportedPlatforms.html +37 -0
- data/redis/redis-2.2.11/doc/TemplateCommand.html +38 -0
- data/redis/redis-2.2.11/doc/TtlCommand.html +38 -0
- data/redis/redis-2.2.11/doc/TwitterAlikeExample.html +250 -0
- data/redis/redis-2.2.11/doc/TypeCommand.html +46 -0
- data/redis/redis-2.2.11/doc/UnstableSource.html +39 -0
- data/redis/redis-2.2.11/doc/VirtualMemorySpecification.html +156 -0
- data/redis/redis-2.2.11/doc/VirtualMemoryUserGuide.html +66 -0
- data/redis/redis-2.2.11/doc/ZaddCommand.html +43 -0
- data/redis/redis-2.2.11/doc/ZcardCommand.html +41 -0
- data/redis/redis-2.2.11/doc/ZincrbyCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ZrangeCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ZrangebyscoreCommand.html +77 -0
- data/redis/redis-2.2.11/doc/ZrankCommand.html +43 -0
- data/redis/redis-2.2.11/doc/ZremCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ZremrangebyrankCommand.html +39 -0
- data/redis/redis-2.2.11/doc/ZremrangebyscoreCommand.html +39 -0
- data/redis/redis-2.2.11/doc/ZscoreCommand.html +41 -0
- data/redis/redis-2.2.11/doc/ZunionCommand.html +42 -0
- data/redis/redis-2.2.11/doc/ZunionstoreCommand.html +43 -0
- data/redis/redis-2.2.11/doc/index.html +43 -0
- data/redis/redis-2.2.11/doc/redis.png +0 -0
- data/redis/redis-2.2.11/doc/style.css +25 -0
- data/redis/redis-2.2.11/redis.conf +417 -0
- data/redis/redis-2.2.11/src/Makefile +177 -0
- data/redis/redis-2.2.11/src/adlist.c +325 -0
- data/redis/redis-2.2.11/src/adlist.h +92 -0
- data/redis/redis-2.2.11/src/ae.c +390 -0
- data/redis/redis-2.2.11/src/ae.h +117 -0
- data/redis/redis-2.2.11/src/ae_epoll.c +91 -0
- data/redis/redis-2.2.11/src/ae_kqueue.c +93 -0
- data/redis/redis-2.2.11/src/ae_select.c +72 -0
- data/redis/redis-2.2.11/src/anet.c +347 -0
- data/redis/redis-2.2.11/src/anet.h +57 -0
- data/redis/redis-2.2.11/src/aof.c +675 -0
- data/redis/redis-2.2.11/src/config.c +627 -0
- data/redis/redis-2.2.11/src/config.h +64 -0
- data/redis/redis-2.2.11/src/db.c +543 -0
- data/redis/redis-2.2.11/src/debug.c +314 -0
- data/redis/redis-2.2.11/src/dict.c +721 -0
- data/redis/redis-2.2.11/src/dict.h +156 -0
- data/redis/redis-2.2.11/src/fmacros.h +15 -0
- data/redis/redis-2.2.11/src/help.h +638 -0
- data/redis/redis-2.2.11/src/intset.c +422 -0
- data/redis/redis-2.2.11/src/intset.h +19 -0
- data/redis/redis-2.2.11/src/lzf.h +100 -0
- data/redis/redis-2.2.11/src/lzfP.h +159 -0
- data/redis/redis-2.2.11/src/lzf_c.c +295 -0
- data/redis/redis-2.2.11/src/lzf_d.c +150 -0
- data/redis/redis-2.2.11/src/mkreleasehdr.sh +9 -0
- data/redis/redis-2.2.11/src/multi.c +268 -0
- data/redis/redis-2.2.11/src/networking.c +899 -0
- data/redis/redis-2.2.11/src/object.c +484 -0
- data/redis/redis-2.2.11/src/pqsort.c +197 -0
- data/redis/redis-2.2.11/src/pqsort.h +15 -0
- data/redis/redis-2.2.11/src/pubsub.c +267 -0
- data/redis/redis-2.2.11/src/rdb.c +1020 -0
- data/redis/redis-2.2.11/src/redis-benchmark.c +530 -0
- data/redis/redis-2.2.11/src/redis-check-aof.c +185 -0
- data/redis/redis-2.2.11/src/redis-check-dump.c +681 -0
- data/redis/redis-2.2.11/src/redis-cli.c +773 -0
- data/redis/redis-2.2.11/src/redis.c +1677 -0
- data/redis/redis-2.2.11/src/redis.h +1022 -0
- data/redis/redis-2.2.11/src/release.c +13 -0
- data/redis/redis-2.2.11/src/replication.c +557 -0
- data/redis/redis-2.2.11/src/sds.c +639 -0
- data/redis/redis-2.2.11/src/sds.h +78 -0
- data/redis/redis-2.2.11/src/sha1.c +276 -0
- data/redis/redis-2.2.11/src/sha1.h +17 -0
- data/redis/redis-2.2.11/src/solarisfixes.h +22 -0
- data/redis/redis-2.2.11/src/sort.c +389 -0
- data/redis/redis-2.2.11/src/syncio.c +154 -0
- data/redis/redis-2.2.11/src/t_hash.c +476 -0
- data/redis/redis-2.2.11/src/t_list.c +986 -0
- data/redis/redis-2.2.11/src/t_set.c +610 -0
- data/redis/redis-2.2.11/src/t_string.c +438 -0
- data/redis/redis-2.2.11/src/t_zset.c +1084 -0
- data/redis/redis-2.2.11/src/testhelp.h +54 -0
- data/redis/redis-2.2.11/src/util.c +243 -0
- data/redis/redis-2.2.11/src/valgrind.sup +5 -0
- data/redis/redis-2.2.11/src/version.h +1 -0
- data/redis/redis-2.2.11/src/vm.c +1149 -0
- data/redis/redis-2.2.11/src/ziplist.c +1323 -0
- data/redis/redis-2.2.11/src/ziplist.h +15 -0
- data/redis/redis-2.2.11/src/zipmap.c +455 -0
- data/redis/redis-2.2.11/src/zipmap.h +48 -0
- data/redis/redis-2.2.11/src/zmalloc.c +278 -0
- data/redis/redis-2.2.11/src/zmalloc.h +47 -0
- data/redis/redis-2.2.11/tests/assets/default.conf +308 -0
- data/redis/redis-2.2.11/tests/integration/aof.tcl +104 -0
- data/redis/redis-2.2.11/tests/integration/redis-cli.tcl +208 -0
- data/redis/redis-2.2.11/tests/integration/replication.tcl +98 -0
- data/redis/redis-2.2.11/tests/support/redis.tcl +241 -0
- data/redis/redis-2.2.11/tests/support/server.tcl +294 -0
- data/redis/redis-2.2.11/tests/support/test.tcl +190 -0
- data/redis/redis-2.2.11/tests/support/tmpfile.tcl +15 -0
- data/redis/redis-2.2.11/tests/support/util.tcl +296 -0
- data/redis/redis-2.2.11/tests/test_helper.tcl +221 -0
- data/redis/redis-2.2.11/tests/unit/auth.tcl +15 -0
- data/redis/redis-2.2.11/tests/unit/basic.tcl +616 -0
- data/redis/redis-2.2.11/tests/unit/cas.tcl +135 -0
- data/redis/redis-2.2.11/tests/unit/expire.tcl +74 -0
- data/redis/redis-2.2.11/tests/unit/other.tcl +240 -0
- data/redis/redis-2.2.11/tests/unit/printver.tcl +6 -0
- data/redis/redis-2.2.11/tests/unit/protocol.tcl +62 -0
- data/redis/redis-2.2.11/tests/unit/pubsub.tcl +195 -0
- data/redis/redis-2.2.11/tests/unit/quit.tcl +40 -0
- data/redis/redis-2.2.11/tests/unit/sort.tcl +189 -0
- data/redis/redis-2.2.11/tests/unit/type/hash.tcl +300 -0
- data/redis/redis-2.2.11/tests/unit/type/list.tcl +819 -0
- data/redis/redis-2.2.11/tests/unit/type/set.tcl +334 -0
- data/redis/redis-2.2.11/tests/unit/type/zset.tcl +587 -0
- data/redis/redis-2.2.11/utils/build-static-symbols.tcl +22 -0
- data/redis/redis-2.2.11/utils/generate-command-help.rb +112 -0
- data/redis/redis-2.2.11/utils/mktarball.sh +13 -0
- data/redis/redis-2.2.11/utils/redis-copy.rb +78 -0
- data/redis/redis-2.2.11/utils/redis-sha1.rb +52 -0
- data/redis/redis-2.2.11/utils/redis_init_script +42 -0
- metadata +362 -0
@@ -0,0 +1,300 @@
|
|
1
|
+
start_server {tags {"hash"}} {
|
2
|
+
test {HSET/HLEN - Small hash creation} {
|
3
|
+
array set smallhash {}
|
4
|
+
for {set i 0} {$i < 8} {incr i} {
|
5
|
+
set key [randstring 0 8 alpha]
|
6
|
+
set val [randstring 0 8 alpha]
|
7
|
+
if {[info exists smallhash($key)]} {
|
8
|
+
incr i -1
|
9
|
+
continue
|
10
|
+
}
|
11
|
+
r hset smallhash $key $val
|
12
|
+
set smallhash($key) $val
|
13
|
+
}
|
14
|
+
list [r hlen smallhash]
|
15
|
+
} {8}
|
16
|
+
|
17
|
+
test {Is the small hash encoded with a zipmap?} {
|
18
|
+
assert_encoding zipmap smallhash
|
19
|
+
}
|
20
|
+
|
21
|
+
test {HSET/HLEN - Big hash creation} {
|
22
|
+
array set bighash {}
|
23
|
+
for {set i 0} {$i < 1024} {incr i} {
|
24
|
+
set key [randstring 0 8 alpha]
|
25
|
+
set val [randstring 0 8 alpha]
|
26
|
+
if {[info exists bighash($key)]} {
|
27
|
+
incr i -1
|
28
|
+
continue
|
29
|
+
}
|
30
|
+
r hset bighash $key $val
|
31
|
+
set bighash($key) $val
|
32
|
+
}
|
33
|
+
list [r hlen bighash]
|
34
|
+
} {1024}
|
35
|
+
|
36
|
+
test {Is the big hash encoded with a zipmap?} {
|
37
|
+
assert_encoding hashtable bighash
|
38
|
+
}
|
39
|
+
|
40
|
+
test {HGET against the small hash} {
|
41
|
+
set err {}
|
42
|
+
foreach k [array names smallhash *] {
|
43
|
+
if {$smallhash($k) ne [r hget smallhash $k]} {
|
44
|
+
set err "$smallhash($k) != [r hget smallhash $k]"
|
45
|
+
break
|
46
|
+
}
|
47
|
+
}
|
48
|
+
set _ $err
|
49
|
+
} {}
|
50
|
+
|
51
|
+
test {HGET against the big hash} {
|
52
|
+
set err {}
|
53
|
+
foreach k [array names bighash *] {
|
54
|
+
if {$bighash($k) ne [r hget bighash $k]} {
|
55
|
+
set err "$bighash($k) != [r hget bighash $k]"
|
56
|
+
break
|
57
|
+
}
|
58
|
+
}
|
59
|
+
set _ $err
|
60
|
+
} {}
|
61
|
+
|
62
|
+
test {HGET against non existing key} {
|
63
|
+
set rv {}
|
64
|
+
lappend rv [r hget smallhash __123123123__]
|
65
|
+
lappend rv [r hget bighash __123123123__]
|
66
|
+
set _ $rv
|
67
|
+
} {{} {}}
|
68
|
+
|
69
|
+
test {HSET in update and insert mode} {
|
70
|
+
set rv {}
|
71
|
+
set k [lindex [array names smallhash *] 0]
|
72
|
+
lappend rv [r hset smallhash $k newval1]
|
73
|
+
set smallhash($k) newval1
|
74
|
+
lappend rv [r hget smallhash $k]
|
75
|
+
lappend rv [r hset smallhash __foobar123__ newval]
|
76
|
+
set k [lindex [array names bighash *] 0]
|
77
|
+
lappend rv [r hset bighash $k newval2]
|
78
|
+
set bighash($k) newval2
|
79
|
+
lappend rv [r hget bighash $k]
|
80
|
+
lappend rv [r hset bighash __foobar123__ newval]
|
81
|
+
lappend rv [r hdel smallhash __foobar123__]
|
82
|
+
lappend rv [r hdel bighash __foobar123__]
|
83
|
+
set _ $rv
|
84
|
+
} {0 newval1 1 0 newval2 1 1 1}
|
85
|
+
|
86
|
+
test {HSETNX target key missing - small hash} {
|
87
|
+
r hsetnx smallhash __123123123__ foo
|
88
|
+
r hget smallhash __123123123__
|
89
|
+
} {foo}
|
90
|
+
|
91
|
+
test {HSETNX target key exists - small hash} {
|
92
|
+
r hsetnx smallhash __123123123__ bar
|
93
|
+
set result [r hget smallhash __123123123__]
|
94
|
+
r hdel smallhash __123123123__
|
95
|
+
set _ $result
|
96
|
+
} {foo}
|
97
|
+
|
98
|
+
test {HSETNX target key missing - big hash} {
|
99
|
+
r hsetnx bighash __123123123__ foo
|
100
|
+
r hget bighash __123123123__
|
101
|
+
} {foo}
|
102
|
+
|
103
|
+
test {HSETNX target key exists - big hash} {
|
104
|
+
r hsetnx bighash __123123123__ bar
|
105
|
+
set result [r hget bighash __123123123__]
|
106
|
+
r hdel bighash __123123123__
|
107
|
+
set _ $result
|
108
|
+
} {foo}
|
109
|
+
|
110
|
+
test {HMSET wrong number of args} {
|
111
|
+
catch {r hmset smallhash key1 val1 key2} err
|
112
|
+
format $err
|
113
|
+
} {*wrong number*}
|
114
|
+
|
115
|
+
test {HMSET - small hash} {
|
116
|
+
set args {}
|
117
|
+
foreach {k v} [array get smallhash] {
|
118
|
+
set newval [randstring 0 8 alpha]
|
119
|
+
set smallhash($k) $newval
|
120
|
+
lappend args $k $newval
|
121
|
+
}
|
122
|
+
r hmset smallhash {*}$args
|
123
|
+
} {OK}
|
124
|
+
|
125
|
+
test {HMSET - big hash} {
|
126
|
+
set args {}
|
127
|
+
foreach {k v} [array get bighash] {
|
128
|
+
set newval [randstring 0 8 alpha]
|
129
|
+
set bighash($k) $newval
|
130
|
+
lappend args $k $newval
|
131
|
+
}
|
132
|
+
r hmset bighash {*}$args
|
133
|
+
} {OK}
|
134
|
+
|
135
|
+
test {HMGET against non existing key and fields} {
|
136
|
+
set rv {}
|
137
|
+
lappend rv [r hmget doesntexist __123123123__ __456456456__]
|
138
|
+
lappend rv [r hmget smallhash __123123123__ __456456456__]
|
139
|
+
lappend rv [r hmget bighash __123123123__ __456456456__]
|
140
|
+
set _ $rv
|
141
|
+
} {{{} {}} {{} {}} {{} {}}}
|
142
|
+
|
143
|
+
test {HMGET against wrong type} {
|
144
|
+
r set wrongtype somevalue
|
145
|
+
assert_error "*wrong*" {r hmget wrongtype field1 field2}
|
146
|
+
}
|
147
|
+
|
148
|
+
test {HMGET - small hash} {
|
149
|
+
set keys {}
|
150
|
+
set vals {}
|
151
|
+
foreach {k v} [array get smallhash] {
|
152
|
+
lappend keys $k
|
153
|
+
lappend vals $v
|
154
|
+
}
|
155
|
+
set err {}
|
156
|
+
set result [r hmget smallhash {*}$keys]
|
157
|
+
if {$vals ne $result} {
|
158
|
+
set err "$vals != $result"
|
159
|
+
break
|
160
|
+
}
|
161
|
+
set _ $err
|
162
|
+
} {}
|
163
|
+
|
164
|
+
test {HMGET - big hash} {
|
165
|
+
set keys {}
|
166
|
+
set vals {}
|
167
|
+
foreach {k v} [array get bighash] {
|
168
|
+
lappend keys $k
|
169
|
+
lappend vals $v
|
170
|
+
}
|
171
|
+
set err {}
|
172
|
+
set result [r hmget bighash {*}$keys]
|
173
|
+
if {$vals ne $result} {
|
174
|
+
set err "$vals != $result"
|
175
|
+
break
|
176
|
+
}
|
177
|
+
set _ $err
|
178
|
+
} {}
|
179
|
+
|
180
|
+
test {HKEYS - small hash} {
|
181
|
+
lsort [r hkeys smallhash]
|
182
|
+
} [lsort [array names smallhash *]]
|
183
|
+
|
184
|
+
test {HKEYS - big hash} {
|
185
|
+
lsort [r hkeys bighash]
|
186
|
+
} [lsort [array names bighash *]]
|
187
|
+
|
188
|
+
test {HVALS - small hash} {
|
189
|
+
set vals {}
|
190
|
+
foreach {k v} [array get smallhash] {
|
191
|
+
lappend vals $v
|
192
|
+
}
|
193
|
+
set _ [lsort $vals]
|
194
|
+
} [lsort [r hvals smallhash]]
|
195
|
+
|
196
|
+
test {HVALS - big hash} {
|
197
|
+
set vals {}
|
198
|
+
foreach {k v} [array get bighash] {
|
199
|
+
lappend vals $v
|
200
|
+
}
|
201
|
+
set _ [lsort $vals]
|
202
|
+
} [lsort [r hvals bighash]]
|
203
|
+
|
204
|
+
test {HGETALL - small hash} {
|
205
|
+
lsort [r hgetall smallhash]
|
206
|
+
} [lsort [array get smallhash]]
|
207
|
+
|
208
|
+
test {HGETALL - big hash} {
|
209
|
+
lsort [r hgetall bighash]
|
210
|
+
} [lsort [array get bighash]]
|
211
|
+
|
212
|
+
test {HDEL and return value} {
|
213
|
+
set rv {}
|
214
|
+
lappend rv [r hdel smallhash nokey]
|
215
|
+
lappend rv [r hdel bighash nokey]
|
216
|
+
set k [lindex [array names smallhash *] 0]
|
217
|
+
lappend rv [r hdel smallhash $k]
|
218
|
+
lappend rv [r hdel smallhash $k]
|
219
|
+
lappend rv [r hget smallhash $k]
|
220
|
+
unset smallhash($k)
|
221
|
+
set k [lindex [array names bighash *] 0]
|
222
|
+
lappend rv [r hdel bighash $k]
|
223
|
+
lappend rv [r hdel bighash $k]
|
224
|
+
lappend rv [r hget bighash $k]
|
225
|
+
unset bighash($k)
|
226
|
+
set _ $rv
|
227
|
+
} {0 0 1 0 {} 1 0 {}}
|
228
|
+
|
229
|
+
test {HEXISTS} {
|
230
|
+
set rv {}
|
231
|
+
set k [lindex [array names smallhash *] 0]
|
232
|
+
lappend rv [r hexists smallhash $k]
|
233
|
+
lappend rv [r hexists smallhash nokey]
|
234
|
+
set k [lindex [array names bighash *] 0]
|
235
|
+
lappend rv [r hexists bighash $k]
|
236
|
+
lappend rv [r hexists bighash nokey]
|
237
|
+
} {1 0 1 0}
|
238
|
+
|
239
|
+
test {Is a zipmap encoded Hash promoted on big payload?} {
|
240
|
+
r hset smallhash foo [string repeat a 1024]
|
241
|
+
r debug object smallhash
|
242
|
+
} {*hashtable*}
|
243
|
+
|
244
|
+
test {HINCRBY against non existing database key} {
|
245
|
+
r del htest
|
246
|
+
list [r hincrby htest foo 2]
|
247
|
+
} {2}
|
248
|
+
|
249
|
+
test {HINCRBY against non existing hash key} {
|
250
|
+
set rv {}
|
251
|
+
r hdel smallhash tmp
|
252
|
+
r hdel bighash tmp
|
253
|
+
lappend rv [r hincrby smallhash tmp 2]
|
254
|
+
lappend rv [r hget smallhash tmp]
|
255
|
+
lappend rv [r hincrby bighash tmp 2]
|
256
|
+
lappend rv [r hget bighash tmp]
|
257
|
+
} {2 2 2 2}
|
258
|
+
|
259
|
+
test {HINCRBY against hash key created by hincrby itself} {
|
260
|
+
set rv {}
|
261
|
+
lappend rv [r hincrby smallhash tmp 3]
|
262
|
+
lappend rv [r hget smallhash tmp]
|
263
|
+
lappend rv [r hincrby bighash tmp 3]
|
264
|
+
lappend rv [r hget bighash tmp]
|
265
|
+
} {5 5 5 5}
|
266
|
+
|
267
|
+
test {HINCRBY against hash key originally set with HSET} {
|
268
|
+
r hset smallhash tmp 100
|
269
|
+
r hset bighash tmp 100
|
270
|
+
list [r hincrby smallhash tmp 2] [r hincrby bighash tmp 2]
|
271
|
+
} {102 102}
|
272
|
+
|
273
|
+
test {HINCRBY over 32bit value} {
|
274
|
+
r hset smallhash tmp 17179869184
|
275
|
+
r hset bighash tmp 17179869184
|
276
|
+
list [r hincrby smallhash tmp 1] [r hincrby bighash tmp 1]
|
277
|
+
} {17179869185 17179869185}
|
278
|
+
|
279
|
+
test {HINCRBY over 32bit value with over 32bit increment} {
|
280
|
+
r hset smallhash tmp 17179869184
|
281
|
+
r hset bighash tmp 17179869184
|
282
|
+
list [r hincrby smallhash tmp 17179869184] [r hincrby bighash tmp 17179869184]
|
283
|
+
} {34359738368 34359738368}
|
284
|
+
|
285
|
+
test {HINCRBY fails against hash value with spaces} {
|
286
|
+
r hset smallhash str " 11 "
|
287
|
+
r hset bighash str " 11 "
|
288
|
+
catch {r hincrby smallhash str 1} smallerr
|
289
|
+
catch {r hincrby smallhash str 1} bigerr
|
290
|
+
set rv {}
|
291
|
+
lappend rv [string match "ERR*not an integer*" $smallerr]
|
292
|
+
lappend rv [string match "ERR*not an integer*" $bigerr]
|
293
|
+
} {1 1}
|
294
|
+
|
295
|
+
test {Hash zipmap regression test for large keys} {
|
296
|
+
r hset hash kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk a
|
297
|
+
r hset hash kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk b
|
298
|
+
r hget hash kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
|
299
|
+
} {b}
|
300
|
+
}
|
@@ -0,0 +1,819 @@
|
|
1
|
+
start_server {
|
2
|
+
tags {"list"}
|
3
|
+
overrides {
|
4
|
+
"list-max-ziplist-value" 16
|
5
|
+
"list-max-ziplist-entries" 256
|
6
|
+
}
|
7
|
+
} {
|
8
|
+
# We need a value larger than list-max-ziplist-value to make sure
|
9
|
+
# the list has the right encoding when it is swapped in again.
|
10
|
+
array set largevalue {}
|
11
|
+
set largevalue(ziplist) "hello"
|
12
|
+
set largevalue(linkedlist) [string repeat "hello" 4]
|
13
|
+
|
14
|
+
test {LPUSH, RPUSH, LLENGTH, LINDEX - ziplist} {
|
15
|
+
# first lpush then rpush
|
16
|
+
assert_equal 1 [r lpush myziplist1 a]
|
17
|
+
assert_equal 2 [r rpush myziplist1 b]
|
18
|
+
assert_equal 3 [r rpush myziplist1 c]
|
19
|
+
assert_equal 3 [r llen myziplist1]
|
20
|
+
assert_equal a [r lindex myziplist1 0]
|
21
|
+
assert_equal b [r lindex myziplist1 1]
|
22
|
+
assert_equal c [r lindex myziplist1 2]
|
23
|
+
assert_encoding ziplist myziplist1
|
24
|
+
|
25
|
+
# first rpush then lpush
|
26
|
+
assert_equal 1 [r rpush myziplist2 a]
|
27
|
+
assert_equal 2 [r lpush myziplist2 b]
|
28
|
+
assert_equal 3 [r lpush myziplist2 c]
|
29
|
+
assert_equal 3 [r llen myziplist2]
|
30
|
+
assert_equal c [r lindex myziplist2 0]
|
31
|
+
assert_equal b [r lindex myziplist2 1]
|
32
|
+
assert_equal a [r lindex myziplist2 2]
|
33
|
+
assert_encoding ziplist myziplist2
|
34
|
+
}
|
35
|
+
|
36
|
+
test {LPUSH, RPUSH, LLENGTH, LINDEX - regular list} {
|
37
|
+
# first lpush then rpush
|
38
|
+
assert_equal 1 [r lpush mylist1 $largevalue(linkedlist)]
|
39
|
+
assert_encoding linkedlist mylist1
|
40
|
+
assert_equal 2 [r rpush mylist1 b]
|
41
|
+
assert_equal 3 [r rpush mylist1 c]
|
42
|
+
assert_equal 3 [r llen mylist1]
|
43
|
+
assert_equal $largevalue(linkedlist) [r lindex mylist1 0]
|
44
|
+
assert_equal b [r lindex mylist1 1]
|
45
|
+
assert_equal c [r lindex mylist1 2]
|
46
|
+
|
47
|
+
# first rpush then lpush
|
48
|
+
assert_equal 1 [r rpush mylist2 $largevalue(linkedlist)]
|
49
|
+
assert_encoding linkedlist mylist2
|
50
|
+
assert_equal 2 [r lpush mylist2 b]
|
51
|
+
assert_equal 3 [r lpush mylist2 c]
|
52
|
+
assert_equal 3 [r llen mylist2]
|
53
|
+
assert_equal c [r lindex mylist2 0]
|
54
|
+
assert_equal b [r lindex mylist2 1]
|
55
|
+
assert_equal $largevalue(linkedlist) [r lindex mylist2 2]
|
56
|
+
}
|
57
|
+
|
58
|
+
test {DEL a list - ziplist} {
|
59
|
+
assert_equal 1 [r del myziplist2]
|
60
|
+
assert_equal 0 [r exists myziplist2]
|
61
|
+
assert_equal 0 [r llen myziplist2]
|
62
|
+
}
|
63
|
+
|
64
|
+
test {DEL a list - regular list} {
|
65
|
+
assert_equal 1 [r del mylist2]
|
66
|
+
assert_equal 0 [r exists mylist2]
|
67
|
+
assert_equal 0 [r llen mylist2]
|
68
|
+
}
|
69
|
+
|
70
|
+
proc create_ziplist {key entries} {
|
71
|
+
r del $key
|
72
|
+
foreach entry $entries { r rpush $key $entry }
|
73
|
+
assert_encoding ziplist $key
|
74
|
+
}
|
75
|
+
|
76
|
+
proc create_linkedlist {key entries} {
|
77
|
+
r del $key
|
78
|
+
foreach entry $entries { r rpush $key $entry }
|
79
|
+
assert_encoding linkedlist $key
|
80
|
+
}
|
81
|
+
|
82
|
+
foreach {type large} [array get largevalue] {
|
83
|
+
test "BLPOP, BRPOP: single existing list - $type" {
|
84
|
+
set rd [redis_deferring_client]
|
85
|
+
create_$type blist "a b $large c d"
|
86
|
+
|
87
|
+
$rd blpop blist 1
|
88
|
+
assert_equal {blist a} [$rd read]
|
89
|
+
$rd brpop blist 1
|
90
|
+
assert_equal {blist d} [$rd read]
|
91
|
+
|
92
|
+
$rd blpop blist 1
|
93
|
+
assert_equal {blist b} [$rd read]
|
94
|
+
$rd brpop blist 1
|
95
|
+
assert_equal {blist c} [$rd read]
|
96
|
+
}
|
97
|
+
|
98
|
+
test "BLPOP, BRPOP: multiple existing lists - $type" {
|
99
|
+
set rd [redis_deferring_client]
|
100
|
+
create_$type blist1 "a $large c"
|
101
|
+
create_$type blist2 "d $large f"
|
102
|
+
|
103
|
+
$rd blpop blist1 blist2 1
|
104
|
+
assert_equal {blist1 a} [$rd read]
|
105
|
+
$rd brpop blist1 blist2 1
|
106
|
+
assert_equal {blist1 c} [$rd read]
|
107
|
+
assert_equal 1 [r llen blist1]
|
108
|
+
assert_equal 3 [r llen blist2]
|
109
|
+
|
110
|
+
$rd blpop blist2 blist1 1
|
111
|
+
assert_equal {blist2 d} [$rd read]
|
112
|
+
$rd brpop blist2 blist1 1
|
113
|
+
assert_equal {blist2 f} [$rd read]
|
114
|
+
assert_equal 1 [r llen blist1]
|
115
|
+
assert_equal 1 [r llen blist2]
|
116
|
+
}
|
117
|
+
|
118
|
+
test "BLPOP, BRPOP: second list has an entry - $type" {
|
119
|
+
set rd [redis_deferring_client]
|
120
|
+
r del blist1
|
121
|
+
create_$type blist2 "d $large f"
|
122
|
+
|
123
|
+
$rd blpop blist1 blist2 1
|
124
|
+
assert_equal {blist2 d} [$rd read]
|
125
|
+
$rd brpop blist1 blist2 1
|
126
|
+
assert_equal {blist2 f} [$rd read]
|
127
|
+
assert_equal 0 [r llen blist1]
|
128
|
+
assert_equal 1 [r llen blist2]
|
129
|
+
}
|
130
|
+
|
131
|
+
test "BRPOPLPUSH - $type" {
|
132
|
+
r del target
|
133
|
+
|
134
|
+
set rd [redis_deferring_client]
|
135
|
+
create_$type blist "a b $large c d"
|
136
|
+
|
137
|
+
$rd brpoplpush blist target 1
|
138
|
+
assert_equal d [$rd read]
|
139
|
+
|
140
|
+
assert_equal d [r rpop target]
|
141
|
+
assert_equal "a b $large c" [r lrange blist 0 -1]
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
test "BRPOPLPUSH with zero timeout should block indefinitely" {
|
146
|
+
set rd [redis_deferring_client]
|
147
|
+
r del blist target
|
148
|
+
$rd brpoplpush blist target 0
|
149
|
+
after 1000
|
150
|
+
r rpush blist foo
|
151
|
+
assert_equal foo [$rd read]
|
152
|
+
assert_equal {foo} [r lrange target 0 -1]
|
153
|
+
}
|
154
|
+
|
155
|
+
test "BRPOPLPUSH with a client BLPOPing the target list" {
|
156
|
+
set rd [redis_deferring_client]
|
157
|
+
set rd2 [redis_deferring_client]
|
158
|
+
r del blist target
|
159
|
+
$rd2 blpop target 0
|
160
|
+
$rd brpoplpush blist target 0
|
161
|
+
after 1000
|
162
|
+
r rpush blist foo
|
163
|
+
assert_equal foo [$rd read]
|
164
|
+
assert_equal {target foo} [$rd2 read]
|
165
|
+
assert_equal 0 [r exists target]
|
166
|
+
}
|
167
|
+
|
168
|
+
test "BRPOPLPUSH with wrong source type" {
|
169
|
+
set rd [redis_deferring_client]
|
170
|
+
r del blist target
|
171
|
+
r set blist nolist
|
172
|
+
$rd brpoplpush blist target 1
|
173
|
+
assert_error "ERR*wrong kind*" {$rd read}
|
174
|
+
}
|
175
|
+
|
176
|
+
test "BRPOPLPUSH with wrong destination type" {
|
177
|
+
set rd [redis_deferring_client]
|
178
|
+
r del blist target
|
179
|
+
r set target nolist
|
180
|
+
r lpush blist foo
|
181
|
+
$rd brpoplpush blist target 1
|
182
|
+
assert_error "ERR*wrong kind*" {$rd read}
|
183
|
+
|
184
|
+
set rd [redis_deferring_client]
|
185
|
+
r del blist target
|
186
|
+
r set target nolist
|
187
|
+
$rd brpoplpush blist target 0
|
188
|
+
after 1000
|
189
|
+
r rpush blist foo
|
190
|
+
assert_error "ERR*wrong kind*" {$rd read}
|
191
|
+
assert_equal {foo} [r lrange blist 0 -1]
|
192
|
+
}
|
193
|
+
|
194
|
+
test "BRPOPLPUSH with multiple blocked clients" {
|
195
|
+
set rd1 [redis_deferring_client]
|
196
|
+
set rd2 [redis_deferring_client]
|
197
|
+
r del blist target1 target2
|
198
|
+
r set target1 nolist
|
199
|
+
$rd1 brpoplpush blist target1 0
|
200
|
+
$rd2 brpoplpush blist target2 0
|
201
|
+
r lpush blist foo
|
202
|
+
|
203
|
+
assert_error "ERR*wrong kind*" {$rd1 read}
|
204
|
+
assert_equal {foo} [$rd2 read]
|
205
|
+
assert_equal {foo} [r lrange target2 0 -1]
|
206
|
+
}
|
207
|
+
|
208
|
+
test "Linked BRPOPLPUSH" {
|
209
|
+
set rd1 [redis_deferring_client]
|
210
|
+
set rd2 [redis_deferring_client]
|
211
|
+
|
212
|
+
r del list1 list2 list3
|
213
|
+
|
214
|
+
$rd1 brpoplpush list1 list2 0
|
215
|
+
$rd2 brpoplpush list2 list3 0
|
216
|
+
|
217
|
+
r rpush list1 foo
|
218
|
+
|
219
|
+
assert_equal {} [r lrange list1 0 -1]
|
220
|
+
assert_equal {} [r lrange list2 0 -1]
|
221
|
+
assert_equal {foo} [r lrange list3 0 -1]
|
222
|
+
}
|
223
|
+
|
224
|
+
test "Circular BRPOPLPUSH" {
|
225
|
+
set rd1 [redis_deferring_client]
|
226
|
+
set rd2 [redis_deferring_client]
|
227
|
+
|
228
|
+
r del list1 list2
|
229
|
+
|
230
|
+
$rd1 brpoplpush list1 list2 0
|
231
|
+
$rd2 brpoplpush list2 list1 0
|
232
|
+
|
233
|
+
r rpush list1 foo
|
234
|
+
|
235
|
+
assert_equal {foo} [r lrange list1 0 -1]
|
236
|
+
assert_equal {} [r lrange list2 0 -1]
|
237
|
+
}
|
238
|
+
|
239
|
+
test "Self-referential BRPOPLPUSH" {
|
240
|
+
set rd [redis_deferring_client]
|
241
|
+
|
242
|
+
r del blist
|
243
|
+
|
244
|
+
$rd brpoplpush blist blist 0
|
245
|
+
|
246
|
+
r rpush blist foo
|
247
|
+
|
248
|
+
assert_equal {foo} [r lrange blist 0 -1]
|
249
|
+
}
|
250
|
+
|
251
|
+
test "BRPOPLPUSH inside a transaction" {
|
252
|
+
r del xlist target
|
253
|
+
r lpush xlist foo
|
254
|
+
r lpush xlist bar
|
255
|
+
|
256
|
+
r multi
|
257
|
+
r brpoplpush xlist target 0
|
258
|
+
r brpoplpush xlist target 0
|
259
|
+
r brpoplpush xlist target 0
|
260
|
+
r lrange xlist 0 -1
|
261
|
+
r lrange target 0 -1
|
262
|
+
r exec
|
263
|
+
} {foo bar {} {} {bar foo}}
|
264
|
+
|
265
|
+
test {BRPOPLPUSH timeout} {
|
266
|
+
set rd [redis_deferring_client]
|
267
|
+
|
268
|
+
$rd brpoplpush foo_list bar_list 1
|
269
|
+
after 2000
|
270
|
+
$rd read
|
271
|
+
} {}
|
272
|
+
|
273
|
+
foreach {pop} {BLPOP BRPOP} {
|
274
|
+
test "$pop: with single empty list argument" {
|
275
|
+
set rd [redis_deferring_client]
|
276
|
+
r del blist1
|
277
|
+
$rd $pop blist1 1
|
278
|
+
r rpush blist1 foo
|
279
|
+
assert_equal {blist1 foo} [$rd read]
|
280
|
+
assert_equal 0 [r exists blist1]
|
281
|
+
}
|
282
|
+
|
283
|
+
test "$pop: with negative timeout" {
|
284
|
+
set rd [redis_deferring_client]
|
285
|
+
$rd $pop blist1 -1
|
286
|
+
assert_error "ERR*is negative*" {$rd read}
|
287
|
+
}
|
288
|
+
|
289
|
+
test "$pop: with non-integer timeout" {
|
290
|
+
set rd [redis_deferring_client]
|
291
|
+
$rd $pop blist1 1.1
|
292
|
+
assert_error "ERR*not an integer*" {$rd read}
|
293
|
+
}
|
294
|
+
|
295
|
+
test "$pop: with zero timeout should block indefinitely" {
|
296
|
+
# To test this, use a timeout of 0 and wait a second.
|
297
|
+
# The blocking pop should still be waiting for a push.
|
298
|
+
set rd [redis_deferring_client]
|
299
|
+
$rd $pop blist1 0
|
300
|
+
after 1000
|
301
|
+
r rpush blist1 foo
|
302
|
+
assert_equal {blist1 foo} [$rd read]
|
303
|
+
}
|
304
|
+
|
305
|
+
test "$pop: second argument is not a list" {
|
306
|
+
set rd [redis_deferring_client]
|
307
|
+
r del blist1 blist2
|
308
|
+
r set blist2 nolist
|
309
|
+
$rd $pop blist1 blist2 1
|
310
|
+
assert_error "ERR*wrong kind*" {$rd read}
|
311
|
+
}
|
312
|
+
|
313
|
+
test "$pop: timeout" {
|
314
|
+
set rd [redis_deferring_client]
|
315
|
+
r del blist1 blist2
|
316
|
+
$rd $pop blist1 blist2 1
|
317
|
+
assert_equal {} [$rd read]
|
318
|
+
}
|
319
|
+
|
320
|
+
test "$pop: arguments are empty" {
|
321
|
+
set rd [redis_deferring_client]
|
322
|
+
r del blist1 blist2
|
323
|
+
|
324
|
+
$rd $pop blist1 blist2 1
|
325
|
+
r rpush blist1 foo
|
326
|
+
assert_equal {blist1 foo} [$rd read]
|
327
|
+
assert_equal 0 [r exists blist1]
|
328
|
+
assert_equal 0 [r exists blist2]
|
329
|
+
|
330
|
+
$rd $pop blist1 blist2 1
|
331
|
+
r rpush blist2 foo
|
332
|
+
assert_equal {blist2 foo} [$rd read]
|
333
|
+
assert_equal 0 [r exists blist1]
|
334
|
+
assert_equal 0 [r exists blist2]
|
335
|
+
}
|
336
|
+
}
|
337
|
+
|
338
|
+
test {BLPOP inside a transaction} {
|
339
|
+
r del xlist
|
340
|
+
r lpush xlist foo
|
341
|
+
r lpush xlist bar
|
342
|
+
r multi
|
343
|
+
r blpop xlist 0
|
344
|
+
r blpop xlist 0
|
345
|
+
r blpop xlist 0
|
346
|
+
r exec
|
347
|
+
} {{xlist bar} {xlist foo} {}}
|
348
|
+
|
349
|
+
test {LPUSHX, RPUSHX - generic} {
|
350
|
+
r del xlist
|
351
|
+
assert_equal 0 [r lpushx xlist a]
|
352
|
+
assert_equal 0 [r llen xlist]
|
353
|
+
assert_equal 0 [r rpushx xlist a]
|
354
|
+
assert_equal 0 [r llen xlist]
|
355
|
+
}
|
356
|
+
|
357
|
+
foreach {type large} [array get largevalue] {
|
358
|
+
test "LPUSHX, RPUSHX - $type" {
|
359
|
+
create_$type xlist "$large c"
|
360
|
+
assert_equal 3 [r rpushx xlist d]
|
361
|
+
assert_equal 4 [r lpushx xlist a]
|
362
|
+
assert_equal "a $large c d" [r lrange xlist 0 -1]
|
363
|
+
}
|
364
|
+
|
365
|
+
test "LINSERT - $type" {
|
366
|
+
create_$type xlist "a $large c d"
|
367
|
+
assert_equal 5 [r linsert xlist before c zz]
|
368
|
+
assert_equal "a $large zz c d" [r lrange xlist 0 10]
|
369
|
+
assert_equal 6 [r linsert xlist after c yy]
|
370
|
+
assert_equal "a $large zz c yy d" [r lrange xlist 0 10]
|
371
|
+
assert_equal 7 [r linsert xlist after d dd]
|
372
|
+
assert_equal -1 [r linsert xlist after bad ddd]
|
373
|
+
assert_equal "a $large zz c yy d dd" [r lrange xlist 0 10]
|
374
|
+
assert_equal 8 [r linsert xlist before a aa]
|
375
|
+
assert_equal -1 [r linsert xlist before bad aaa]
|
376
|
+
assert_equal "aa a $large zz c yy d dd" [r lrange xlist 0 10]
|
377
|
+
|
378
|
+
# check inserting integer encoded value
|
379
|
+
assert_equal 9 [r linsert xlist before aa 42]
|
380
|
+
assert_equal 42 [r lrange xlist 0 0]
|
381
|
+
}
|
382
|
+
}
|
383
|
+
|
384
|
+
test {LPUSHX, RPUSHX convert from ziplist to list} {
|
385
|
+
set large $largevalue(linkedlist)
|
386
|
+
|
387
|
+
# convert when a large value is pushed
|
388
|
+
create_ziplist xlist a
|
389
|
+
assert_equal 2 [r rpushx xlist $large]
|
390
|
+
assert_encoding linkedlist xlist
|
391
|
+
create_ziplist xlist a
|
392
|
+
assert_equal 2 [r lpushx xlist $large]
|
393
|
+
assert_encoding linkedlist xlist
|
394
|
+
|
395
|
+
# convert when the length threshold is exceeded
|
396
|
+
create_ziplist xlist [lrepeat 256 a]
|
397
|
+
assert_equal 257 [r rpushx xlist b]
|
398
|
+
assert_encoding linkedlist xlist
|
399
|
+
create_ziplist xlist [lrepeat 256 a]
|
400
|
+
assert_equal 257 [r lpushx xlist b]
|
401
|
+
assert_encoding linkedlist xlist
|
402
|
+
}
|
403
|
+
|
404
|
+
test {LINSERT convert from ziplist to list} {
|
405
|
+
set large $largevalue(linkedlist)
|
406
|
+
|
407
|
+
# convert when a large value is inserted
|
408
|
+
create_ziplist xlist a
|
409
|
+
assert_equal 2 [r linsert xlist before a $large]
|
410
|
+
assert_encoding linkedlist xlist
|
411
|
+
create_ziplist xlist a
|
412
|
+
assert_equal 2 [r linsert xlist after a $large]
|
413
|
+
assert_encoding linkedlist xlist
|
414
|
+
|
415
|
+
# convert when the length threshold is exceeded
|
416
|
+
create_ziplist xlist [lrepeat 256 a]
|
417
|
+
assert_equal 257 [r linsert xlist before a a]
|
418
|
+
assert_encoding linkedlist xlist
|
419
|
+
create_ziplist xlist [lrepeat 256 a]
|
420
|
+
assert_equal 257 [r linsert xlist after a a]
|
421
|
+
assert_encoding linkedlist xlist
|
422
|
+
|
423
|
+
# don't convert when the value could not be inserted
|
424
|
+
create_ziplist xlist [lrepeat 256 a]
|
425
|
+
assert_equal -1 [r linsert xlist before foo a]
|
426
|
+
assert_encoding ziplist xlist
|
427
|
+
create_ziplist xlist [lrepeat 256 a]
|
428
|
+
assert_equal -1 [r linsert xlist after foo a]
|
429
|
+
assert_encoding ziplist xlist
|
430
|
+
}
|
431
|
+
|
432
|
+
foreach {type num} {ziplist 250 linkedlist 500} {
|
433
|
+
proc check_numbered_list_consistency {key} {
|
434
|
+
set len [r llen $key]
|
435
|
+
for {set i 0} {$i < $len} {incr i} {
|
436
|
+
assert_equal $i [r lindex $key $i]
|
437
|
+
assert_equal [expr $len-1-$i] [r lindex $key [expr (-$i)-1]]
|
438
|
+
}
|
439
|
+
}
|
440
|
+
|
441
|
+
proc check_random_access_consistency {key} {
|
442
|
+
set len [r llen $key]
|
443
|
+
for {set i 0} {$i < $len} {incr i} {
|
444
|
+
set rint [expr int(rand()*$len)]
|
445
|
+
assert_equal $rint [r lindex $key $rint]
|
446
|
+
assert_equal [expr $len-1-$rint] [r lindex $key [expr (-$rint)-1]]
|
447
|
+
}
|
448
|
+
}
|
449
|
+
|
450
|
+
test "LINDEX consistency test - $type" {
|
451
|
+
r del mylist
|
452
|
+
for {set i 0} {$i < $num} {incr i} {
|
453
|
+
r rpush mylist $i
|
454
|
+
}
|
455
|
+
assert_encoding $type mylist
|
456
|
+
check_numbered_list_consistency mylist
|
457
|
+
}
|
458
|
+
|
459
|
+
test "LINDEX random access - $type" {
|
460
|
+
assert_encoding $type mylist
|
461
|
+
check_random_access_consistency mylist
|
462
|
+
}
|
463
|
+
|
464
|
+
test "Check if list is still ok after a DEBUG RELOAD - $type" {
|
465
|
+
r debug reload
|
466
|
+
assert_encoding $type mylist
|
467
|
+
check_numbered_list_consistency mylist
|
468
|
+
check_random_access_consistency mylist
|
469
|
+
}
|
470
|
+
}
|
471
|
+
|
472
|
+
test {LLEN against non-list value error} {
|
473
|
+
r del mylist
|
474
|
+
r set mylist foobar
|
475
|
+
assert_error ERR* {r llen mylist}
|
476
|
+
}
|
477
|
+
|
478
|
+
test {LLEN against non existing key} {
|
479
|
+
assert_equal 0 [r llen not-a-key]
|
480
|
+
}
|
481
|
+
|
482
|
+
test {LINDEX against non-list value error} {
|
483
|
+
assert_error ERR* {r lindex mylist 0}
|
484
|
+
}
|
485
|
+
|
486
|
+
test {LINDEX against non existing key} {
|
487
|
+
assert_equal "" [r lindex not-a-key 10]
|
488
|
+
}
|
489
|
+
|
490
|
+
test {LPUSH against non-list value error} {
|
491
|
+
assert_error ERR* {r lpush mylist 0}
|
492
|
+
}
|
493
|
+
|
494
|
+
test {RPUSH against non-list value error} {
|
495
|
+
assert_error ERR* {r rpush mylist 0}
|
496
|
+
}
|
497
|
+
|
498
|
+
foreach {type large} [array get largevalue] {
|
499
|
+
test "RPOPLPUSH base case - $type" {
|
500
|
+
r del mylist1 mylist2
|
501
|
+
create_$type mylist1 "a $large c d"
|
502
|
+
assert_equal d [r rpoplpush mylist1 mylist2]
|
503
|
+
assert_equal c [r rpoplpush mylist1 mylist2]
|
504
|
+
assert_equal "a $large" [r lrange mylist1 0 -1]
|
505
|
+
assert_equal "c d" [r lrange mylist2 0 -1]
|
506
|
+
assert_encoding ziplist mylist2
|
507
|
+
}
|
508
|
+
|
509
|
+
test "RPOPLPUSH with the same list as src and dst - $type" {
|
510
|
+
create_$type mylist "a $large c"
|
511
|
+
assert_equal "a $large c" [r lrange mylist 0 -1]
|
512
|
+
assert_equal c [r rpoplpush mylist mylist]
|
513
|
+
assert_equal "c a $large" [r lrange mylist 0 -1]
|
514
|
+
}
|
515
|
+
|
516
|
+
foreach {othertype otherlarge} [array get largevalue] {
|
517
|
+
test "RPOPLPUSH with $type source and existing target $othertype" {
|
518
|
+
create_$type srclist "a b c $large"
|
519
|
+
create_$othertype dstlist "$otherlarge"
|
520
|
+
assert_equal $large [r rpoplpush srclist dstlist]
|
521
|
+
assert_equal c [r rpoplpush srclist dstlist]
|
522
|
+
assert_equal "a b" [r lrange srclist 0 -1]
|
523
|
+
assert_equal "c $large $otherlarge" [r lrange dstlist 0 -1]
|
524
|
+
|
525
|
+
# When we rpoplpush'ed a large value, dstlist should be
|
526
|
+
# converted to the same encoding as srclist.
|
527
|
+
if {$type eq "linkedlist"} {
|
528
|
+
assert_encoding linkedlist dstlist
|
529
|
+
}
|
530
|
+
}
|
531
|
+
}
|
532
|
+
}
|
533
|
+
|
534
|
+
test {RPOPLPUSH against non existing key} {
|
535
|
+
r del srclist dstlist
|
536
|
+
assert_equal {} [r rpoplpush srclist dstlist]
|
537
|
+
assert_equal 0 [r exists srclist]
|
538
|
+
assert_equal 0 [r exists dstlist]
|
539
|
+
}
|
540
|
+
|
541
|
+
test {RPOPLPUSH against non list src key} {
|
542
|
+
r del srclist dstlist
|
543
|
+
r set srclist x
|
544
|
+
assert_error ERR* {r rpoplpush srclist dstlist}
|
545
|
+
assert_type string srclist
|
546
|
+
assert_equal 0 [r exists newlist]
|
547
|
+
}
|
548
|
+
|
549
|
+
test {RPOPLPUSH against non list dst key} {
|
550
|
+
create_ziplist srclist {a b c d}
|
551
|
+
r set dstlist x
|
552
|
+
assert_error ERR* {r rpoplpush srclist dstlist}
|
553
|
+
assert_type string dstlist
|
554
|
+
assert_equal {a b c d} [r lrange srclist 0 -1]
|
555
|
+
}
|
556
|
+
|
557
|
+
test {RPOPLPUSH against non existing src key} {
|
558
|
+
r del srclist dstlist
|
559
|
+
assert_equal {} [r rpoplpush srclist dstlist]
|
560
|
+
} {}
|
561
|
+
|
562
|
+
foreach {type large} [array get largevalue] {
|
563
|
+
test "Basic LPOP/RPOP - $type" {
|
564
|
+
create_$type mylist "$large 1 2"
|
565
|
+
assert_equal $large [r lpop mylist]
|
566
|
+
assert_equal 2 [r rpop mylist]
|
567
|
+
assert_equal 1 [r lpop mylist]
|
568
|
+
assert_equal 0 [r llen mylist]
|
569
|
+
|
570
|
+
# pop on empty list
|
571
|
+
assert_equal {} [r lpop mylist]
|
572
|
+
assert_equal {} [r rpop mylist]
|
573
|
+
}
|
574
|
+
}
|
575
|
+
|
576
|
+
test {LPOP/RPOP against non list value} {
|
577
|
+
r set notalist foo
|
578
|
+
assert_error ERR*kind* {r lpop notalist}
|
579
|
+
assert_error ERR*kind* {r rpop notalist}
|
580
|
+
}
|
581
|
+
|
582
|
+
foreach {type num} {ziplist 250 linkedlist 500} {
|
583
|
+
test "Mass RPOP/LPOP - $type" {
|
584
|
+
r del mylist
|
585
|
+
set sum1 0
|
586
|
+
for {set i 0} {$i < $num} {incr i} {
|
587
|
+
r lpush mylist $i
|
588
|
+
incr sum1 $i
|
589
|
+
}
|
590
|
+
assert_encoding $type mylist
|
591
|
+
set sum2 0
|
592
|
+
for {set i 0} {$i < [expr $num/2]} {incr i} {
|
593
|
+
incr sum2 [r lpop mylist]
|
594
|
+
incr sum2 [r rpop mylist]
|
595
|
+
}
|
596
|
+
assert_equal $sum1 $sum2
|
597
|
+
}
|
598
|
+
}
|
599
|
+
|
600
|
+
foreach {type large} [array get largevalue] {
|
601
|
+
test "LRANGE basics - $type" {
|
602
|
+
create_$type mylist "$large 1 2 3 4 5 6 7 8 9"
|
603
|
+
assert_equal {1 2 3 4 5 6 7 8} [r lrange mylist 1 -2]
|
604
|
+
assert_equal {7 8 9} [r lrange mylist -3 -1]
|
605
|
+
assert_equal {4} [r lrange mylist 4 4]
|
606
|
+
}
|
607
|
+
|
608
|
+
test "LRANGE inverted indexes - $type" {
|
609
|
+
create_$type mylist "$large 1 2 3 4 5 6 7 8 9"
|
610
|
+
assert_equal {} [r lrange mylist 6 2]
|
611
|
+
}
|
612
|
+
|
613
|
+
test "LRANGE out of range indexes including the full list - $type" {
|
614
|
+
create_$type mylist "$large 1 2 3"
|
615
|
+
assert_equal "$large 1 2 3" [r lrange mylist -1000 1000]
|
616
|
+
}
|
617
|
+
|
618
|
+
test "LRANGE out of range negative end index - $type" {
|
619
|
+
create_$type mylist "$large 1 2 3"
|
620
|
+
assert_equal $large [r lrange mylist 0 -4]
|
621
|
+
assert_equal {} [r lrange mylist 0 -5]
|
622
|
+
}
|
623
|
+
}
|
624
|
+
|
625
|
+
test {LRANGE against non existing key} {
|
626
|
+
assert_equal {} [r lrange nosuchkey 0 1]
|
627
|
+
}
|
628
|
+
|
629
|
+
foreach {type large} [array get largevalue] {
|
630
|
+
proc trim_list {type min max} {
|
631
|
+
upvar 1 large large
|
632
|
+
r del mylist
|
633
|
+
create_$type mylist "1 2 3 4 $large"
|
634
|
+
r ltrim mylist $min $max
|
635
|
+
r lrange mylist 0 -1
|
636
|
+
}
|
637
|
+
|
638
|
+
test "LTRIM basics - $type" {
|
639
|
+
assert_equal "1" [trim_list $type 0 0]
|
640
|
+
assert_equal "1 2" [trim_list $type 0 1]
|
641
|
+
assert_equal "1 2 3" [trim_list $type 0 2]
|
642
|
+
assert_equal "2 3" [trim_list $type 1 2]
|
643
|
+
assert_equal "2 3 4 $large" [trim_list $type 1 -1]
|
644
|
+
assert_equal "2 3 4" [trim_list $type 1 -2]
|
645
|
+
assert_equal "4 $large" [trim_list $type -2 -1]
|
646
|
+
assert_equal "$large" [trim_list $type -1 -1]
|
647
|
+
assert_equal "1 2 3 4 $large" [trim_list $type -5 -1]
|
648
|
+
assert_equal "1 2 3 4 $large" [trim_list $type -10 10]
|
649
|
+
assert_equal "1 2 3 4 $large" [trim_list $type 0 5]
|
650
|
+
assert_equal "1 2 3 4 $large" [trim_list $type 0 10]
|
651
|
+
}
|
652
|
+
|
653
|
+
test "LTRIM out of range negative end index - $type" {
|
654
|
+
assert_equal {1} [trim_list $type 0 -5]
|
655
|
+
assert_equal {} [trim_list $type 0 -6]
|
656
|
+
}
|
657
|
+
|
658
|
+
tags {"slow"} {
|
659
|
+
test "LTRIM stress testing - $type" {
|
660
|
+
set mylist {}
|
661
|
+
set startlen 32
|
662
|
+
r del mylist
|
663
|
+
|
664
|
+
# Start with the large value to ensure the
|
665
|
+
# right encoding is used.
|
666
|
+
r rpush mylist $large
|
667
|
+
lappend mylist $large
|
668
|
+
|
669
|
+
for {set i 0} {$i < $startlen} {incr i} {
|
670
|
+
set str [randomInt 9223372036854775807]
|
671
|
+
r rpush mylist $str
|
672
|
+
lappend mylist $str
|
673
|
+
}
|
674
|
+
|
675
|
+
for {set i 0} {$i < 1000} {incr i} {
|
676
|
+
set min [expr {int(rand()*$startlen)}]
|
677
|
+
set max [expr {$min+int(rand()*$startlen)}]
|
678
|
+
set mylist [lrange $mylist $min $max]
|
679
|
+
r ltrim mylist $min $max
|
680
|
+
assert_equal $mylist [r lrange mylist 0 -1]
|
681
|
+
|
682
|
+
for {set j [r llen mylist]} {$j < $startlen} {incr j} {
|
683
|
+
set str [randomInt 9223372036854775807]
|
684
|
+
r rpush mylist $str
|
685
|
+
lappend mylist $str
|
686
|
+
}
|
687
|
+
}
|
688
|
+
}
|
689
|
+
}
|
690
|
+
}
|
691
|
+
|
692
|
+
foreach {type large} [array get largevalue] {
|
693
|
+
test "LSET - $type" {
|
694
|
+
create_$type mylist "99 98 $large 96 95"
|
695
|
+
r lset mylist 1 foo
|
696
|
+
r lset mylist -1 bar
|
697
|
+
assert_equal "99 foo $large 96 bar" [r lrange mylist 0 -1]
|
698
|
+
}
|
699
|
+
|
700
|
+
test "LSET out of range index - $type" {
|
701
|
+
assert_error ERR*range* {r lset mylist 10 foo}
|
702
|
+
}
|
703
|
+
}
|
704
|
+
|
705
|
+
test {LSET against non existing key} {
|
706
|
+
assert_error ERR*key* {r lset nosuchkey 10 foo}
|
707
|
+
}
|
708
|
+
|
709
|
+
test {LSET against non list value} {
|
710
|
+
r set nolist foobar
|
711
|
+
assert_error ERR*value* {r lset nolist 0 foo}
|
712
|
+
}
|
713
|
+
|
714
|
+
foreach {type e} [array get largevalue] {
|
715
|
+
test "LREM remove all the occurrences - $type" {
|
716
|
+
create_$type mylist "$e foo bar foobar foobared zap bar test foo"
|
717
|
+
assert_equal 2 [r lrem mylist 0 bar]
|
718
|
+
assert_equal "$e foo foobar foobared zap test foo" [r lrange mylist 0 -1]
|
719
|
+
}
|
720
|
+
|
721
|
+
test "LREM remove the first occurrence - $type" {
|
722
|
+
assert_equal 1 [r lrem mylist 1 foo]
|
723
|
+
assert_equal "$e foobar foobared zap test foo" [r lrange mylist 0 -1]
|
724
|
+
}
|
725
|
+
|
726
|
+
test "LREM remove non existing element - $type" {
|
727
|
+
assert_equal 0 [r lrem mylist 1 nosuchelement]
|
728
|
+
assert_equal "$e foobar foobared zap test foo" [r lrange mylist 0 -1]
|
729
|
+
}
|
730
|
+
|
731
|
+
test "LREM starting from tail with negative count - $type" {
|
732
|
+
create_$type mylist "$e foo bar foobar foobared zap bar test foo foo"
|
733
|
+
assert_equal 1 [r lrem mylist -1 bar]
|
734
|
+
assert_equal "$e foo bar foobar foobared zap test foo foo" [r lrange mylist 0 -1]
|
735
|
+
}
|
736
|
+
|
737
|
+
test "LREM starting from tail with negative count (2) - $type" {
|
738
|
+
assert_equal 2 [r lrem mylist -2 foo]
|
739
|
+
assert_equal "$e foo bar foobar foobared zap test" [r lrange mylist 0 -1]
|
740
|
+
}
|
741
|
+
|
742
|
+
test "LREM deleting objects that may be int encoded - $type" {
|
743
|
+
create_$type myotherlist "$e 1 2 3"
|
744
|
+
assert_equal 1 [r lrem myotherlist 1 2]
|
745
|
+
assert_equal 3 [r llen myotherlist]
|
746
|
+
}
|
747
|
+
|
748
|
+
}
|
749
|
+
}
|
750
|
+
|
751
|
+
start_server {
|
752
|
+
tags {list ziplist}
|
753
|
+
overrides {
|
754
|
+
"list-max-ziplist-value" 200000
|
755
|
+
"list-max-ziplist-entries" 256
|
756
|
+
}
|
757
|
+
} {
|
758
|
+
test {Explicit regression for a list bug} {
|
759
|
+
set mylist {49376042582 {BkG2o\pIC]4YYJa9cJ4GWZalG[4tin;1D2whSkCOW`mX;SFXGyS8sedcff3fQI^tgPCC@^Nu1J6o]meM@Lko]t_jRyo<xSJ1oObDYd`ppZuW6P@fS278YaOx=s6lvdFlMbP0[SbkI^Kr\HBXtuFaA^mDx:yzS4a[skiiPWhT<nNfAf=aQVfclcuwDrfe;iVuKdNvB9kbfq>tK?tH[\EvWqS]b`o2OCtjg:?nUTwdjpcUm]y:pg5q24q7LlCOwQE^}}
|
760
|
+
r del l
|
761
|
+
r rpush l [lindex $mylist 0]
|
762
|
+
r rpush l [lindex $mylist 1]
|
763
|
+
assert_equal [r lindex l 0] [lindex $mylist 0]
|
764
|
+
assert_equal [r lindex l 1] [lindex $mylist 1]
|
765
|
+
}
|
766
|
+
|
767
|
+
tags {slow} {
|
768
|
+
test {ziplist implementation: value encoding and backlink} {
|
769
|
+
for {set j 0} {$j < 100} {incr j} {
|
770
|
+
r del l
|
771
|
+
set l {}
|
772
|
+
for {set i 0} {$i < 200} {incr i} {
|
773
|
+
randpath {
|
774
|
+
set data [string repeat x [randomInt 100000]]
|
775
|
+
} {
|
776
|
+
set data [randomInt 65536]
|
777
|
+
} {
|
778
|
+
set data [randomInt 4294967296]
|
779
|
+
} {
|
780
|
+
set data [randomInt 18446744073709551616]
|
781
|
+
}
|
782
|
+
lappend l $data
|
783
|
+
r rpush l $data
|
784
|
+
}
|
785
|
+
assert_equal [llength $l] [r llen l]
|
786
|
+
# Traverse backward
|
787
|
+
for {set i 199} {$i >= 0} {incr i -1} {
|
788
|
+
if {[lindex $l $i] ne [r lindex l $i]} {
|
789
|
+
assert_equal [lindex $l $i] [r lindex l $i]
|
790
|
+
}
|
791
|
+
}
|
792
|
+
}
|
793
|
+
}
|
794
|
+
|
795
|
+
test {ziplist implementation: encoding stress testing} {
|
796
|
+
for {set j 0} {$j < 200} {incr j} {
|
797
|
+
r del l
|
798
|
+
set l {}
|
799
|
+
set len [randomInt 400]
|
800
|
+
for {set i 0} {$i < $len} {incr i} {
|
801
|
+
set rv [randomValue]
|
802
|
+
randpath {
|
803
|
+
lappend l $rv
|
804
|
+
r rpush l $rv
|
805
|
+
} {
|
806
|
+
set l [concat [list $rv] $l]
|
807
|
+
r lpush l $rv
|
808
|
+
}
|
809
|
+
}
|
810
|
+
assert_equal [llength $l] [r llen l]
|
811
|
+
for {set i 0} {$i < 200} {incr i} {
|
812
|
+
if {[lindex $l $i] ne [r lindex l $i]} {
|
813
|
+
assert_equal [lindex $l $i] [r lindex l $i]
|
814
|
+
}
|
815
|
+
}
|
816
|
+
}
|
817
|
+
}
|
818
|
+
}
|
819
|
+
}
|