sqlite_master in DoltLite is a projection over the prolly catalog, not a
stored table. SQLite keeps the schema as ordinary rows in a b-tree that
writable_schema can edit directly; DoltLite keeps a content-addressed catalog
and renders sqlite_master from it. Anything that depends on the schema being a
concrete, mutable row store diverges.
Measured on db9e3e9d86 against stock SQLite.
A catalog row that is not a valid entry is ignored, not refused
CREATE TABLE t(a);
PRAGMA writable_schema=1;
INSERT INTO sqlite_master VALUES(NULL,NULL,NULL,NULL,NULL);
-- reopen
SELECT count(*) FROM t; PRAGMA integrity_check;
DoltLite: 0 ok
stock: Error: malformed database schema (?)
The all-NULL row never becomes a catalog entry, so schema load skips it and
integrity_check sees a self-consistent store. Stock refuses to open. Gated as
capi3c-8.3, capi3-8.3.
PK-clustered tables have no sqlite_autoindex row
CREATE TABLE t(a TEXT PRIMARY KEY, b);
SELECT count(*) FROM sqlite_master WHERE name LIKE 'sqlite_autoindex%';
There is no separate index structure to name: the primary key is the storage
order. This one is a consequence of PK keying rather than of the projection, so
those gates cite #1840.
Row order is canonical, not creation order
Schema commits adopt the canonical catalog (#1596, landed in #1616), so
sqlite_master enumerates in canonical order and oids are reassigned. Tests that
bind oids or assert creation-order enumeration diverge. Note #1596 is closed, so
the ~110 gates whose reason reads "canonical adoption: sqlite_master row order
after schema commit" currently point either at #1200 (57 of them, as
engine-gap) or at nothing. #1200 is about schema SQL text canonicalisation,
which is a different thing from row order — worth re-checking whether those 57
belong here instead.
Things that do NOT diverge, checked so they are not assumed
These behave identically to stock and should not be attributed here:
rootpage values for an ordinary schema: both report t|2 i|3
- poking
rootpage to a bogus value: both refuse at reload with
malformed database schema (t) - invalid rootpage
- rewriting an index's SQL under
writable_schema: both report
row 1 missing from index i
So the ~10 gates whose reason mentions rootpage numbering are left unattributed
rather than swept in — their assertions are more elaborate than the shapes above
and need reproducing individually before anything is claimed about them.
Why this issue exists
The class was previously unattributed, and four of its gates had been pulled into
#1846 (PRAGMA no-ops) by a keyword match on writable_schema — which is merely
how those tests reach the catalog, not why they diverge. Two of them describe
DoltLite being stricter than stock, which a no-op issue actively misdescribes.
sqlite_masterin DoltLite is a projection over the prolly catalog, not astored table. SQLite keeps the schema as ordinary rows in a b-tree that
writable_schemacan edit directly; DoltLite keeps a content-addressed catalogand renders
sqlite_masterfrom it. Anything that depends on the schema being aconcrete, mutable row store diverges.
Measured on
db9e3e9d86against stock SQLite.A catalog row that is not a valid entry is ignored, not refused
The all-NULL row never becomes a catalog entry, so schema load skips it and
integrity_checksees a self-consistent store. Stock refuses to open. Gated ascapi3c-8.3,capi3-8.3.PK-clustered tables have no
sqlite_autoindexrowThere is no separate index structure to name: the primary key is the storage
order. This one is a consequence of PK keying rather than of the projection, so
those gates cite #1840.
Row order is canonical, not creation order
Schema commits adopt the canonical catalog (#1596, landed in #1616), so
sqlite_masterenumerates in canonical order and oids are reassigned. Tests thatbind oids or assert creation-order enumeration diverge. Note #1596 is closed, so
the ~110 gates whose reason reads "canonical adoption: sqlite_master row order
after schema commit" currently point either at #1200 (57 of them, as
engine-gap) or at nothing. #1200 is about schema SQL text canonicalisation,which is a different thing from row order — worth re-checking whether those 57
belong here instead.
Things that do NOT diverge, checked so they are not assumed
These behave identically to stock and should not be attributed here:
rootpagevalues for an ordinary schema: both reportt|2 i|3rootpageto a bogus value: both refuse at reload withmalformed database schema (t) - invalid rootpagewritable_schema: both reportrow 1 missing from index iSo the ~10 gates whose reason mentions rootpage numbering are left unattributed
rather than swept in — their assertions are more elaborate than the shapes above
and need reproducing individually before anything is claimed about them.
Why this issue exists
The class was previously unattributed, and four of its gates had been pulled into
#1846 (PRAGMA no-ops) by a keyword match on
writable_schema— which is merelyhow those tests reach the catalog, not why they diverge. Two of them describe
DoltLite being stricter than stock, which a no-op issue actively misdescribes.