Skip to content

Releases: KarpelesLab/graphitesql

v0.1.3

Choose a tag to compare

@MagicalTux MagicalTux released this 16 Jul 05:20
15d316d

Fixed

  • (btree) honor reserved page bytes so pages aren't written into the reserved region
  • (btree) rebalance sibling pages on split so non-sequential inserts don't fragment
  • (fts5) detail=none/column delete and update write byte-identical tombstone segments
  • (fts5) honor detail=none/detail=column in the segment writer
  • (fts5) byte-identical prefix double-cascade merge

Refactor

  • (api) mark low-level implementation modules #[doc(hidden)]

v0.1.2

Choose a tag to compare

@MagicalTux MagicalTux released this 15 Jul 12:28
9ad4f35

Added

  • (fts5) byte-identical prefix-index spanning segments from incremental merge

Fixed

  • (exec) foreign-key actions involving WITHOUT ROWID tables (were rowid-only)
  • (cli) skip SQL comments when splitting statements so a comment can't swallow a transaction
  • (fts5) prefix double-cascade crisis merge no longer writes a malformed file
  • (cli) run a trailing dot-command argument instead of parsing it as SQL
  • (exec) compact child tables after a cascading delete so it can't leave empty leaves
  • (cli) don't cut a multi-line CREATE TRIGGER at the first ; in its body
  • (exec) compact table b-tree after INSERT OR REPLACE so it can't leave empty leaves

v0.1.1

Choose a tag to compare

@MagicalTux MagicalTux released this 15 Jul 10:23
ef23316

