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.
Files changed (290) hide show
  1. data/LICENSE +38 -0
  2. data/README.md +33 -0
  3. data/bin/redis +114 -0
  4. data/redis/Makefile +5 -0
  5. data/redis/extconf.rb +3 -0
  6. data/redis/redis-2.2.11/00-RELEASENOTES +199 -0
  7. data/redis/redis-2.2.11/BUGS +1 -0
  8. data/redis/redis-2.2.11/CONTRIBUTING +13 -0
  9. data/redis/redis-2.2.11/COPYING +10 -0
  10. data/redis/redis-2.2.11/Changelog +1032 -0
  11. data/redis/redis-2.2.11/INSTALL +30 -0
  12. data/redis/redis-2.2.11/Makefile +22 -0
  13. data/redis/redis-2.2.11/README +83 -0
  14. data/redis/redis-2.2.11/TODO +4 -0
  15. data/redis/redis-2.2.11/client-libraries/README +11 -0
  16. data/redis/redis-2.2.11/deps/hiredis/COPYING +10 -0
  17. data/redis/redis-2.2.11/deps/hiredis/Makefile +115 -0
  18. data/redis/redis-2.2.11/deps/hiredis/README.md +311 -0
  19. data/redis/redis-2.2.11/deps/hiredis/TODO +2 -0
  20. data/redis/redis-2.2.11/deps/hiredis/adapters/ae.h +95 -0
  21. data/redis/redis-2.2.11/deps/hiredis/adapters/libev.h +113 -0
  22. data/redis/redis-2.2.11/deps/hiredis/adapters/libevent.h +76 -0
  23. data/redis/redis-2.2.11/deps/hiredis/async.c +321 -0
  24. data/redis/redis-2.2.11/deps/hiredis/async.h +112 -0
  25. data/redis/redis-2.2.11/deps/hiredis/example-ae.c +53 -0
  26. data/redis/redis-2.2.11/deps/hiredis/example-libev.c +47 -0
  27. data/redis/redis-2.2.11/deps/hiredis/example-libevent.c +48 -0
  28. data/redis/redis-2.2.11/deps/hiredis/example.c +67 -0
  29. data/redis/redis-2.2.11/deps/hiredis/fmacros.h +15 -0
  30. data/redis/redis-2.2.11/deps/hiredis/hiredis.c +1058 -0
  31. data/redis/redis-2.2.11/deps/hiredis/hiredis.h +170 -0
  32. data/redis/redis-2.2.11/deps/hiredis/net.c +170 -0
  33. data/redis/redis-2.2.11/deps/hiredis/net.h +43 -0
  34. data/redis/redis-2.2.11/deps/hiredis/sds.c +479 -0
  35. data/redis/redis-2.2.11/deps/hiredis/sds.h +77 -0
  36. data/redis/redis-2.2.11/deps/hiredis/test.c +479 -0
  37. data/redis/redis-2.2.11/deps/hiredis/util.h +40 -0
  38. data/redis/redis-2.2.11/deps/linenoise/Makefile +10 -0
  39. data/redis/redis-2.2.11/deps/linenoise/README.markdown +45 -0
  40. data/redis/redis-2.2.11/deps/linenoise/example.c +27 -0
  41. data/redis/redis-2.2.11/deps/linenoise/linenoise.c +609 -0
  42. data/redis/redis-2.2.11/deps/linenoise/linenoise.h +55 -0
  43. data/redis/redis-2.2.11/design-documents/REDIS-CLUSTER +214 -0
  44. data/redis/redis-2.2.11/design-documents/REDIS-CLUSTER-2 +343 -0
  45. data/redis/redis-2.2.11/doc/AppendCommand.html +48 -0
  46. data/redis/redis-2.2.11/doc/AppendOnlyFileHowto.html +41 -0
  47. data/redis/redis-2.2.11/doc/AuthCommand.html +39 -0
  48. data/redis/redis-2.2.11/doc/Benchmarks.html +129 -0
  49. data/redis/redis-2.2.11/doc/BgrewriteaofCommand.html +41 -0
  50. data/redis/redis-2.2.11/doc/BgsaveCommand.html +39 -0
  51. data/redis/redis-2.2.11/doc/BlpopCommand.html +51 -0
  52. data/redis/redis-2.2.11/doc/BrpoplpushCommand.html +39 -0
  53. data/redis/redis-2.2.11/doc/CommandReference.html +47 -0
  54. data/redis/redis-2.2.11/doc/Comparisons.html +42 -0
  55. data/redis/redis-2.2.11/doc/ConfigCommand.html +76 -0
  56. data/redis/redis-2.2.11/doc/Configuration.html +38 -0
  57. data/redis/redis-2.2.11/doc/ConnectionHandlingSidebar.html +36 -0
  58. data/redis/redis-2.2.11/doc/ControlCommandsSidebar.html +36 -0
  59. data/redis/redis-2.2.11/doc/Credits.html +38 -0
  60. data/redis/redis-2.2.11/doc/DbsizeCommand.html +38 -0
  61. data/redis/redis-2.2.11/doc/DelCommand.html +41 -0
  62. data/redis/redis-2.2.11/doc/DesignPatterns.html +37 -0
  63. data/redis/redis-2.2.11/doc/EventLibray.html +44 -0
  64. data/redis/redis-2.2.11/doc/ExistsCommand.html +42 -0
  65. data/redis/redis-2.2.11/doc/ExpireCommand.html +96 -0
  66. data/redis/redis-2.2.11/doc/FAQ.html +70 -0
  67. data/redis/redis-2.2.11/doc/Features.html +38 -0
  68. data/redis/redis-2.2.11/doc/FlushallCommand.html +39 -0
  69. data/redis/redis-2.2.11/doc/FlushdbCommand.html +39 -0
  70. data/redis/redis-2.2.11/doc/FromSqlToDataStructures.html +37 -0
  71. data/redis/redis-2.2.11/doc/GenericCommandsSidebar.html +36 -0
  72. data/redis/redis-2.2.11/doc/GetCommand.html +39 -0
  73. data/redis/redis-2.2.11/doc/GetbitCommand.html +39 -0
  74. data/redis/redis-2.2.11/doc/GetsetCommand.html +38 -0
  75. data/redis/redis-2.2.11/doc/HackingStrings.html +83 -0
  76. data/redis/redis-2.2.11/doc/HashCommandsSidebar.html +36 -0
  77. data/redis/redis-2.2.11/doc/Hashes.html +37 -0
  78. data/redis/redis-2.2.11/doc/HdelCommand.html +39 -0
  79. data/redis/redis-2.2.11/doc/HexistsCommand.html +39 -0
  80. data/redis/redis-2.2.11/doc/HgetCommand.html +39 -0
  81. data/redis/redis-2.2.11/doc/HgetallCommand.html +40 -0
  82. data/redis/redis-2.2.11/doc/HincrbyCommand.html +45 -0
  83. data/redis/redis-2.2.11/doc/HlenCommand.html +38 -0
  84. data/redis/redis-2.2.11/doc/HmgetCommand.html +40 -0
  85. data/redis/redis-2.2.11/doc/HmsetCommand.html +40 -0
  86. data/redis/redis-2.2.11/doc/HsetCommand.html +40 -0
  87. data/redis/redis-2.2.11/doc/HsetnxCommand.html +41 -0
  88. data/redis/redis-2.2.11/doc/IncrCommand.html +43 -0
  89. data/redis/redis-2.2.11/doc/InfoCommand.html +48 -0
  90. data/redis/redis-2.2.11/doc/IntroductionToRedisDataTypes.html +152 -0
  91. data/redis/redis-2.2.11/doc/KeysCommand.html +43 -0
  92. data/redis/redis-2.2.11/doc/LastsaveCommand.html +39 -0
  93. data/redis/redis-2.2.11/doc/LindexCommand.html +40 -0
  94. data/redis/redis-2.2.11/doc/ListCommandsSidebar.html +36 -0
  95. data/redis/redis-2.2.11/doc/Lists.html +42 -0
  96. data/redis/redis-2.2.11/doc/LlenCommand.html +41 -0
  97. data/redis/redis-2.2.11/doc/LpopCommand.html +41 -0
  98. data/redis/redis-2.2.11/doc/LrangeCommand.html +47 -0
  99. data/redis/redis-2.2.11/doc/LremCommand.html +41 -0
  100. data/redis/redis-2.2.11/doc/LsetCommand.html +38 -0
  101. data/redis/redis-2.2.11/doc/LtrimCommand.html +47 -0
  102. data/redis/redis-2.2.11/doc/MgetCommand.html +52 -0
  103. data/redis/redis-2.2.11/doc/MonitorCommand.html +63 -0
  104. data/redis/redis-2.2.11/doc/MoveCommand.html +42 -0
  105. data/redis/redis-2.2.11/doc/MsetCommand.html +44 -0
  106. data/redis/redis-2.2.11/doc/MultiExecCommand.html +166 -0
  107. data/redis/redis-2.2.11/doc/NonexistentCommands.html +51 -0
  108. data/redis/redis-2.2.11/doc/ObjectHashMappers.html +39 -0
  109. data/redis/redis-2.2.11/doc/Pipelining.html +36 -0
  110. data/redis/redis-2.2.11/doc/ProgrammingExamples.html +38 -0
  111. data/redis/redis-2.2.11/doc/ProtocolSpecification.html +137 -0
  112. data/redis/redis-2.2.11/doc/PublishSubscribe.html +115 -0
  113. data/redis/redis-2.2.11/doc/QuickStart.html +68 -0
  114. data/redis/redis-2.2.11/doc/QuitCommand.html +38 -0
  115. data/redis/redis-2.2.11/doc/README.html +119 -0
  116. data/redis/redis-2.2.11/doc/RandomkeyCommand.html +39 -0
  117. data/redis/redis-2.2.11/doc/Redis0100ChangeLog.html +67 -0
  118. data/redis/redis-2.2.11/doc/Redis0900ChangeLog.html +56 -0
  119. data/redis/redis-2.2.11/doc/RedisBigData.html +61 -0
  120. data/redis/redis-2.2.11/doc/RedisCLI.html +37 -0
  121. data/redis/redis-2.2.11/doc/RedisEventLibrary.html +70 -0
  122. data/redis/redis-2.2.11/doc/RedisGuides.html +37 -0
  123. data/redis/redis-2.2.11/doc/RedisInternals.html +38 -0
  124. data/redis/redis-2.2.11/doc/RedisPipelining.html +93 -0
  125. data/redis/redis-2.2.11/doc/RedisStatus.html +56 -0
  126. data/redis/redis-2.2.11/doc/Redis_1_2_0_Changelog.html +40 -0
  127. data/redis/redis-2.2.11/doc/Redis_2_0_0_Changelog.html +62 -0
  128. data/redis/redis-2.2.11/doc/Redis_2_0_Whats_new.html +59 -0
  129. data/redis/redis-2.2.11/doc/RenameCommand.html +39 -0
  130. data/redis/redis-2.2.11/doc/RenamenxCommand.html +42 -0
  131. data/redis/redis-2.2.11/doc/ReplicationHowto.html +43 -0
  132. data/redis/redis-2.2.11/doc/ReplyTypes.html +42 -0
  133. data/redis/redis-2.2.11/doc/RoadMap.html +38 -0
  134. data/redis/redis-2.2.11/doc/RpoplpushCommand.html +44 -0
  135. data/redis/redis-2.2.11/doc/RpushCommand.html +40 -0
  136. data/redis/redis-2.2.11/doc/SaddCommand.html +41 -0
  137. data/redis/redis-2.2.11/doc/SaveCommand.html +39 -0
  138. data/redis/redis-2.2.11/doc/ScardCommand.html +41 -0
  139. data/redis/redis-2.2.11/doc/SdiffCommand.html +45 -0
  140. data/redis/redis-2.2.11/doc/SdiffstoreCommand.html +38 -0
  141. data/redis/redis-2.2.11/doc/SelectCommand.html +39 -0
  142. data/redis/redis-2.2.11/doc/SetCommand.html +39 -0
  143. data/redis/redis-2.2.11/doc/SetCommandsSidebar.html +36 -0
  144. data/redis/redis-2.2.11/doc/SetbitCommand.html +45 -0
  145. data/redis/redis-2.2.11/doc/SetexCommand.html +42 -0
  146. data/redis/redis-2.2.11/doc/SetnxCommand.html +51 -0
  147. data/redis/redis-2.2.11/doc/SetrangeCommand.html +58 -0
  148. data/redis/redis-2.2.11/doc/Sets.html +36 -0
  149. data/redis/redis-2.2.11/doc/ShutdownCommand.html +39 -0
  150. data/redis/redis-2.2.11/doc/SideBar.html +36 -0
  151. data/redis/redis-2.2.11/doc/SinterCommand.html +40 -0
  152. data/redis/redis-2.2.11/doc/SinterstoreCommand.html +39 -0
  153. data/redis/redis-2.2.11/doc/SismemberCommand.html +42 -0
  154. data/redis/redis-2.2.11/doc/SlaveofCommand.html +41 -0
  155. data/redis/redis-2.2.11/doc/SmembersCommand.html +38 -0
  156. data/redis/redis-2.2.11/doc/SmoveCommand.html +44 -0
  157. data/redis/redis-2.2.11/doc/SortCommand.html +75 -0
  158. data/redis/redis-2.2.11/doc/SortedSetCommandsSidebar.html +36 -0
  159. data/redis/redis-2.2.11/doc/SortedSets.html +36 -0
  160. data/redis/redis-2.2.11/doc/Speed.html +38 -0
  161. data/redis/redis-2.2.11/doc/SponsorshipHistory.html +38 -0
  162. data/redis/redis-2.2.11/doc/SpopCommand.html +40 -0
  163. data/redis/redis-2.2.11/doc/SrandmemberCommand.html +40 -0
  164. data/redis/redis-2.2.11/doc/SremCommand.html +42 -0
  165. data/redis/redis-2.2.11/doc/StringCommandsSidebar.html +36 -0
  166. data/redis/redis-2.2.11/doc/Strings.html +37 -0
  167. data/redis/redis-2.2.11/doc/StrlenCommand.html +39 -0
  168. data/redis/redis-2.2.11/doc/SubstrCommand.html +52 -0
  169. data/redis/redis-2.2.11/doc/SunionCommand.html +40 -0
  170. data/redis/redis-2.2.11/doc/SunionstoreCommand.html +38 -0
  171. data/redis/redis-2.2.11/doc/SupportedLanguages.html +60 -0
  172. data/redis/redis-2.2.11/doc/SupportedPlatforms.html +37 -0
  173. data/redis/redis-2.2.11/doc/TemplateCommand.html +38 -0
  174. data/redis/redis-2.2.11/doc/TtlCommand.html +38 -0
  175. data/redis/redis-2.2.11/doc/TwitterAlikeExample.html +250 -0
  176. data/redis/redis-2.2.11/doc/TypeCommand.html +46 -0
  177. data/redis/redis-2.2.11/doc/UnstableSource.html +39 -0
  178. data/redis/redis-2.2.11/doc/VirtualMemorySpecification.html +156 -0
  179. data/redis/redis-2.2.11/doc/VirtualMemoryUserGuide.html +66 -0
  180. data/redis/redis-2.2.11/doc/ZaddCommand.html +43 -0
  181. data/redis/redis-2.2.11/doc/ZcardCommand.html +41 -0
  182. data/redis/redis-2.2.11/doc/ZincrbyCommand.html +42 -0
  183. data/redis/redis-2.2.11/doc/ZrangeCommand.html +42 -0
  184. data/redis/redis-2.2.11/doc/ZrangebyscoreCommand.html +77 -0
  185. data/redis/redis-2.2.11/doc/ZrankCommand.html +43 -0
  186. data/redis/redis-2.2.11/doc/ZremCommand.html +42 -0
  187. data/redis/redis-2.2.11/doc/ZremrangebyrankCommand.html +39 -0
  188. data/redis/redis-2.2.11/doc/ZremrangebyscoreCommand.html +39 -0
  189. data/redis/redis-2.2.11/doc/ZscoreCommand.html +41 -0
  190. data/redis/redis-2.2.11/doc/ZunionCommand.html +42 -0
  191. data/redis/redis-2.2.11/doc/ZunionstoreCommand.html +43 -0
  192. data/redis/redis-2.2.11/doc/index.html +43 -0
  193. data/redis/redis-2.2.11/doc/redis.png +0 -0
  194. data/redis/redis-2.2.11/doc/style.css +25 -0
  195. data/redis/redis-2.2.11/redis.conf +417 -0
  196. data/redis/redis-2.2.11/src/Makefile +177 -0
  197. data/redis/redis-2.2.11/src/adlist.c +325 -0
  198. data/redis/redis-2.2.11/src/adlist.h +92 -0
  199. data/redis/redis-2.2.11/src/ae.c +390 -0
  200. data/redis/redis-2.2.11/src/ae.h +117 -0
  201. data/redis/redis-2.2.11/src/ae_epoll.c +91 -0
  202. data/redis/redis-2.2.11/src/ae_kqueue.c +93 -0
  203. data/redis/redis-2.2.11/src/ae_select.c +72 -0
  204. data/redis/redis-2.2.11/src/anet.c +347 -0
  205. data/redis/redis-2.2.11/src/anet.h +57 -0
  206. data/redis/redis-2.2.11/src/aof.c +675 -0
  207. data/redis/redis-2.2.11/src/config.c +627 -0
  208. data/redis/redis-2.2.11/src/config.h +64 -0
  209. data/redis/redis-2.2.11/src/db.c +543 -0
  210. data/redis/redis-2.2.11/src/debug.c +314 -0
  211. data/redis/redis-2.2.11/src/dict.c +721 -0
  212. data/redis/redis-2.2.11/src/dict.h +156 -0
  213. data/redis/redis-2.2.11/src/fmacros.h +15 -0
  214. data/redis/redis-2.2.11/src/help.h +638 -0
  215. data/redis/redis-2.2.11/src/intset.c +422 -0
  216. data/redis/redis-2.2.11/src/intset.h +19 -0
  217. data/redis/redis-2.2.11/src/lzf.h +100 -0
  218. data/redis/redis-2.2.11/src/lzfP.h +159 -0
  219. data/redis/redis-2.2.11/src/lzf_c.c +295 -0
  220. data/redis/redis-2.2.11/src/lzf_d.c +150 -0
  221. data/redis/redis-2.2.11/src/mkreleasehdr.sh +9 -0
  222. data/redis/redis-2.2.11/src/multi.c +268 -0
  223. data/redis/redis-2.2.11/src/networking.c +899 -0
  224. data/redis/redis-2.2.11/src/object.c +484 -0
  225. data/redis/redis-2.2.11/src/pqsort.c +197 -0
  226. data/redis/redis-2.2.11/src/pqsort.h +15 -0
  227. data/redis/redis-2.2.11/src/pubsub.c +267 -0
  228. data/redis/redis-2.2.11/src/rdb.c +1020 -0
  229. data/redis/redis-2.2.11/src/redis-benchmark.c +530 -0
  230. data/redis/redis-2.2.11/src/redis-check-aof.c +185 -0
  231. data/redis/redis-2.2.11/src/redis-check-dump.c +681 -0
  232. data/redis/redis-2.2.11/src/redis-cli.c +773 -0
  233. data/redis/redis-2.2.11/src/redis.c +1677 -0
  234. data/redis/redis-2.2.11/src/redis.h +1022 -0
  235. data/redis/redis-2.2.11/src/release.c +13 -0
  236. data/redis/redis-2.2.11/src/replication.c +557 -0
  237. data/redis/redis-2.2.11/src/sds.c +639 -0
  238. data/redis/redis-2.2.11/src/sds.h +78 -0
  239. data/redis/redis-2.2.11/src/sha1.c +276 -0
  240. data/redis/redis-2.2.11/src/sha1.h +17 -0
  241. data/redis/redis-2.2.11/src/solarisfixes.h +22 -0
  242. data/redis/redis-2.2.11/src/sort.c +389 -0
  243. data/redis/redis-2.2.11/src/syncio.c +154 -0
  244. data/redis/redis-2.2.11/src/t_hash.c +476 -0
  245. data/redis/redis-2.2.11/src/t_list.c +986 -0
  246. data/redis/redis-2.2.11/src/t_set.c +610 -0
  247. data/redis/redis-2.2.11/src/t_string.c +438 -0
  248. data/redis/redis-2.2.11/src/t_zset.c +1084 -0
  249. data/redis/redis-2.2.11/src/testhelp.h +54 -0
  250. data/redis/redis-2.2.11/src/util.c +243 -0
  251. data/redis/redis-2.2.11/src/valgrind.sup +5 -0
  252. data/redis/redis-2.2.11/src/version.h +1 -0
  253. data/redis/redis-2.2.11/src/vm.c +1149 -0
  254. data/redis/redis-2.2.11/src/ziplist.c +1323 -0
  255. data/redis/redis-2.2.11/src/ziplist.h +15 -0
  256. data/redis/redis-2.2.11/src/zipmap.c +455 -0
  257. data/redis/redis-2.2.11/src/zipmap.h +48 -0
  258. data/redis/redis-2.2.11/src/zmalloc.c +278 -0
  259. data/redis/redis-2.2.11/src/zmalloc.h +47 -0
  260. data/redis/redis-2.2.11/tests/assets/default.conf +308 -0
  261. data/redis/redis-2.2.11/tests/integration/aof.tcl +104 -0
  262. data/redis/redis-2.2.11/tests/integration/redis-cli.tcl +208 -0
  263. data/redis/redis-2.2.11/tests/integration/replication.tcl +98 -0
  264. data/redis/redis-2.2.11/tests/support/redis.tcl +241 -0
  265. data/redis/redis-2.2.11/tests/support/server.tcl +294 -0
  266. data/redis/redis-2.2.11/tests/support/test.tcl +190 -0
  267. data/redis/redis-2.2.11/tests/support/tmpfile.tcl +15 -0
  268. data/redis/redis-2.2.11/tests/support/util.tcl +296 -0
  269. data/redis/redis-2.2.11/tests/test_helper.tcl +221 -0
  270. data/redis/redis-2.2.11/tests/unit/auth.tcl +15 -0
  271. data/redis/redis-2.2.11/tests/unit/basic.tcl +616 -0
  272. data/redis/redis-2.2.11/tests/unit/cas.tcl +135 -0
  273. data/redis/redis-2.2.11/tests/unit/expire.tcl +74 -0
  274. data/redis/redis-2.2.11/tests/unit/other.tcl +240 -0
  275. data/redis/redis-2.2.11/tests/unit/printver.tcl +6 -0
  276. data/redis/redis-2.2.11/tests/unit/protocol.tcl +62 -0
  277. data/redis/redis-2.2.11/tests/unit/pubsub.tcl +195 -0
  278. data/redis/redis-2.2.11/tests/unit/quit.tcl +40 -0
  279. data/redis/redis-2.2.11/tests/unit/sort.tcl +189 -0
  280. data/redis/redis-2.2.11/tests/unit/type/hash.tcl +300 -0
  281. data/redis/redis-2.2.11/tests/unit/type/list.tcl +819 -0
  282. data/redis/redis-2.2.11/tests/unit/type/set.tcl +334 -0
  283. data/redis/redis-2.2.11/tests/unit/type/zset.tcl +587 -0
  284. data/redis/redis-2.2.11/utils/build-static-symbols.tcl +22 -0
  285. data/redis/redis-2.2.11/utils/generate-command-help.rb +112 -0
  286. data/redis/redis-2.2.11/utils/mktarball.sh +13 -0
  287. data/redis/redis-2.2.11/utils/redis-copy.rb +78 -0
  288. data/redis/redis-2.2.11/utils/redis-sha1.rb +52 -0
  289. data/redis/redis-2.2.11/utils/redis_init_script +42 -0
  290. 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
+ }