{"record":{"id":"28aef8762580b4b1","repo":"litedb-org/LiteDB","slug":"0-28aef8","errorCode":"0","errorMessage":"Collection $query(sql) requires `sql` string parameter","messagePattern":"Collection \\$query\\(sql\\) requires `sql` string parameter","errorType":"exception","errorClass":"LiteException","httpStatus":null,"severity":"error","filePath":"LiteDB/Engine/SystemCollections/SysQuery.cs","lineNumber":24,"sourceCode":"using static LiteDB.Constants;\n\nnamespace LiteDB.Engine\n{\n    /// <summary>\n    /// This class implement $query experimental system function to run sub-queries. It's experimental only - possible not be present in final release\n    /// </summary>\n    internal class SysQuery : SystemCollection\n    {\n        private readonly ILiteEngine _engine;\n\n        public SysQuery(ILiteEngine engine) : base(\"$query\")\n        {\n            _engine = engine; \n        }\n\n        public override IEnumerable<BsonDocument> Input(BsonValue options)\n        {\n            var query = options?.AsString ?? throw new LiteException(0, $\"Collection $query(sql) requires `sql` string parameter\");\n\n            var sql = new SqlParser(_engine, new Tokenizer(query), null);\n\n            using (var reader = sql.Execute())\n            {\n                while(reader.Read())\n                {\n                    var value = reader.Current;\n\n                    yield return value.IsDocument ? value.AsDocument : new BsonDocument { [\"expr\"] = value };\n                }\n            }\n        }\n    }\n}","sourceCodeStart":6,"sourceCodeEnd":39,"githubUrl":"https://github.com/litedb-org/LiteDB/blob/f906a5f850678719e39a39a006cb66dcae563cfa/LiteDB/Engine/SystemCollections/SysQuery.cs#L6-L39","documentation":"Thrown by SysQuery.Input when the $query system collection is used without a SQL string argument. options?.AsString returns null when options is null or not a string, so the entire $query(...) call must be a single SQL string literal.","triggerScenarios":"SELECT * FROM $query() with no SQL; $query({ sql:'SELECT...' }) as a document (wrong shape); $query(null); passing a non-string BsonValue.","commonSituations":"Trying to parameterize $query with a document instead of a plain string; building the call dynamically and passing an empty/null expression; confusing $query with a function that takes options.","solutions":["Pass a SQL string: SELECT * FROM $query('SELECT * FROM items WHERE price > 10').","When building dynamically, ensure the interpolated argument is a quoted string literal.","Use parameterized application-side SqlParser execution instead of $query for dynamic SQL."],"exampleFix":"// before\ndb.Execute(\"SELECT * FROM $query()\"); // throws\n\n// after\ndb.Execute(\"SELECT * FROM $query('SELECT * FROM items WHERE active = true')\");","handlingStrategy":"validation","validationCode":"if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentException(\"$query requires a SQL string\");\ndb.Execute($\"SELECT * FROM $query('{sql.Replace(\"'\", \"''\")}')\");","typeGuard":null,"tryCatchPattern":"try { db.Execute(\"SELECT * FROM $query(...)\"); }\ncatch (LiteException ex) when (ex.Message.Contains(\"requires `sql` string parameter\")) {\n    // supply a non-empty SQL string\n}","preventionTips":["Pass $query a single quoted SQL string literal.","For dynamic SQL, run SqlParser directly instead of $query."],"tags":["system-collections","sql","query","validation"],"backgroundTag":null,"analyzedSha":"f906a5f850678719e39a39a006cb66dcae563cfa","analyzedAt":"2026-08-13T21:56:30.148Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}