Added

  • (fts5) byte-identical spanning (doclist-index) segments from incremental merge
  • (fts5) byte-identical savepoint and prefix-index writes inside transactions
  • (fts5) integrity_check detects a malformed inverted index
  • (fts5) byte-identical delete/update and out-of-order writes inside transactions
  • (fts5) incremental writes inside explicit transactions
  • (fts5) implement automerge incremental merge scheduling
  • (fts5) incremental prefix-index writes (D2e-3 prefix half)
  • (vdbe) run a join DISTINCT with explicit COLLATE on the VDBE (B7b)
  • (vdbe) run a plain-scan DISTINCT with explicit COLLATE on the VDBE (B7b)
  • (vdbe) run a constant GROUP BY aggregate query on the VDBE (B7b)
  • (vdbe) run a bare-aggregate HAVING on the VDBE (B7b)
  • (vdbe) run main.-qualified sources on the VDBE (B7b)
  • (vdbe) run a NOT INDEXED single-table SELECT on the VDBE (B5b-2)
  • (vdbe) live-scan WITHOUT ROWID tables on the VDBE (B5b-2)
  • (value) non-UTF-8 text — || / CAST(blob AS TEXT) yield byte-backed text
  • (vdbe) run an explicit-COLLATE aggregate argument on the VDBE
  • (vdbe) run a GROUP BY on an explicit-COLLATE key on the VDBE
  • (vdbe) collation-aware bare-aggregate fold (min/max, count DISTINCT)
  • (vdbe) collation-aware aggregate fold (min/max, count DISTINCT) in a grouped query
  • (vdbe) run a collation-aware GROUP BY on the VDBE
  • (vdbe) extend collation-aware DISTINCT to the nested-loop join path
  • (vdbe) run a collation-aware single-table DISTINCT on the VDBE
  • (cli) [breaking] exact caret for a repeated function-name arity/unknown error
  • (planner) skip sort for a full UNIQUE-index equality (matches one row)
  • (planner) skip sort for inner-rowid ORDER BY over a single-col join-seek index
  • (planner) credit inner-rowid ORDER BY when the inner has an unrelated index
  • (capi) sqlite3_error_offset (D7)
  • (cli) exact caret for a repeated syntax token via a parser byte offset
  • (planner) skip sort for an inner-rowid ORDER BY over a 1-row-driver join
  • (planner) skip the sort for an all-constant ORDER BY over a 1-row-driver join
  • (planner) drop constant ORDER BY terms on a plain scan too (B9h)
  • (planner) drop equality-constant leading ORDER BY terms (B9h)
  • (planner) a rowid=const driver seek beats the index-inner swap (B1b)
  • (planner) seek a join driver by a single-column secondary index (B1b)
  • (planner) seek a join driver by its own rowid equality (B1b)
  • (vdbe) run the N-table plain-projection join reorder on the VDBE (B1b)
  • (vdbe) run order-independent aggregate joins under a cost swap (B1b)
  • (vdbe) run the single-column-unique index-inner swap on the VDBE (B1b)
  • (vdbe) run the two-table rowid-inner swap on the VDBE (B1b)
  • (cli) window long error lines like the sqlite shell
  • (cli) sqlite-style "near line N" errors in script/piped mode
  • (tvf) drive a bare generate_series from its WHERE clause
  • (planner) walk the ORDER-BY index for a single open-ended range (B9h)
  • (planner) credit a collation seek's ORDER BY (completes B9j)
  • (planner) collation-aware range index selection (B9j WHERE range slice)
  • (planner) collation-aware equality index selection (B9j WHERE slice)
  • (planner) match ORDER BY term collation to the index in order_index_scan (B9j)
  • (planner) walk the ORDER-BY index to avoid a sort when WHERE is not seekable (B9h)
  • (vdbe) seek-drive a two-table FULL join via a compound rewrite (B1c)
  • (vdbe) seek-drive a SELECT * two-table RIGHT join too (B1c)
  • (vdbe) seek-drive a two-table RIGHT join via a LEFT-join rewrite (B1c)
  • statement-level authorizer (sqlite3_set_authorizer)
  • online backup API (sqlite3_backup_*) via Connection::restore_from
  • commit and rollback hooks (sqlite3_commit_hook / sqlite3_rollback_hook)
  • (vdbe) run json_group_object / jsonb_group_object on the VDBE aggregate path
  • (vdbe) run json_group_array / jsonb_group_array on the VDBE aggregate path
  • (vdbe) run a group-key-correlated subquery in HAVING / ORDER BY (B5c-2)
  • (vdbe) run a group-key-correlated subquery over a GROUP BY join (B5c-2)
  • (vdbe) run a correlated IN (SELECT) on the VDBE (B5c-2)
  • (vdbe) run correlated subqueries over materialized single sources (B5c-2)
  • (vdbe) run a group-key-correlated subquery in a GROUP BY projection (B5c-2)
  • (vdbe) correlated subqueries over outer/NATURAL/USING joins (B5c-2)
  • (vdbe) correlated subqueries over inner joins on the VDBE (B5c-2)
  • (vdbe) correlated subqueries on the VDBE with compile-time validation (B5c-2)
  • (vdbe) fold a constant-function LIMIT/OFFSET onto the VDBE (B-limit-fold)
  • (capi) sqlite3_complete + sqlite3_stmt_readonly
  • (capi) incremental BLOB I/O (sqlite3_blob_open/read/write/reopen/close)
  • (capi) sqlite3_update_hook
  • (exec) data-change notification hook (register_update_hook)
  • (capi) UTF-16 entry points (open16/prepare16_v2/bind_text16/column_text16/errmsg16)
  • (capi) sqlite3_create_window_function
  • (exec) allow a user-registered aggregate as a window function
  • (capi) sqlite3_create_collation for custom collating sequences
  • (collation) user-registered custom collating sequences
  • (capi) prepare_v3, autocommit/total_changes, sql/db_handle, errstr (D7)
  • (capi) aggregate user-defined functions via xStep/xFinal (D7)
  • (capi) scalar user-defined functions via sqlite3_create_function (D7)
  • (capi) named/numbered bind parameters + data_count (D7)
  • (capi) route INSERT/UPDATE/DELETE … RETURNING through the row path (D7)
  • (capi) libsqlite3-compatible C ABI in the graphitesql-capi sibling crate (D7)
  • (wasm) browser bindings + OPFS VFS in the graphitesql-wasm sibling crate (D6)
  • (cli) render one-shot errors in the sqlite3 shell's format (CLI-2)
  • (join) support lateral (correlated) table-valued functions
  • [breaking] honour the schema qualifier on introspection PRAGMAs
  • [breaking] table_info reproduces a column DEFAULT's verbatim source text
  • (vfs) autocommit reads take a transient cross-process shared lock (C9b-3)
  • (alter) reject a RENAME COLUMN that breaks a dependent trigger body
  • (alter) reject and roll back a RENAME COLUMN that breaks a dependent view
  • span-precise RENAME COLUMN rewrite closes the alias-collision + source-named-old gaps
  • (cli) .echo on echoes dot-command input lines too (CLI-3)
  • (cli) exit non-zero on any error in a non-interactive batch (CLI-2 part)
  • propagate RENAME COLUMN through derived-table (FROM subquery) sources (A-alter-1)
  • (cli) .bail on — stop the batch at the first error (CLI-1)
  • OS-level cross-process file locks in the std VFS (C9b-1, C9b-2)
  • resolve CTE-column provenance so a CTE consumed in a compound arm rewrites
  • propagate RENAME COLUMN through a compound view's ORDER BY
  • propagate RENAME COLUMN into WITH (CTE) view and trigger bodies
  • propagate RENAME COLUMN into compound (UNION/INTERSECT/EXCEPT) view bodies
  • extend RENAME COLUMN mixed-scope span rewrite to trigger bodies
  • [breaking] rewrite RENAME COLUMN mixed-scope view bodies via Expr::Column spans
  • (cli) control-char escaping in the width-aligned display modes
  • (cli) escape control characters in list/tabs output like sqlite
  • (cli) add .show
  • (exec) expose is_autocommit() (sqlite3_get_autocommit)
  • (exec) expose last_insert_rowid()/changes()/total_changes()
  • (exec) add Connection::deserialize (sqlite3_deserialize)
  • (exec) add Connection::serialize() and the shell's .backup/.save
  • (cli) add .mode tcl (completes the .mode family)
  • (cli) add .mode ascii and .mode html
  • (cli) add .mode markdown/box/table and .print
  • (session) changeset rebase (D5)
  • (session) indirect changes and FK-action recording (D5)
  • (session) per-table attach via Session::attach_table (D5)
  • (session) custom conflict handlers for changeset apply (D5)
  • (fts5) tombstone-reconciling crisis merge on DELETE
  • (pager) shared wal-index for multi-connection WAL readers
  • (session) patchset generation
  • (session) changeset invert and concat
  • (session) composite / WITHOUT ROWID / non-integer primary keys
  • (session) apply a changeset
  • (session) byte-compatible changeset generation
  • (fts5) incremental DELETE/UPDATE via tombstone segments
  • (fts5) incremental multi-segment writes + automerge
  • (vdbe) run correlated subqueries on the VDBE
  • (pager) coherent read cache for read-only connections
  • (vdbe) live storage cursor for single-table scans
  • (planner) cost-based join order via a bounded path solver
  • (exec) acquire the C9a read lock at first read in a transaction
  • (planner) stat4 range selectivity via whereRangeScanEst
  • (pager) persistent read locks so readers block a writer across a read txn
  • (planner) full-scan low-selectivity predicates via stat estimates
  • (planner) use sqlite_stat4 samples for equality selectivity
  • (analyze) generate byte-compatible sqlite_stat4
  • (cli) add .mode/.output/.once/.import and more shell dot-commands
  • (vtab) writable sqlite_dbpage (UPDATE + delete rejection)

