Poking around in the grammar at `src/parse.y`, I find the entry for `CAST` as follows: ``` expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. { A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1); sqlite3ExprAttachSubtrees(pParse->db, A, E, 0); } ``` and looking for `typetoken` in the same file, there is this illuminating comment: ``` // A typetoken is really zero or more tokens that form a type name such // as can be found after the column name in a CREATE TABLE statement. // Multiple tokens are concatenated to form the value of the typetoken. ``` To emphasise, **zero or more tokens**. This makes good sense in the context of `CREATE TABLE`, less so in the case of a `CAST` expression. I conjecture that this inadvertently legalised a `CAST` expression with no type designation. It certainly appears to be undocumented. Perhaps the grammar should be tightened to disallow this; but if that cannot (or should not) be done for the sake of backward compatibility, I think it ought to remain undocumented, so as not to trick users into relying on it. Or, it could be documented, with a caveat that the resulting behaviour is undefined. (It seems to cast to numeric at the moment.) In either case, I think it had better be kept out of the syntax diagram. Just my three cents' worth – inflation, y´know.