Major changes since last commit: - FiveSql2 SQL:1999 engine (10,458 LOC) — 43/43 ALL PASS - 21 compiler/runtime bugs fixed (short-circuit AND/OR, FOR LOOP, etc.) - @byref pass-by-reference via RefCell pattern - Mutable closure capture (EnsureLocalRef + RefCell sharing) - RTL: 400 → 479 functions (+79: file, string, datetime, hash, UTF-8) - DateTime/Timestamp fully working (hb_DateTime, hb_Hour/Min/Sec, display) - Reserved word guard (39 keywords blocked from function calls) - AEval arg order fix (element before index) - Closure capture redecl fix (unique _cap_ names per block) - Hash/string indexing in ArrayPush/ArrayPop - Harbour compat test suite: 51/51 - 4 docs: Porting Report, Implementation Plan, Optimization Plan, Commercialization Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
64 lines
2.0 KiB
Markdown
64 lines
2.0 KiB
Markdown
# FiveSql2 — SQL Engine for Harbour DBF/NTX/CDX
|
|
|
|
**Pratt parser + SQL:1992-2023 full standard support**
|
|
**Supports both NTX (Clipper) and CDX (FoxPro/ADS) indexes**
|
|
|
|
## Architecture
|
|
|
|
```
|
|
five_SQL("SELECT ...")
|
|
│
|
|
├── TSqlLexer Tokenizer
|
|
├── TSqlParser2 Pratt parser (data-driven operators)
|
|
├── TSqlExecutor Query executor (Volcano model)
|
|
│ ├── TSqlAlias Central alias manager (no collisions)
|
|
│ ├── TSqlIndex NTX/CDX index optimization (auto-detect)
|
|
│ ├── TSqlAgg GROUP BY / aggregation
|
|
│ ├── TSqlSort ORDER BY / DISTINCT
|
|
│ ├── TSqlDDL CREATE/DROP/ALTER TABLE/INDEX
|
|
│ └── TSqlTxn BEGIN/COMMIT/ROLLBACK
|
|
├── TSqlExpr AST nodes + expression evaluation
|
|
└── TSqlFunc 60+ scalar functions
|
|
```
|
|
|
|
## Build & Test
|
|
|
|
```bash
|
|
export PATH="/path/to/harbour-core/bin/linux/gcc:$PATH"
|
|
export HB_INSTALL_PREFIX="/path/to/harbour-core"
|
|
|
|
make # Build all tests
|
|
make test # Run all 157 tests
|
|
make bench # Parser benchmark
|
|
make clean # Clean
|
|
```
|
|
|
|
## SQL Standard Coverage
|
|
|
|
| Standard | Features | Tests |
|
|
|------------|----------|:-----:|
|
|
| SQL:1992 | SELECT, JOIN, GROUP BY, HAVING, Subquery, CASE, CAST | 43 |
|
|
| SQL:1999 | CTE, Recursive CTE, Window Functions, MERGE | 10 |
|
|
| SQL:2003 | SIMILAR TO, GROUPING SETS, LATERAL, Window frames | 64 |
|
|
| SQL:2008 | FETCH/OFFSET, FOR UPDATE, Extended MERGE | (incl.) |
|
|
| SQL:2016 | JSON functions, LISTAGG | (incl.) |
|
|
| SQL:2023 | ANY_VALUE, GREATEST/LEAST, BOOL_AND/OR | (incl.) |
|
|
| Challenge | LeetCode-level complex queries | 15 |
|
|
| Extreme | Production analytics stress tests | 15 |
|
|
|
|
## Adding New Operators
|
|
|
|
Edit `TSqlParser2.prg`, method `InitInfixTables()`:
|
|
|
|
```prg
|
|
::hInfixTT[ TK_MYOP ] := { "<=>", 40, 41, ND_BIN }
|
|
```
|
|
|
|
One line. No structural changes needed.
|
|
|
|
## Copyright
|
|
|
|
Copyright (c) 2025-2026 Charles KWON (Charles KWON OhJun)
|
|
Email: charleskwonohjun@gmail.com
|
|
All rights reserved.
|