Documentation

  • mark D2e-2 FTS5 in-transaction incremental DONE (f009693)
  • mark the delete-heavy FTS5 malformed-file bug FIXED (369d8bf)
  • mark D2e-1 automerge DONE + record the delete-heavy malformed-file bug
  • definitively resolve dbpage-2 INSERT-grow via oracle + source
  • pinpoint the automerge trigger (FTS5_WORK_UNIT=64) for D2e-1
  • root-cause the FTS5 delete/scale divergence as missing automerge
  • characterize D2e-1 divergence as a data-sensitive cascade, deprioritize
  • correct D2e-1 — the observed delete-crisis divergence is not the higher-populated case
  • pin the exact D2e-1 delete-crisis target and its scope
  • update roadmap summary for the D2e-3 prefix and B9h min/max wins
  • (fts5) record that the spanning-dlidx incremental append is byte-identical
  • record why FTS5 D2e-2 (in-txn incremental) is a subsystem port
  • record that the VDBE interpreter-seek item is behaviourally redundant
  • correct ROADMAP — D6 w...
Read more

v0.1.0

Choose a tag to compare

@MagicalTux MagicalTux released this 08 Jul 08:10
e3b5f8c

Added

  • (storage) store whole-number reals in REAL columns as int serials
  • (exec) UPDATE … FROM on WITHOUT ROWID tables + fix source-column stripping
  • (exec) support UPSERT and RETURNING on WITHOUT ROWID tables
  • (cli) implement the .read shell command
  • (cli) implement the .databases shell command
  • (cli) .tables/.indexes use sqlite's columnar list layout

Fixed

  • (json) decode backslash escapes in a quoted JSON path key
  • (exec) keep an AFTER UPDATE trigger's edit to a later row
  • (exec) reject unknown columns in a FROM-less SELECT at prepare time
  • (exec) compensated (Kahan) summation for sum/avg/total
  • (func) quote() truncates a text value at an embedded NUL
  • (exec) break compound ORDER BY ties on the remaining columns
  • (exec) auto rowid after a negative explicit rowid is max+1, not 1
  • (exec) BEFORE INSERT trigger sees rowid -1 for an auto row
  • (exec) targeted UPSERT updates the named conflict's row
  • (exec) reject illegal overrides of a base window's clauses
  • (exec) printf ! flag renders through the sqlite3FpDecode port

v0.0.16

Choose a tag to compare

@MagicalTux MagicalTux released this 08 Jul 01:39
61626a0

Added

  • (cli) .schema matches sqlite's printSchemaLine quirks
  • (cli) implement the .dump shell command
  • (datetime) accept a bare HH:MM[:SS] time-shift modifier
  • (exec) live-seek a joined table by a UNIQUE secondary index (B5b-2)
  • (planner) render USING COVERING INDEX for a covering join seek
  • (exec) thread the join rowid through the cost-based reorders
  • (exec) resolve a table-qualified rowid across a join
  • (geopoly) the geopoly virtual table (R-Tree-backed spatial index)
  • (geopoly) the geopoly scalar geometry functions and group_bbox
  • (fts5) accept the full set of maintenance/config commands
  • (exec) reject an aggregate/windowed recursive CTE term like sqlite
  • (exec) honour a recursive CTE's ORDER BY as a priority work-queue
  • (fts5) the rank config command and unrecognized-option rejection
  • (fts5) direct DML and the 'delete' command for external/contentless tables
  • (fts5) external-content tables (content=, content_rowid=)
  • (fts5) support the braced {col ...}: column-set MATCH filter
  • (planner) cost-based join order for three or more tables
  • (planner) match sqlite's DISTINCT/GROUP BY/ORDER BY plan nodes over joins
  • (planner) scan a join table via a covering index
  • (planner) drive a two-table join from the secondary-index-seek-inner side
  • (planner) drive a two-table join from the rowid-seek-inner side
  • (planner) choose the best ORDER BY index, not the first
  • (planner) pick a covering index for GROUP BY / DISTINCT among several
  • (planner) elide ORDER BY when the chosen seek index supplies the order
  • (planner) prefer a covering index for range-leading seeks
  • (planner) prefer a covering index for secondary-index seeks
  • (btree) honor DESC in UNIQUE and rowid-table primary-key auto-indexes
  • (btree) honor DESC primary key on WITHOUT ROWID tables
  • (btree) honor DESC index column order (byte-compatible)

Documentation

  • record window ORDER BY NULLS fix and windowed-sum type-tag residual
  • record math numeric-type/atan fixes and huge-arg trig residual
  • record the geopoly extension in ROADMAP Track D
  • record the min/max multi-index covering-EQP deferral

