SQL dialect, aggregates, window functions, joins, subqueries, and query APIs. Deep dives:
docs/sql/SQL_DIALECT_EXTENSIONS_v1.7.2.md·docs/internals/SUBQUERY_IMPLEMENTATION.md·docs/internals/JOIN_IMPLEMENTATION.md·docs/QUERY_PLAN_CACHE.md
| API | Allocates? | SQL support | Best for |
|---|---|---|---|
ExecuteQuery(sql, params) |
per-row Dictionary |
full | interactive/adhoc, dynamic columns |
⚡ ExecuteQueryStruct(sql, params) |
zero-alloc | full | hot read loops — the v2.0 fast path |
⚡ FindByPrimaryKey(table, key) / FindByIndex(table, col, value) |
per-row Dictionary |
— | Direct API: no SQL parsing, fastest point reads |
ExecuteSQL(sql) |
— | DML/DDL | writes |
Insert(table, row) / InsertBatch(table, rows) |
— | — | single-row / bulk writes (see Performance Guide) |
UpdateMultiple / DeleteMultiple |
— | — | bulk updates/deletes |
-- Point lookup with parameter
SELECT * FROM customers WHERE email = @email;
-- Range + sort using B-tree index
SELECT id, created, total
FROM orders
WHERE created >= @from AND created <= @to
ORDER BY created DESC
LIMIT 100;
-- IN list
SELECT * FROM customers WHERE id IN (10, 20, 30);
-- Aggregation
SELECT status, COUNT(*) AS n, SUM(total) AS sum, AVG(total) AS avg
FROM orders
GROUP BY status
ORDER BY n DESC;- Scalar aggregates: COUNT, SUM, AVG, MIN, MAX, STDDEV, VARIANCE, PERCENTILE_CONT/DISC,
MEDIAN, CORRELATION, COVAR, first/last, string aggregates (
GROUP_CONCAT), … - Window functions: ROW_NUMBER, RANK, DENSE_RANK, NTILE, LAG, LEAD, FIRST_VALUE,
LAST_VALUE, running SUM/AVG, frame clauses (
ROWS BETWEEN …)
SELECT id, status, total,
RANK() OVER (PARTITION BY status ORDER BY total DESC) AS rank_in_status,
LAG(total) OVER (PARTITION BY status ORDER BY created) AS prev_total,
SUM(total) OVER (PARTITION BY status) AS status_total
FROM orders;-- INNER / LEFT / RIGHT / FULL / CROSS
SELECT c.name, o.total
FROM customers c
LEFT JOIN orders o ON o.customer = c.id;
-- Derived table
SELECT * FROM (SELECT customer, SUM(total) s FROM orders GROUP BY customer) WHERE s > 100;
-- CTE
WITH RECURSIVE org(id, path) AS (
SELECT id, CAST(id AS TEXT) FROM employees WHERE manager IS NULL
UNION ALL
SELECT e.id, org.path || '>' || e.id FROM employees e JOIN org ON e.manager = org.id
)
SELECT * FROM org;SharpCoreDB adds engine-specific keywords:
| Extension | Meaning |
|---|---|
CREATE TABLE … STORAGE = COLUMNAR |
per-table columnar storage |
OPTIONALLY |
optional SQL option clauses (skips full parse on hot paths) |
RETURNING-style result helpers |
post-write row access |
_rowid, PRIMARY KEY AUTO |
hidden ULID row id + monotonic integer auto-increment |
COLLATE everywhere |
per-expression collation |
INSERT … ON CONFLICT DO NOTHING / DO UPDATE |
upsert |
See docs/sql/SQL_DIALECT_EXTENSIONS_v1.7.2.md.
- Every parsed SQL statement is cached in
QueryPlanCachekeyed by normalized SQL (parameters replaced). v2.0 added a regex-free normalizer and an allocation short-circuit. PreparedStatements—db.Prepare(sql)compiles once (returns aPreparedStatement);db.ExecutePrepared(stmt, params)anddb.ExecuteCompiledQuery(stmt, params)execute it many times. The recommended pattern for hot loops.- v2.0
SimpleSelectPlanperforms a zero-reparse SELECT fast path: simpleSELECT * FROM t WHERE key = @pplans are resolved from the cache without re-lexing.
⚡ Guidance: parameterize everything, reuse
IDatabaseinstances, and keep working-set statements under the cache size. Seedocs/QUERY_PLAN_CACHE.md.