Skip to content

Commit f7c2e49

Browse files
authored
fix(redis): comprehensive Redis plugin overhaul (#378)
* fix(redis): add timeouts, keepalive, ACL auth, and thread-safety fixes * fix(redis): fix tokenizer escape handling and type-aware statement generation * fix(redis): pipeline value previews to eliminate serial round-trips * fix(redis): fix coordinator integration for non-SQL database behavior * feat(redis): add missing commands and improve data type previews * fix(redis): store EXAT/PXAT options and fix cancellation race across pipelines * fix(redis): address PR review findings - Fix trailing backslash dropped inside unclosed quotes - Enforce positive integers for EX/PX values - Free redisContext in markDisconnected() to prevent leak - Guard against empty string crash in withArgvPointers - Remove SELECT 1 interception that blocked database switching - Add resetCancellation to fetchRows/fetchTables/switchDatabase - Make SCAN cache database-aware to prevent cross-db stale results - Return empty string from dropObjectStatement to prevent SQL fallback - Handle ZADD INCR/CH flags in reply formatting - Rename hash insert fallback field from "field" to "value" - Use flatMap for double-optional unwrapping in QueryHelpers * fix(redis): fix deinit use-after-free, SELECT cache sync, and glob escaping - Restore async dispatch in deinit to prevent use-after-free when commands are in-flight on the serial queue - Use conn.selectDatabase() for SELECT command in query editor so _currentDatabase is updated and SCAN cache key stays correct - Quote keys with spaces in buildExplainQuery DEBUG OBJECT command - Escape ] in escapeGlobChars for correct SCAN MATCH patterns
1 parent 2229188 commit f7c2e49

12 files changed

+1218
-236
lines changed

Plugins/RedisDriverPlugin/RedisCommandParser.swift

Lines changed: 610 additions & 75 deletions
Large diffs are not rendered by default.

Plugins/RedisDriverPlugin/RedisPlugin.swift