Fixed

  • (exec) read an integer-serialized REAL-column value back as a real
  • (json) json_tree root key/path follows sqlite's jsonEachPathLength
  • (exec) quote() renders a real at round-trip precision (port sqlite3FpDecode)
  • (datetime) utc/localtime modifier normalizes out-of-range fields
  • (exec) zeroblob(NULL) and printf %c of an empty string match sqlite
  • (exec) coerce integer function arguments like sqlite3_value_int64
  • (exec) COLLATE must not change comparison affinity
  • (exec) count(*) via an index honors LIMIT and OFFSET
  • (parser) reject a column after a table constraint and an empty trigger body
  • (fk) ON UPDATE SET DEFAULT re-checks against the post-update parents
  • (fk) delete the parent row before enforcing its ON DELETE actions
  • (fk) resolve a UNIQUE/PK conflict before the INSERT foreign-key check
  • (fk) ON … SET DEFAULT re-validates the default references a parent
  • (trigger) a BEFORE UPDATE trigger's changes to the updated row persist
  • (trigger) RAISE(IGNORE) in an AFTER trigger no longer skips later rows
  • (vdbe) GROUP BY key follows the single min/max row like other bare columns
  • (datetime) numeric Julian-Day argument with modifiers and out-of-range guard
  • (func) printf precision handling for %c, %q/%Q/%w, %#e, and huge floats
  • (func) replace() with an empty pattern ignores a NULL replacement
  • (eval) bit shift by a negative amount is an arithmetic shift the other way
  • (window) honor NULLS FIRST/LAST in a window ORDER BY
  • (float) atan of a very large argument returns ±π/2, not 0
  • (func) math functions NULL non-numeric arguments
  • (func) ceil/floor/trunc preserve integer type and NULL non-numerics
  • (exec) carry the outer column's affinity into a correlated comparison
  • (exec) decline an affinity-unsound index join seek (wrong results)
  • (fts5) name shadow tables with sqlite's single-quoted form
  • (exec) match sqlite's shadow-table schema (no space after commas)
  • (exec) give CREATE TABLE AS SELECT columns their inherited types
  • (vdbe) apply collation to an ordered aggregate's ORDER BY
  • (vdbe) resolve ORDER BY names to result aliases before base columns
  • (exec) honour explicit/inherited collation on ORDER BY terms
  • (fts5) match sqlite's bm25 score exactly (corpus-statistic correction)
  • (window) apply ORDER BY when a window's base table has an index
  • (vdbe) return index order for an equality prefix on a composite index

v0.0.15

Choose a tag to compare

@MagicalTux MagicalTux released this 06 Jul 21:48
4211ec3

Added

  • (eqp) render the FOR IN-OPERATOR node for an indexed IN-subquery
  • (vdbe) seek an N-table left-deep chain of ipk joins with live cursors (B5b-2d)
  • (vdbe) seek an INNER/LEFT rowid-join with a compound ON clause (B5b-2c)
  • (vdbe) seek the inner side of a LEFT rowid-join with a live cursor (B5b-2b)
  • (vdbe) seek the inner side of an INNER rowid-join with a live cursor (B5b-2a)
  • (alter) scope-aware RENAME COLUMN in multi-table view/trigger bodies (A-rn3-edge)
  • (eqp) render the SEARCH + LIST SUBQUERY for a seekable IN (SELECT) (B9a-seek)
  • (eqp) emit the GROUP BY/DISTINCT temp-b-tree over a rowid range seek (B9d subset)
  • (eqp) flatten a bare-LIMIT derived/CTE body under a narrower projection or single-term ORDER BY (B9c-flatten)
  • (eqp) render LIST SUBQUERY + BLOOM FILTER for a non-correlated IN (SELECT) (B9a)
  • (planner) seek col = (non-correlated scalar subquery) (B9e)

Documentation

  • defer B9b (window-function EQP) by design after investigation
  • trim completed B9 items from the roadmap
  • re-scope B9i (covering-scan row order) into B9h after investigation

Fixed

  • (exec) eagerly validate window function args, FILTER and WHERE too
  • (exec) eagerly reject a bad column in a window OVER PARTITION BY / ORDER BY
  • (exec) eagerly reject a bad column on the LHS of an IN (SELECT)
  • (exec) eagerly reject a bad column in a multi-row VALUES IN-list

Performance

  • (planner) read a covering index for a no-seek WHERE scan
  • (planner) port SQLite's covering-scan width cost model (B9h slice)

v0.0.14

Choose a tag to compare

@MagicalTux MagicalTux released this 03 Jul 12:27
79118bd

