Commit d5d8d50
docs(spec,drivers,service-analytics):
* docs(drivers,service-analytics): CAST(col AS BLOB) LIKE returning nothing is a compile-option behaviour, not a SQLite fact
Both headers rejected `CAST(col AS BLOB) LIKE ?` as a portable case-exact
construct on the strength of one universal claim: that it "was measured to
return NOTHING at all" on SQLite. That claim is false as stated. Whether LIKE
is false for a BLOB operand is fixed when SQLite is COMPILED, by
SQLITE_LIKE_DOESNT_MATCH_BLOBS, and the two SQLite builds this repo ships
disagree about it.
Measured here over the shared FILTER_TEXT_ROWS fixture, with
{ name: { $contains: 'acme' } } compiled to that construct:
better-sqlite3 13.0.3 (SQLite 3.53.4, flag compiled in) -> []
sql.js 1.14.1 (SQLite 3.49.1, flag absent) -> ['1','2']
Neither file's conclusion changes: both still reject the construct, and the
rejection is now stronger rather than merely hedged. A construct that means
two different things on the two builds this repo ships is disqualifying for a
read scope on its own, without needing any particular return value at all --
one build silently answers nothing, the other silently answers exactly the
ASCII over-fold the change was made to end. GLOB, which both files chose
instead, answers ['2'] on both builds.
Comment text only: no behaviour change, no exported surface, and no emitted
JS or .d.ts difference (the driver-side block documents a module-private
function; the analytics one is a file header).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XpTx2tbq3pZRYAdoGt6E6Y
* docs(drivers,service-analytics): CAST(col AS BLOB) LIKE returning nothing is a compile-option behaviour, not a SQLite fact
Both headers rejected `CAST(col AS BLOB) LIKE ?` as a portable case-exact
construct on the strength of one universal claim: that it "was measured to
return NOTHING at all" on SQLite. That claim is false as stated. Whether LIKE
is false for a BLOB operand is fixed when SQLite is COMPILED, by
SQLITE_LIKE_DOESNT_MATCH_BLOBS, and the two SQLite builds this repo ships
disagree about it.
Measured here over the shared FILTER_TEXT_ROWS fixture, with
{ name: { $contains: 'acme' } } compiled to that construct:
better-sqlite3 13.0.3 (SQLite 3.53.4, flag compiled in) -> []
sql.js 1.14.1 (SQLite 3.49.1, flag absent) -> ['1','2']
Neither file's conclusion changes: both still reject the construct, and the
rejection is now stronger rather than merely hedged. A construct that means
two different things on the two builds this repo ships is disqualifying for a
read scope on its own, without needing any particular return value at all --
one build silently answers nothing, the other silently answers exactly the
ASCII over-fold the change was made to end. GLOB, which both files chose
instead, answers ['2'] on both builds.
Comment text only: no behaviour change, no exported surface, and no emitted
JS or .d.ts difference (the driver-side block documents a module-private
function; the analytics one is a file header).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XpTx2tbq3pZRYAdoGt6E6Y
* docs(spec,driver-turso): correct the same compile-option claim in the two remaining carriers
The false sentence had FOUR carriers in the tree, not the two originally
identified. `git log -S` dates them to one origin:
3172831 2026-08-08 planted it in sql-driver.ts AND remote-transport.ts
in the same commit
d063a96 2026-08-11 copied it into packages/spec/src/data/filter.zod.ts
54bb2f1 2026-09-05 copied it into service-analytics/text-match-sql.ts
One origin, four carriers, four weeks. Correcting only some of them is worse
than correcting none: a reader trusts the uncorrected copy precisely because
of where it sits, and packages/spec is the contract layer -- it outranks the
driver layer as an authority.
Both remaining headers now name SQLITE_LIKE_DOESNT_MATCH_BLOBS, carry the two
shipped builds' divergent readings, and let the divergence carry the
rejection rather than any claim about return values. Neither conclusion is
weakened: both still reject the construct and choose GLOB.
The spec header is where this bites hardest, and it already said so without
knowing it: three of the five backends it lists are SQLite underneath, and
those are NOT the same build -- driver-sql runs better-sqlite3 (flag compiled
in) and driver-sqlite-wasm runs sql.js (flag absent). The two measured rows
ARE two of the three it enumerates.
Two readings added to all four headers so the remedy's stability is measured
rather than asserted:
typeof CAST(name AS BLOB) is 'blob' on BOTH builds -- the CAST is not the
part that differs; LIKE's blob rule is the compile-time half
GLOB answers ['2'] on BOTH builds -- stable across exactly the axis that
disqualifies the rejected construct
Comment text only; no behaviour, no exported surface.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XpTx2tbq3pZRYAdoGt6E6Y
* docs(changeset): the four-carrier CAST AS BLOB correction ships in published typings, so it is not skip-changeset
Measured on the built tree rather than assumed: the corrected text reaches
packages/spec/dist/filter.zod-*.d.ts and .d.mts, and driver-turso's
dist/index.d.ts, index.d.mts, index.js and index.mjs. @objectstack/spec also
publishes the edited source file itself through its src/**/*.zod.ts files
entry. Two packages therefore ship changed declarations, which is a release,
so the earlier skip-changeset judgement -- correct while the change was
confined to a module-private function and a file header -- does not survive
the widened set.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XpTx2tbq3pZRYAdoGt6E6Y
---------
Co-authored-by: Claude <noreply@anthropic.com>CAST(col AS BLOB) LIKE returning nothing is a compile-option behaviour, not a SQLite fact (#16113)1 parent 7d7ca6c commit d5d8d50
5 files changed
Lines changed: 86 additions & 12 deletions
File tree
- .changeset
- packages
- drivers
- driver-sql/src
- driver-turso/src
- services/service-analytics/src
- spec/src/data
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2864 | 2864 | | |
2865 | 2865 | | |
2866 | 2866 | | |
2867 | | - | |
2868 | | - | |
2869 | | - | |
2870 | | - | |
| 2867 | + | |
| 2868 | + | |
| 2869 | + | |
| 2870 | + | |
| 2871 | + | |
| 2872 | + | |
| 2873 | + | |
| 2874 | + | |
| 2875 | + | |
| 2876 | + | |
| 2877 | + | |
| 2878 | + | |
| 2879 | + | |
| 2880 | + | |
| 2881 | + | |
| 2882 | + | |
| 2883 | + | |
| 2884 | + | |
| 2885 | + | |
| 2886 | + | |
| 2887 | + | |
| 2888 | + | |
| 2889 | + | |
| 2890 | + | |
| 2891 | + | |
| 2892 | + | |
2871 | 2893 | | |
2872 | 2894 | | |
2873 | 2895 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3036 | 3036 | | |
3037 | 3037 | | |
3038 | 3038 | | |
3039 | | - | |
| 3039 | + | |
| 3040 | + | |
| 3041 | + | |
| 3042 | + | |
| 3043 | + | |
| 3044 | + | |
| 3045 | + | |
| 3046 | + | |
| 3047 | + | |
| 3048 | + | |
| 3049 | + | |
| 3050 | + | |
| 3051 | + | |
| 3052 | + | |
3040 | 3053 | | |
3041 | 3054 | | |
3042 | 3055 | | |
| |||
Lines changed: 10 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
35 | | - | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
36 | 44 | | |
37 | 45 | | |
38 | 46 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1082 | 1082 | | |
1083 | 1083 | | |
1084 | 1084 | | |
1085 | | - | |
1086 | | - | |
1087 | | - | |
1088 | | - | |
1089 | | - | |
| 1085 | + | |
| 1086 | + | |
| 1087 | + | |
| 1088 | + | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
| 1092 | + | |
| 1093 | + | |
| 1094 | + | |
| 1095 | + | |
| 1096 | + | |
| 1097 | + | |
| 1098 | + | |
| 1099 | + | |
| 1100 | + | |
| 1101 | + | |
| 1102 | + | |
| 1103 | + | |
| 1104 | + | |
| 1105 | + | |
| 1106 | + | |
1090 | 1107 | | |
1091 | 1108 | | |
1092 | 1109 | | |
| |||
0 commit comments