Lines changed: 80 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,44 +69,112 @@ final class RedisPlugin: NSObject, TableProPlugin, DriverPlugin {
6969

7070
static var statementCompletions: [CompletionEntry] {
7171
[
72+
// Key commands
7273
CompletionEntry(label: "GET", insertText: "GET"),
7374
CompletionEntry(label: "SET", insertText: "SET"),
7475
CompletionEntry(label: "DEL", insertText: "DEL"),
7576
CompletionEntry(label: "EXISTS", insertText: "EXISTS"),
7677
CompletionEntry(label: "KEYS", insertText: "KEYS"),
78+
CompletionEntry(label: "GETSET", insertText: "GETSET"),
79+
CompletionEntry(label: "GETDEL", insertText: "GETDEL"),
80+
CompletionEntry(label: "GETEX", insertText: "GETEX"),
81+
CompletionEntry(label: "MGET", insertText: "MGET"),
82+
CompletionEntry(label: "MSET", insertText: "MSET"),
83+
CompletionEntry(label: "INCR", insertText: "INCR"),
84+
CompletionEntry(label: "DECR", insertText: "DECR"),
85+
CompletionEntry(label: "INCRBY", insertText: "INCRBY"),
86+
CompletionEntry(label: "DECRBY", insertText: "DECRBY"),
87+
CompletionEntry(label: "INCRBYFLOAT", insertText: "INCRBYFLOAT"),
88+
CompletionEntry(label: "APPEND", insertText: "APPEND"),
89+
CompletionEntry(label: "EXPIRE", insertText: "EXPIRE"),
90+
CompletionEntry(label: "PEXPIRE", insertText: "PEXPIRE"),
91+
CompletionEntry(label: "EXPIREAT", insertText: "EXPIREAT"),
92+
CompletionEntry(label: "PEXPIREAT", insertText: "PEXPIREAT"),
93+
CompletionEntry(label: "TTL", insertText: "TTL"),
94+
CompletionEntry(label: "PTTL", insertText: "PTTL"),
95+
CompletionEntry(label: "PERSIST", insertText: "PERSIST"),
96+
CompletionEntry(label: "TYPE", insertText: "TYPE"),
97+
CompletionEntry(label: "RENAME", insertText: "RENAME"),
98+
CompletionEntry(label: "SCAN", insertText: "SCAN"),
99+
100+
// Hash commands
77101
CompletionEntry(label: "HGET", insertText: "HGET"),
78102
CompletionEntry(label: "HSET", insertText: "HSET"),
79103
CompletionEntry(label: "HGETALL", insertText: "HGETALL"),
80104
CompletionEntry(label: "HDEL", insertText: "HDEL"),
105+
CompletionEntry(label: "HSCAN", insertText: "HSCAN"),
106+
107+
// List commands
81108
CompletionEntry(label: "LPUSH", insertText: "LPUSH"),
82109
CompletionEntry(label: "RPUSH", insertText: "RPUSH"),
83110
CompletionEntry(label: "LRANGE", insertText: "LRANGE"),
84111
CompletionEntry(label: "LLEN", insertText: "LLEN"),
112+
CompletionEntry(label: "LPOP", insertText: "LPOP"),
113+
CompletionEntry(label: "RPOP", insertText: "RPOP"),
114+
CompletionEntry(label: "LSET", insertText: "LSET"),
115+
CompletionEntry(label: "LINSERT", insertText: "LINSERT"),
116+
CompletionEntry(label: "LREM", insertText: "LREM"),
117+
CompletionEntry(label: "LPOS", insertText: "LPOS"),
118+
CompletionEntry(label: "LMOVE", insertText: "LMOVE"),
119+
120+
// Set commands
85121
CompletionEntry(label: "SADD", insertText: "SADD"),
86122
CompletionEntry(label: "SMEMBERS", insertText: "SMEMBERS"),
87123
CompletionEntry(label: "SREM", insertText: "SREM"),
88124
CompletionEntry(label: "SCARD", insertText: "SCARD"),
125+
CompletionEntry(label: "SPOP", insertText: "SPOP"),
126+
CompletionEntry(label: "SRANDMEMBER", insertText: "SRANDMEMBER"),
127+
CompletionEntry(label: "SMOVE", insertText: "SMOVE"),
128+
CompletionEntry(label: "SUNION", insertText: "SUNION"),
129+
CompletionEntry(label: "SINTER", insertText: "SINTER"),
130+
CompletionEntry(label: "SDIFF", insertText: "SDIFF"),
131+
CompletionEntry(label: "SUNIONSTORE", insertText: "SUNIONSTORE"),
132+
CompletionEntry(label: "SINTERSTORE", insertText: "SINTERSTORE"),
133+
CompletionEntry(label: "SDIFFSTORE", insertText: "SDIFFSTORE"),
134+
CompletionEntry(label: "SSCAN", insertText: "SSCAN"),
135+
136+
// Sorted set commands
89137
CompletionEntry(label: "ZADD", insertText: "ZADD"),
90138
CompletionEntry(label: "ZRANGE", insertText: "ZRANGE"),
91139
CompletionEntry(label: "ZREM", insertText: "ZREM"),
140+
CompletionEntry(label: "ZCARD", insertText: "ZCARD"),
92141
CompletionEntry(label: "ZSCORE", insertText: "ZSCORE"),
93-
CompletionEntry(label: "EXPIRE", insertText: "EXPIRE"),
94-
CompletionEntry(label: "TTL", insertText: "TTL"),
95-
CompletionEntry(label: "PERSIST", insertText: "PERSIST"),
96-
CompletionEntry(label: "TYPE", insertText: "TYPE"),
97-
CompletionEntry(label: "SCAN", insertText: "SCAN"),
98-
CompletionEntry(label: "HSCAN", insertText: "HSCAN"),
99-
CompletionEntry(label: "SSCAN", insertText: "SSCAN"),
142+
CompletionEntry(label: "ZRANGEBYSCORE", insertText: "ZRANGEBYSCORE"),
143+
CompletionEntry(label: "ZREVRANGE", insertText: "ZREVRANGE"),
144+
CompletionEntry(label: "ZREVRANGEBYSCORE", insertText: "ZREVRANGEBYSCORE"),
145+
CompletionEntry(label: "ZINCRBY", insertText: "ZINCRBY"),
146+
CompletionEntry(label: "ZCOUNT", insertText: "ZCOUNT"),
147+
CompletionEntry(label: "ZRANK", insertText: "ZRANK"),
148+
CompletionEntry(label: "ZREVRANK", insertText: "ZREVRANK"),
149+
CompletionEntry(label: "ZPOPMIN", insertText: "ZPOPMIN"),
150+
CompletionEntry(label: "ZPOPMAX", insertText: "ZPOPMAX"),
100151
CompletionEntry(label: "ZSCAN", insertText: "ZSCAN"),
152+
153+
// Stream commands
154+
CompletionEntry(label: "XRANGE", insertText: "XRANGE"),
155+
CompletionEntry(label: "XREVRANGE", insertText: "XREVRANGE"),
156+
CompletionEntry(label: "XLEN", insertText: "XLEN"),
157+
CompletionEntry(label: "XADD", insertText: "XADD"),
158+
CompletionEntry(label: "XREAD", insertText: "XREAD"),
159+
CompletionEntry(label: "XDEL", insertText: "XDEL"),
160+
CompletionEntry(label: "XTRIM", insertText: "XTRIM"),
161+
CompletionEntry(label: "XINFO", insertText: "XINFO"),
162+
CompletionEntry(label: "XGROUP", insertText: "XGROUP"),
163+
CompletionEntry(label: "XACK", insertText: "XACK"),
164+
165+
// Server commands
166+
CompletionEntry(label: "PING", insertText: "PING"),
101167
CompletionEntry(label: "INFO", insertText: "INFO"),
102168
CompletionEntry(label: "DBSIZE", insertText: "DBSIZE"),
103169
CompletionEntry(label: "FLUSHDB", insertText: "FLUSHDB"),
170+
CompletionEntry(label: "FLUSHALL", insertText: "FLUSHALL"),
104171
CompletionEntry(label: "SELECT", insertText: "SELECT"),
105-
CompletionEntry(label: "INCR", insertText: "INCR"),
106-
CompletionEntry(label: "DECR", insertText: "DECR"),
107-
CompletionEntry(label: "APPEND", insertText: "APPEND"),
108-
CompletionEntry(label: "MGET", insertText: "MGET"),
109-
CompletionEntry(label: "MSET", insertText: "MSET")
172+
CompletionEntry(label: "CONFIG", insertText: "CONFIG"),
173+
CompletionEntry(label: "AUTH", insertText: "AUTH"),
174+
CompletionEntry(label: "OBJECT", insertText: "OBJECT"),
175+
CompletionEntry(label: "MULTI", insertText: "MULTI"),
176+
CompletionEntry(label: "EXEC", insertText: "EXEC"),
177+
CompletionEntry(label: "DISCARD", insertText: "DISCARD"),
110178
]
111179
}
112180

0 commit comments

Comments
 (0)