Added

  • (planner) seek a fixed-prefix GLOB range on a BINARY index (B9f)
  • (eqp) render a non-flattenable LIMIT/OFFSET derived/CTE body as a CO-ROUTINE (B9c)
  • (planner) seek a trailing rowid range via a rowid/oid alias too (B9g)
  • (planner) seek a trailing rowid range after an index equality prefix (B9g)
  • (planner) seek a parenthesized column like the bare column
  • (eqp) honor the NOT INDEXED hint in EXPLAIN QUERY PLAN
  • (eqp) flatten a bare-LIMIT derived/CTE body under a pure-wildcard outer in EXPLAIN QUERY PLAN
  • (planner) seek col IS like an equality
  • (eqp) render a DISTINCT derived/CTE/view body as a CO-ROUTINE in EXPLAIN QUERY PLAN
  • (eqp) render an aggregate derived/CTE/view body as a CO-ROUTINE in EXPLAIN QUERY PLAN
  • (eqp) render a FROM-less scalar subquery in EXPLAIN QUERY PLAN
  • (eqp) render a scalar node for a row-value UPDATE SET subquery in EXPLAIN QUERY PLAN
  • (eqp) render a scalar subquery node for single-row INSERT VALUES in EXPLAIN QUERY PLAN
  • (eqp) render a scalar subquery node for UPDATE/DELETE in EXPLAIN QUERY PLAN
  • (eqp) flatten an aliased derived/CTE projection and validate outer refs in EXPLAIN QUERY PLAN
  • (eqp) flatten a source-alias-qualified derived/CTE projection in EXPLAIN QUERY PLAN
  • (eqp) flatten a narrower derived/CTE projection in EXPLAIN QUERY PLAN
  • (eqp) flatten a derived/CTE source through an outer WHERE
  • (eqp) serve a redundant NULLS ORDER BY from the index without a sorter
  • (eqp) render partial-cover ORDER BY on a compound MERGE plan
  • (eqp) resolve named ORDER BY terms in the compound MERGE plan
  • (eqp) render MERGE plan for a top-level compound with ORDER BY
  • (eqp) render a compound CTE/derived body as CO-ROUTINE over COMPOUND QUERY
  • (eqp) honor a MATERIALIZED CTE hint with a MATERIALIZE node
  • (eqp) render a multi-row VALUES CTE body as a CO-ROUTINE with SCAN N CONSTANT ROWS
  • (eqp) render a multi-row VALUES clause in FROM as a SCAN/SEARCH N-ROW VALUES CLAUSE node
  • (eqp) fold a multi-row VALUES clause into a single SCAN N-ROW VALUES CLAUSE node
  • (eqp) render outer ORDER BY/GROUP BY/DISTINCT temp-b-tree node for a recursive CTE
  • (eqp) render CO-ROUTINE plan for a recursive CTE
  • (eqp) render SCALAR SUBQUERY for a GROUP BY projection subquery
  • (planner) seek a comma join on an unqualified equi-predicate
  • (eqp) render SCALAR SUBQUERY for an ORDER BY scalar subquery
  • (eqp) render SCALAR SUBQUERY N for a scalar subquery in the projection
  • (eqp) render SCALAR SUBQUERY N for a non-correlated scalar WHERE subquery
  • (planner) elide the sorter for a WITHOUT ROWID filtered full-scan's order
  • (planner) elide the sorter for a WITHOUT ROWID PK-seek's ordered output
  • (planner) elide the sorter for a WITHOUT ROWID PK-ordered scan
  • (eqp) elide the ORDER BY sorter for an ordinal over SELECT *
  • (eqp) elide the ORDER BY sorter for an ordinal/alias over an index-ordered scan
  • (eqp) fold an ORDER BY into the GROUP BY / DISTINCT b-tree by ordinal or alias
  • (eqp) drop the ORDER BY sorter for a single-row bare aggregate
  • (eqp) place distinct-aggregate temp-b-trees after the GROUP BY sorter
  • (eqp) emit USE TEMP B-TREE FOR (DISTINCT) for distinct aggregates
  • (eqp) generalize the min/max SEARCH optimization

Documentation

  • plan the remaining EQP-fidelity & access-path tracks (B9a–B9j)

Fixed

  • (planner) apply the COLLATE-mismatch seek check to range bounds too
  • (planner) don't index-seek an equality whose COLLATE differs from the column
  • (eqp) render a view source in EXPLAIN QUERY PLAN instead of crashing
  • (eqp) render SEARCH for a min/max outer over a recursive CTE
  • (exec) stop recursive-CTE column-origin resolution from overflowing
  • (eqp) range-check positional GROUP BY / ORDER BY terms on the plan path

v0.0.13

Choose a tag to compare

@MagicalTux MagicalTux released this 30 Jun 00:34
18c17c9

