sql5 4.1.0

SQLite compatible database with CJK FTS5 full-text search and vector similarity
Documentation
# sql5 v1.15 版本說明(已完成)

## 版本資訊
- **版本**:1.15
- **日期**:2026-05-04
- **名稱**:GLOB/LIKE 修復 + Table::scan() 支援任意 key type

## 問題根因

v1.14 時期的 GLOB bug 描述为「解析完成,執行有 TEXT 儲存 bug」,但實際測試發現問題更深:

**`Table::scan()` 硬編碼使用 `Key::Integer(i64::MIN/max)` 範圍**(`src/table/table.rs:80-88`),
導致 **所有非 INTEGER 主鍵的表**(如 TEXT 主鍵)都無法被掃描,SELECT * 返回 0 rows,
間接導致 LIKE/GLOB 看起來失效。

- LIKE/GLOB 本身 ✅ 正常運作
- `SELECT * FROM t`(TEXT 主鍵) ❌ 0 rows
- `SELECT * FROM t WHERE name LIKE '%hello%'` → 0 rows(因為根本掃不到資料)

## 修復內容

### 1. `BTree::scan_all()``src/btree/tree.rs` 新增)

遍歷所有 leaf 節點,不回受限於 key 類型:

```rust
pub fn scan_all(&mut self) -> Vec<Record> {
    if self.size == 0 { return Vec::new(); }
    let mut results = Vec::with_capacity(self.size);
    let mut idx = self.first_leaf();
    loop {
        let leaf = self.storage.read_node(idx);
        for record in leaf.records {
            results.push(record);
        }
        match leaf.next_leaf {
            Some(n) => idx = n,
            None => break,
        }
    }
    results
}

fn first_leaf(&mut self) -> usize {
    let mut idx = self.root;
    loop {
        let node = self.storage.read_node(idx);
        if node.is_leaf() { return idx; }
        idx = node.children[0];
    }
}
```

### 2. `Table::scan()``src/table/table.rs` 修改)

```rust
// 修復前(只支援 INTEGER key)
pub fn scan(&mut self) -> Vec<Row> {
    let min_key = Key::Integer(i64::MIN);
    let max_key = Key::Integer(i64::MAX);
    self.tree.range_search(&min_key, &max_key)
        .into_iter()
        .map(|record| serialize::deserialize(&self.schema, &record.value))
        .collect()
}

// 修復後(支援任意 key type)
pub fn scan(&mut self) -> Vec<Row> {
    self.tree.scan_all()
        .into_iter()
        .map(|record| serialize::deserialize(&self.schema, &record.value))
        .collect()
}
```

## 測試結果

- `cargo test` → 205 passed ✅
- `./test.sh` → 113 passed, 0 failed ✅
- TEXT 主键表:`SELECT * FROM t` → 正常返回所有行
- LIKE:`SELECT * FROM t WHERE name LIKE '%ello%'` → 正常過濾
- GLOB:`SELECT * FROM t WHERE name GLOB '*test*'` → 正常過濾

## 使用方式

```sql
-- TEXT 主键表现已完全支援
CREATE TABLE t (name TEXT PRIMARY KEY);
INSERT INTO t VALUES ('hello');
INSERT INTO t VALUES ('world');
SELECT * FROM t;                              -- ✅ 正常返回 2 行
SELECT * FROM t WHERE name LIKE '%ello%';      -- ✅ 返回 'hello'
SELECT * FROM t WHERE name GLOB '*test*';     -- ✅ 返回 0 行(無匹配)

-- INTEGER 主键表现同样正常工作
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO users VALUES (1, 'Alice');
SELECT * FROM users WHERE name LIKE 'A%';    -- ✅ 正常返回
```

## 對應 SQLite 相容性

| SQLite 功能 | sql5 v1.15 狀態 |
|------------|---------------|
| DDL (CREATE/DROP TABLE) | ✅ 完成 |
| DML (INSERT/UPDATE/DELETE) | ✅ 完成 |
| SELECT with WHERE, JOIN | ✅ 完成 |
| Aggregate | ✅ 完成 |
| Transactions | ✅ 完成 |
| AUTOINCREMENT | ✅ 完成 |
| FOREIGN KEY | ✅ 完成 |
| FTS5 (CJK) | ✅ 完成 |
| INDEX, PRAGMA, ALTER | ✅ 完成 (v1.3) |
| WAL Mode | ✅ 完成 (v1.4) |
| VIEW | ✅ 完成 (v1.5) |
| sqlite_master | ✅ 完成 (v1.6) |
| UNION, 子查詢 | ✅ 完成 (v1.7) |
| CHECK 約束 | ✅ 完成 (v1.8) |
| GROUP BY, ORDER BY | ✅ 完成 (v1.10) |
| 函式, CAST | ✅ 完成 (v1.11) |
| LIMIT/OFFSET, MIN/MAX/AVG | ✅ 完成 (v1.12) |
| DEFAULT VALUES | ✅ 完成 (v1.13) |
| LIMIT n,m | ✅ 完成 (v1.14) |
| CROSS JOIN | ✅ 完成 (v1.14) |
| NATURAL JOIN | ✅ 完成 (v1.14) |
| **LIKE** | ✅ 完成 (v1.15) |
| **GLOB** | ✅ 完成 (v1.15) |
| TRIGGERs | ❌ 待支援 |
| ATTACH | ❌ 待支援 |
| VACUUM | ❌ 待支援 |

## 下一步工作
- TRIGGERs 支援
- ATTACH 支援(多資料庫)
- VACUUM 支援