You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
import{DatabaseSync}from'node:sqlite';constdb=newDatabaseSync(':memory:');db.createModule('m',{columns: [{name: 'value',type: 'INTEGER'},{name: 'a',type: 'INTEGER',hidden: true},],*rows(a){if(a!==null)yield[a];},});db.exec('CREATE TABLE t (a INTEGER)');db.exec('INSERT INTO t VALUES (1), (2), (3)');console.log(db.prepare('SELECT DISTINCT * FROM m(t.a) JOIN t ON t.a = m.a').all());
How often does it reproduce? Is there a required condition?
Always
What is the expected behavior? Why is that the expected behavior?
Per SQLite's Enforcing Required Parameters On Table-Valued Functions, xBestIndex() must return SQLITE_CONSTRAINT when a parameter has an EQ constraint whose usable flag is false, so the planner picks an ordering where the parameter is available. Cost estimates alone cannot enforce parameter dependencies.
What do you see instead?
rows() is called with null and the query returns []. xBestIndex() skips constraints with usable == false, accepts the unconstrained plan, and xFilter() passes Null(isolate).
Activity
sqlite: reject plans with unusable virtual table parameters
sqlite: reject plans with unusable virtual table parameters
sqlite: reject plans with unusable virtual table parameters