Added

  • (eqp) render WITHOUT ROWID min/max as SEARCH USING PRIMARY KEY
  • (eqp) render the min/max optimization as SEARCH
  • (planner) elide ORDER BY for single-value-pinned WHERE seeks
  • (planner) seek a WITHOUT ROWID secondary index for col IS NULL
  • (planner) seek the index for a col IS NULL constraint
  • (eqp) label aggregate-only seeks USING COVERING INDEX
  • (eqp) name aliased tables by alias and tag LEFT-JOIN inner side
  • (eqp) elide ORDER BY temp b-tree for a rowid IN-list seek (B-planner slice 12)
  • (eqp) seek the WITHOUT ROWID PRIMARY KEY for an IN-list / OR-chain
  • (eqp) collapse a same-column equality OR-chain to one index seek
  • (eqp) collapse a rowid-equality OR-chain to a single rowid seek
  • (eqp) plan a rowid-pinning DISTINCT as the no-op it is
  • (eqp) plain-scan a rowid GROUP BY and skip its redundant sort (B5b-1)
  • (eqp) elide equality-pinned ORDER BY terms on the seek path (B5b-1)
  • (eqp) serve a trailing rowid from a WHERE-seek index walk
  • (eqp) credit a named UNIQUE index for the trailing-rowid ORDER BY walk
  • (eqp) serve a trailing rowid term from the secondary-index walk
  • (eqp) skip the sort when ORDER BY leads with the rowid/IPK
  • (eqp) fold ORDER BY into the GROUP BY/DISTINCT temp b-tree
  • (eqp) emit USE TEMP B-TREE FOR GROUP BY / DISTINCT on a plain scan
  • (eqp) walk an index whose columns are a prefix of a longer ORDER BY
  • (eqp) render the COMPOUND QUERY tree for UNION/INTERSECT/EXCEPT
  • (eqp) render EXPLAIN QUERY PLAN over a CTE source
  • (eqp) flatten a wildcard derived table into the base-table scan
  • (vdbe) run an uncorrelated FROM-less EXISTS subquery inline (B5b-1)
  • (vdbe) run an uncorrelated FROM-less scalar subquery inline (B5b-1)
  • (vdbe) run a no-op ORDER BY over a FROM-less SELECT on the VDBE
  • (json) drive bare json_each/json_tree from WHERE json constraints
  • (pragma) drive bare pragma TVFs from WHERE arg constraints
  • (vdbe) run a FROM-less SELECT with LIMIT/OFFSET/DISTINCT on the VDBE
  • (vdbe) run a FROM-less SELECT with a WHERE clause on the VDBE
  • (vdbe) run more pure scalar functions on the VDBE
  • (vdbe) run the date/time scalar functions on the VDBE
  • (alter) reject DROP COLUMN that breaks a dependent view or trigger
  • (alter) propagate RENAME COLUMN into same-table qualified self-refs
  • (alter) detect UPDATE…FROM subquery trigger bodies on RENAME TABLE
  • (alter) propagate RENAME COLUMN into cross-object trigger bodies (A-rn3)
  • (alter) propagate RENAME COLUMN into a view's nested cross-source subquery
  • (exec) reject unknown/wrong-arity functions in expression-position subqueries
  • (exec) reject unknown columns over a NATURAL/USING join at prepare time
  • (exec) reject unknown columns over a derived-table join at prepare time
  • (vdbe) run a window over a NATURAL/USING join on the VDBE (B5c-4)
  • (vdbe) run a window function over a join containing a derived subquery
  • (vdbe) run SELECT */window over joins sharing a column or holding a view/TVF
  • (vdbe) run a window-function SELECT over a TVF source on the VDBE (B5b-1)
  • (vdbe) run a window-function SELECT over a view source on the VDBE (B5b-1)
  • (vdbe) run a view named directly as a FROM source on the VDBE (B5b-1)
  • (vdbe) resolve a view source's column affinity, fixing a derived-over-view divergence (B5b-1)
  • (vdbe) run a derived table whose body is a same-affinity compound on the VDBE (B5b-1)
  • (vdbe) run a derived table whose body is a plain join on the VDBE (B5b-1)
  • (vdbe) run a constant-argument table-valued function in a join on the VDBE (B5b-1)
  • (vdbe) run json_each/json_tree FROM sources on the VDBE (B5b-1)
  • (vdbe) run a single table-valued-function FROM source on the VDBE (B5b-1)
  • (vdbe) run a sibling-CTE FROM source on the VDBE (B5b-1)
  • (vdbe) resolve a GROUP BY output-alias on the VDBE (B5b-1)
  • (vdbe) run SELECT DISTINCT over a grouped query on the VDBE (B5b-1)
  • (vdbe) run a computed (non-column) GROUP BY key on the VDBE (B5b-1)
  • (vdbe) fold compound-bodied non-correlated subqueries (B5c-1)
  • (vdbe) fold nested non-correlated subqueries (B5c-1)
  • (vdbe) run a window over a VALUES derived/CTE source on the VDBE
  • (vdbe) run a window function over a CTE source on the VDBE
  • (vdbe) run a window function over a derived subquery on the VDBE
  • (vdbe) run a nested derived-table source on the VDBE
  • (vdbe) run a compound SELECT with CTEs on the VDBE
  • (vdbe) run a CTE FROM-source on the VDBE
  • (vdbe) run a constant/VALUES subquery source on the VDBE
  • (vdbe) track the min/max companion row for bare columns
  • (vdbe) represent bare columns on the general grouped path
  • (vdbe) emit a first-row representative for a bare column in grouped output
  • (vdbe) run two-argument group_concat/string_agg on the VDBE
  • (vdbe) run printf/format on the VDBE
  • (vdbe) run text LIKE pattern ESCAPE c on the VDBE

Documentation

  • record empirically-mapped name-resolution precedence for A-misc-1
  • clear done A-misc-2, sharpen A-misc-1 with clause-order precedence
  • collapse completed Track A/B narrative, expand remaining open work
  • note ALTER TABLE + cross-object propagation in the README
  • bump focused-suite count to 360+ in README status line
  • record printf '!' high-precision float-decode gap in ROADMAP

Fixed

  • (vdbe) walk a no-WHERE covering-index scan in key order
  • (vdbe) walk a multi-value IN seek in index-key order
  • (vdbe) walk secondary-index seeks in key order by deferring to the tree-walker
  • (eqp) never emit a LAST 0 TERMS temp-btree node
  • (eqp) decline EXPLAIN QUERY PLAN of a derived table joined to another source
  • (eqp) render CO-ROUTINE for an aliased constant-row derived table
  • (exec) reject a FROM-less wildcard projection at prepare time
  • (pragma) empty result for argumentless introspection PRAGMAs
  • (cli) print rows for the =arg form of query PRAGMAs
  • (exec) catch unresolved columns in correlated subquery bodies at prepare (A-prepare-correlated)
  • (exec) keep same-named columns from different databases distinct under *
  • (parser) accept a postfix COLLATE after a closed IN (…) construct
  • (exec) error on unrecognized pragma table-valued sources
  • (exec) reject positional GROUP BY resolving to an aggregate column
  • (exec) resolve signed/wrapped positional ORDER BY / GROUP BY ordinals
  • (vdbe) defer SELECT DISTINCT with an explicit COLLATE projection
  • (vdbe) defer min/max with an explicit COLLATE arg to the tree-walker
  • (vdbe) defer DISTINCT aggregate with an explicit COLLATE arg
  • (alter) keep a foreign key's parent column intact on RENAME COLUMN
  • (alter) rewrite renamed table in trigger WHEN guard and body subqueries
  • (eval) coerce a blob to a number via its bytes-as-text
  • (value) compare integers exactly, not through f64 (precision loss above 2^53)
  • (func) sum() result type follows numeric affinity, not storage class
  • (vdbe) defer negative/wrapped ORDER BY ordinals to the tree-walker
  • (vdbe) order GROUP BY output by the grouping keys
  • (alter) rename INSERT-INTO target in a trigger body on RENAME TABLE
  • (window) order grouped+windowed rows by the window like SQLite

v0.0.12

Choose a tag to compare

@MagicalTux MagicalTux released this 28 Jun 05:50
82e4f3a

