fix: високо и средно приоритетни бъгове в query, protocol, storage, vector, fts
Поправени проблеми: - Wire protocol: bounds checking, max length limits, recursion depth limit - SQL injection: escape-ване на quotes в exprToSql string literals - ReDoS: escape-ване на regex metachars в LIKE/ILIKE - Stale BTree indexes: добавен BTree.remove() + изтриване при UPDATE/DELETE - SSL: quoteShell за всички shell команди с пътища - Boolean literals: parser вече разпознава tkTrue/tkFalse - Unary minus: lowerExpr map-ва ukNeg към irNeg (вместо irNot) - Non-aggregate UDFs: lowerExpr създава irekFuncCall вместо NULL literal - UTF-8 FTS: tokenize използва runes вместо байтове - HNSW: добавен Lock за thread-safe insert/search 292 теста, 0 failure-а.
This commit is contained in:
@@ -119,3 +119,31 @@ proc scan*[K, V](btree: BTreeIndex[K, V], startKey, endKey: K): seq[(K, seq[V])]
|
||||
node = node.next
|
||||
|
||||
proc len*[K, V](btree: BTreeIndex[K, V]): int = btree.size
|
||||
|
||||
proc remove*[K, V](btree: var BTreeIndex[K, V], key: K, value: V) =
|
||||
proc removeRec(node: BTreeNode[K, V]): bool =
|
||||
var i = 0
|
||||
while i < node.keys.len and key > node.keys[i]:
|
||||
inc i
|
||||
if node.isLeaf:
|
||||
if i < node.keys.len and key == node.keys[i]:
|
||||
var vals = node.values[i]
|
||||
var idx = -1
|
||||
for j in 0..<vals.len:
|
||||
if vals[j] == value:
|
||||
idx = j
|
||||
break
|
||||
if idx >= 0:
|
||||
vals.del(idx)
|
||||
if vals.len == 0:
|
||||
node.keys.del(i)
|
||||
node.values.del(i)
|
||||
else:
|
||||
node.values[i] = vals
|
||||
return true
|
||||
return false
|
||||
else:
|
||||
return removeRec(node.children[i])
|
||||
|
||||
if removeRec(btree.root):
|
||||
dec btree.size
|
||||
|
||||
Reference in New Issue
Block a user