Added

  • (exec) resolve forward CTE references and reject true cycles by entry point
  • (exec) validate the database qualifier on REINDEX schema.name
  • (exec) forbid ALTER/DROP/CREATE INDEX on internal sqlite_ tables
  • (exec) report circular reference for anchorless recursive CTE
  • (cli) report the result row of a PRAGMA journal_mode setter
  • (exec) name a *-expansion self-join ambiguity by its source origin
  • (exec) reject a window function nested in another window's definition
  • (exec) match sqlite's message for a non-TVF name called in FROM
  • (exec) match sqlite's VALUES vs operator message on compound arity mismatch
  • (exec) reject IN-list element arity mismatch at prepare time
  • (exec) reject row-value misuse at prepare time
  • (exec) reject a multi-column scalar subquery at prepare time
  • (exec) reject IN-subquery column-count mismatch at prepare time
  • (exec) reject unknown/wrong-arity functions in DELETE/UPDATE clauses
  • (exec) report an unknown windowed function as "no such function"
  • (exec) validate columns over a single derived-table FROM at prepare time
  • (pragma) round-trip automatic_index and cell_size_check
  • (pragma) honor PRAGMA ignore_check_constraints
  • (pragma) enforce PRAGMA query_only as read-only mode
  • (pragma) honor PRAGMA case_sensitive_like for LIKE
  • (parser) accept WITH before any INSERT source, not just INSERT … SELECT
  • (window) allow any constant expression as a frame offset
  • (exec) reject CREATE TRIGGER on a system table
  • (exec) re-apply the non-generated-column rule after DROP COLUMN
  • (exec) reject aggregate/window functions in CREATE INDEX
  • (exec) reject a qualified DML target in a trigger body
  • (exec) skip an unreferenced WITH CTE on UPDATE/DELETE
  • (exec) support an UPDATE/DELETE target table alias (... AS x)
  • (exec) detect foreign key mismatch like sqlite
  • (cte) reject a recursive CTE that self-joins its recursive table
  • (dml) honor INDEXED BY / NOT INDEXED on UPDATE and DELETE
  • (exec) validate three-part column qualifiers in UPSERT clauses
  • (exec) validate three-part column qualifiers in UPDATE/DELETE
  • (exec) validate three-part schema.table.column column qualifiers
  • (json) json_each/json_tree accept a JSONB blob document
  • (json) expose hidden json/root columns on json_each and json_tree
  • (json) preserve escaped object-key provenance through JSONB and text
  • (json) preserve JSON5 string escapes via the TEXT5 JSONB tag
  • (json) preserve standard-JSON string escapes verbatim in text and JSONB
  • (func) implement sqlite_source_id()
  • (eqp) render SCAN CONSTANT ROW for a FROM-less SELECT
  • (exec) accept rowid/rowid/oid as an INSERT target column
  • (parser) report premature end-of-input as "incomplete input"
  • (exec) reject FILTER on a non-aggregate function at prepare time
  • (exec) reject aggregate misuse in ORDER BY and join ON at prepare time
  • (exec) reject window-function misuse at prepare time
  • (exec) reject aggregate-in-WHERE misuse at prepare time
  • (exec) validate UPSERT column references against the target table

Documentation

  • note SQLite-compatible prepare-time diagnostics in README
  • bump differential test-suite count to 260+
  • record JSON string-escape provenance as a remaining Track A item
  • prune completed items from ROADMAP and expand what remains

Fixed

  • (window) honor key collation in PARTITION BY / ORDER BY
  • (window) emit rows in window order when no outer ORDER BY
  • (printf) round %e mantissa half away from zero like SQLite
  • (index) name the column in WITHOUT ROWID secondary-index UNIQUE errors
  • (index) reject CREATE UNIQUE INDEX over existing duplicate rows
  • (json) json_quote(X) renders a JSONB blob as its JSON text
  • (exec) RENAME COLUMN rewrites trigger refs inside WHEN/body subqueries
  • (exec) rewrite view subquery refs on RENAME COLUMN
  • (exec) sequence PRIMARY KEY validation so a duplicate PK outranks a generated-column PK error
  • (exec) echo the written qualifier in the ambiguous-column-name message
  • (parser) reject ALL/DISTINCT in operand position, accept ALL in aggregates
  • (exec) resolve a SELECT-output alias inside an ORDER BY expression
  • (exec) treat an aggregate in a window OVER spec as a single group
  • (exec) resolve generated-column forward refs and reject cycles at CREATE
  • (trigger) resolve a FROM-less SELECT step when the trigger fires
  • (trigger) police the full trigger-step grammar inside a body
  • (trigger) defer body ORDER BY/LIMIT error behind target resolution
  • (exec) resolve LIMIT/OFFSET in an empty column scope at prepare time
  • (exec) resolve functions and aggregate misuse nested in row values and COLLATE
  • (exec) resolve unknown and wrong-arity scalar functions at prepare time
  • (exec) reject an aggregate or window function inside a FILTER predicate
  • (exec) reject min()/max() with zero arguments at prepare time
  • (exec) reject aggregate/window function in DELETE/UPDATE RETURNING
  • (window) reject a window-only function used without OVER at prepare time
  • (parser) name the clause when ORDER BY/LIMIT precedes a compound op
  • (update) reject ORDER BY without LIMIT on UPDATE/DELETE
  • (trigger) schema-qualify a trigger body's missing-table error
  • (ddl) order CREATE TABLE validation like sqlite's schema-build pass
  • (exec) arity-check aggregates used as window functions
  • (exec) validate aggregate arity at prepare time
  • (exec) reject a nested aggregate or window in an aggregate argument at prepare time
  • (func) validate likelihood() at prepare time, not per row
  • (cte) do not analyze an unreferenced WITH CTE
  • (json) match sqlite arity for json_set/insert/replace family
  • (parser) reject a reserved keyword in table-option position
  • (exec) a * argument is valid only for count()
  • (exec) reject a scalar function used as a window function
  • (parser) report window frame-bound errors with sqlite's two messages
  • (exec) order partial-index WHERE subquery/non-determinism errors like sqlite
  • (parser) accept an optional transaction name in BEGIN/COMMIT/END
  • (parser) reject SQLite's reserved keywords as bare names
  • (dml) reject ON CONFLICT targets that match no PK/UNIQUE constraint
  • (ddl) resolve CHECK/generated/index functions at CREATE
  • (ddl) resolve CHECK/generated-column functions at CREATE
  • (pragma) report PRAGMA journal_size_limit getter
  • (exec) reject RAISE() used outside a trigger program
  • (vacuum) match SQLite's VACUUM INTO existing-file message
  • (parser) OFFSET is not a reserved keyword outside LIMIT
  • (cli) run each command-line argument as its own SQL batch
  • (alter) wrap a RENAME COLUMN name collision like sqlite
  • (exec) keep the schema qualifier when a known database is missing the object
  • (exec) report an unknown database qualifier on a table reference as a missing object
  • (json) render a JSON5 dot-form number with the minimal zero, not the float
  • (json) reject a JSON number with a leading-zero integer part
  • (json) preserve verbatim text of an f64-overflowing JSON number
  • (pragma) report notnull=1 for WITHOUT ROWID primary-key columns
  • (lexer) report an over-64-bit hex literal as "hex literal too big"
  • (eval) the LIKE ESCAPE character is never a wildcard
  • (parser) desugar iif()/if() to CASE for multi-branch + short-circuit
  • (exec) name the existing object's kind in a CREATE collision
  • (parser) report unknown table options like SQLite
  • (eval) hint at a string literal for an unresolved double-quoted column
  • (parser) reject ORDER BY/LIMIT after a VALUES query core
  • (eval) report "row value misused" for vector comparison operands
  • (alter) ADD COLUMN inserts before trailing table constraints
  • (schema) canonicalise schema-qualified, TEMP and CTAS stored sql
  • (schema) canonicalise sqlite_schema.sql like sqlite
  • (json) quote non-simple keys in json_each/json_tree fullkey/path
  • (json) number json_each/json_tree id by JSONB byte offset
  • (cli) a ;-truncated statement is a syntax error, not "incomplete input"
  • (parser) reject AUTOINCREMENT outside a column PRIMARY KEY
  • (pragma) parse user_version/application_id value as an integer token
  • (pragma) return empty for index_info/foreign_key_list on an unknown object
  • (exec) reject a CREATE VIEW column-count mismatch on use
  • (alter) match sqlite's DROP COLUMN refusal rules and messages
  • (exec) reject a missing column in GROUP BY/HAVING/ORDER BY clauses
  • (eval) reject a scalar IN (SELECT …) with the wrong column count
  • (func) emit a trailing % in printf/format literally
  • (json) -> and ->> reject a malformed text document
  • (window) RANGE offset frame requires exactly one ORDER BY expression
  • (json) json_each/json_tree reject >2 args and accept zero args
  • (tokenizer) report lexing failures as unrecognized token: "X"
  • (parser) report syntax errors as near "TOKEN": syntax error
  • (vdbe) reject non-integer LIMIT/OFFSET on the table-scan path
  • (exec) use sqlite's nested-aggregate misuse wording

Testing

  • drop a build-divergent LIKE-trailing-escape query from the oracle list
  • gate UPDATE/DELETE ORDER BY LIMIT diffs on the update/delete-limit extension

v0.0.11

Choose a tag to compare

@MagicalTux MagicalTux released this 27 Jun 03:46
5706ab4

Added

  • (exec) reserve the sqlite_ object-name prefix for internal use
  • (vdbe) run N-table LEFT/INNER join chains on the VDBE

Documentation

  • note DELETE/UPDATE eager column resolution in ROADMAP
  • record eager-resolution coverage (ON, star qualifier, qualified GROUP/ORDER refs)

Fixed

  • (func) substr(X, NULL [, ...]) returns NULL for a NULL start
  • (func) trim/ltrim/rtrim return NULL for a NULL trim-set
  • (exec) don't panic on rowid overflow at the i64::MAX boundary
  • (exec) silently ignore an unrecognized PRAGMA name
  • (exec) reject duplicate CTE names within one WITH clause
  • (exec) a row value in a scalar context reports "row value misused"
  • (exec) window function in WHERE/HAVING reports "misuse of window function"
  • (exec) reject aggregate functions in the GROUP BY clause
  • (exec) string_agg requires its separator; recognize JSON group aggregates
  • (exec) count() with no arguments behaves as count(*)
  • (exec) report "DISTINCT aggregates must have exactly one argument"
  • (func) validate the likelihood() probability argument
  • (datetime) strftime defaults to 'now' and coerces a non-text format
  • (json) json_remove with a NULL path returns NULL
  • (json) coerce non-text JSON paths to text and short-circuit NULL paths
  • (exec) quote the table name in the multiple-primary-key error
  • (parser) UPDATE SET tuple-width mismatch uses sqlite's wording
  • (exec) match sqlite's INSERT column-resolution error messages
  • (exec) resolve DELETE/UPDATE WHERE and SET-value columns eagerly
  • (exec) eagerly resolve qualified refs in GROUP BY / HAVING / ORDER BY
  • (exec) reject a star whose table qualifier names no FROM source
  • (exec) extend eager column resolution to join ON predicates
  • (exec) resolve column references eagerly so a missing column errors on an empty result